- 浏览: 3449485 次
- 性别:
- 来自: 苏州
文章分类
最新评论
-
sonichy:
Qt5改动很多,要改改了。
基于QItemDelegate的例子1 SpinBoxDelegate -
我的主页6:
楼主,2.2子查询的分页方式:SELECT * FROM ar ...
Mysql 分页语句Limit用法 -
liguoqi:
非常感谢楼主的用心指导,工具以及图片例子都提供了 赞!
两款免费DCIOM 图像浏览软件介绍和DICOM图像例子供下载 -
liguoqi:
问下这个图片怎么解压损坏呀
两款免费DCIOM 图像浏览软件介绍和DICOM图像例子供下载 -
liguoqi:
楼主讲解的非常详细,还附带工具和图片例子,非常感谢
两款免费DCIOM 图像浏览软件介绍和DICOM图像例子供下载
目录:
(一) Qt Model/View 的简单说明 、预定义模型
(四)Qt实现自定义模型基于QAbstractTableModel
(五)Qt实现自定义模型基于QAbstractItemModel
Qt实现自定义模型基于QAbstractTableModel
两个例子
例子1代码
Main.cpp
#include <QtGui> #include "currencymodel.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); //数据源 QMap<QString, double> currencyMap; currencyMap.insert("AUD", 1.3259); currencyMap.insert("CHF", 1.2970); currencyMap.insert("CZK", 24.510); currencyMap.insert("DKK", 6.2168); currencyMap.insert("EUR", 0.8333); currencyMap.insert("GBP", 0.5661); currencyMap.insert("HKD", 7.7562); currencyMap.insert("JPY", 112.92); currencyMap.insert("NOK", 6.5200); currencyMap.insert("NZD", 1.4697); currencyMap.insert("SEK", 7.8180); currencyMap.insert("SGD", 1.6901); currencyMap.insert("USD", 1.0000); //自定义表模型 CurrencyModel currencyModel; currencyModel.setCurrencyMap(currencyMap); //表视图 QTableView tableView; //设置视图模型 tableView.setModel(¤cyModel); //设置交替颜色 tableView.setAlternatingRowColors(true); tableView.setWindowTitle(QObject::tr("Currencies")); tableView.show(); return app.exec(); }
currencymodel.h
#ifndef CURRENCYMODEL_H #define CURRENCYMODEL_H #include <QAbstractTableModel> #include <QMap> class CurrencyModel : public QAbstractTableModel { public: CurrencyModel(QObject *parent = 0); void setCurrencyMap(const QMap<QString, double> &map); int rowCount(const QModelIndex &parent) const; int columnCount(const QModelIndex &parent) const; QVariant data(const QModelIndex &index, int role) const; QVariant headerData(int section, Qt::Orientation orientation, int role) const; private: QString currencyAt(int offset) const; QMap<QString, double> currencyMap; }; #endif
currencymodel.cpp
#include <QtCore> #include "currencymodel.h" CurrencyModel::CurrencyModel(QObject *parent) : QAbstractTableModel(parent) { } void CurrencyModel::setCurrencyMap(const QMap<QString, double> &map) { currencyMap = map; //重置模型至原始状态,告诉所有视图,他们数据都无效,强制刷新数据 reset(); } //返回行数 int CurrencyModel::rowCount(const QModelIndex & /* parent */) const { return currencyMap.count(); } //返回列数 int CurrencyModel::columnCount(const QModelIndex & /* parent */) const { return currencyMap.count(); } //返回一个项的任意角色的值,这个项被指定为QModelIndex QVariant CurrencyModel::data(const QModelIndex &index, int role) const { if (!index.isValid()) return QVariant(); if (role == Qt::TextAlignmentRole) { return int(Qt::AlignRight | Qt::AlignVCenter); } else if (role == Qt::DisplayRole) { QString rowCurrency = currencyAt(index.row()); QString columnCurrency = currencyAt(index.column()); if (currencyMap.value(rowCurrency) == 0.0) return "####"; double amount = currencyMap.value(columnCurrency) / currencyMap.value(rowCurrency); return QString("%1").arg(amount, 0, 'f', 4); } return QVariant(); } //返回表头名称,(行号或列号,水平或垂直,角色) QVariant CurrencyModel::headerData(int section, Qt::Orientation /* orientation */, int role) const { if (role != Qt::DisplayRole) return QVariant(); return currencyAt(section); } //获取当前关键字 QString CurrencyModel::currencyAt(int offset) const { return (currencyMap.begin() + offset).key(); }
例子2代码
Main.cpp
#include <QApplication> #include <QHeaderView> #include <QTableView> #include "citymodel.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); //保存城市名 QStringList cities; cities << "Arvika" << "Boden" << "Eskilstuna" << "Falun" << "Filipstad" << "Halmstad" << "Helsingborg" << "Karlstad" << "Kiruna" << "Kramfors" << "Motala" << "Sandviken" << "Skara" << "Stockholm" << "Sundsvall" << "Trelleborg"; //模型 CityModel cityModel; // cityModel.setCities(cities); QTableView tableView; tableView.setModel(&cityModel); tableView.setAlternatingRowColors(true); tableView.setWindowTitle(QObject::tr("Cities")); tableView.show(); return app.exec(); }
citymodel.h
#ifndef CITYMODEL_H #define CITYMODEL_H #include <QAbstractTableModel> #include <QStringList> #include <QVector> class CityModel : public QAbstractTableModel { Q_OBJECT public: CityModel(QObject *parent = 0); void setCities(const QStringList &cityNames); int rowCount(const QModelIndex &parent) const; int columnCount(const QModelIndex &parent) const; QVariant data(const QModelIndex &index, int role) const; bool setData(const QModelIndex &index, const QVariant &value, int role); QVariant headerData(int section, Qt::Orientation orientation, int role) const; Qt::ItemFlags flags(const QModelIndex &index) const; private: int offsetOf(int row, int column) const; QStringList cities; QVector<int> distances; }; #endif
citymodel.cpp
#include <QtCore> #include "citymodel.h" CityModel::CityModel(QObject *parent) : QAbstractTableModel(parent) { } //设定一下数据源 void CityModel::setCities(const QStringList &cityNames) { cities = cityNames; //重新设置一下QVector distances的矩阵大小的,中间对角线为0不用存 distances.resize(cities.count() * (cities.count() - 1) / 2); //填充所有距离值为0 distances.fill(0); //刷新所有视图数据 reset(); } //模型行数 int CityModel::rowCount(const QModelIndex & /* parent */) const { return cities.count(); } //模型列数 int CityModel::columnCount(const QModelIndex & /* parent */) const { return cities.count(); } //赋值模型每个项的数据 QVariant CityModel::data(const QModelIndex &index, int role) const { if (!index.isValid()) return QVariant(); if (role == Qt::TextAlignmentRole) { return int(Qt::AlignRight | Qt::AlignVCenter); } else if (role == Qt::DisplayRole) { if (index.row() == index.column()) return 0; int offset = offsetOf(index.row(), index.column()); return distances[offset]; } return QVariant(); } //编辑一个项 bool CityModel::setData(const QModelIndex &index, const QVariant &value, int role) { if (index.isValid() && index.row() != index.column() && role == Qt::EditRole) { int offset = offsetOf(index.row(), index.column()); distances[offset] = value.toInt(); //交换对应项的模型索引 QModelIndex transposedIndex = createIndex(index.column(), index.row()); //某项发生改变,发射信号( between topLeft and bottomRight inclusive) emit dataChanged(index, index); emit dataChanged(transposedIndex, transposedIndex); return true; } return false; } //返回列表头 QVariant CityModel::headerData(int section, Qt::Orientation /* orientation */, int role) const { //返回在Cities字符串列表中给定偏移量的城市名称 if (role == Qt::DisplayRole) return cities[section]; return QVariant(); } //返回对一个项相关的操作的标识符(例如,是否可以编辑或者是否已选中等) Qt::ItemFlags CityModel::flags(const QModelIndex &index) const { Qt::ItemFlags flags = QAbstractItemModel::flags(index); if (index.row() != index.column()) flags |= Qt::ItemIsEditable; return flags; } //计算偏移量 int CityModel::offsetOf(int row, int column) const { if (row < column) qSwap(row, column); return (row * (row - 1) / 2) + column; }
发表评论
-
Qt官网变更【2012】
2012-09-21 19:30 4220Qt最近被Digia完全收购,诺基亚这两年的不理不睬,没有魄力 ... -
【转】QT实现不规则窗体
2012-09-21 18:50 5010看到好文章,收藏一下: 看到网上有很多不规则窗体的实现 ... -
Qt应用程序如何使用DCMTK类库进行二次开发DICOM数据传输
2012-09-13 09:35 0参考文章: 1、Using DCMTK with ... -
【转】将QT开发的界面程序封装成DLL,在VC中成功调用
2012-09-11 10:33 21136最近手头的一个项目需要做一个QT界面,并且封装成DLL,然后 ... -
诺基亚挥别Qt,转手给Digia
2012-09-11 09:37 2867一家总部位于芬兰的IT业务供应商Digia今天宣布,已经签署了 ... -
Qt多线程间信号槽传递非QObject类型对象的参数
2012-09-07 15:29 21405一、以前就发现过这个问题: 在Qt项目中,有时候为了 ... -
QT样式表(QStyleSheet)
2012-08-17 10:37 17910QT样式表 (QStyleSheet) 作者:刘旭晖 ... -
FinalData磁盘文件恢复工具(绿色破解版)
2012-08-02 13:28 8616FinalData磁盘文件恢复工具(绿色破解版),使用起来很方 ... -
Eclipse Qt开发环境的建立【转】
2012-08-01 11:15 44001.下载Eclipse目前Eclipse+CDT已经可以 ... -
汽车辐射监测系统-Qt开发
2012-07-25 16:18 4700最近晚上抽空忙了两个月,才把一个小系统做完。虽然做的不是太完 ... -
Qt做发布版,解决声音和图片、中文字体乱码问题
2012-07-14 16:02 4877Qt做发布版,解决声音和图片、中文字体乱码问题 ... -
QTableView使用中的疑问,如何及时显示操作Model后的结果?
2012-06-01 14:52 0最终的解决方法:我正 ... -
【转】Qt QTableview使用
2012-06-01 09:49 9683QTableWidget是QT程序中常用的显示数 ... -
QTableView双击 单机事件信号
2012-06-01 09:47 23140双击QTableView的行,获取该行数据 代码 ... -
QMessageBox改变大小
2012-05-31 15:33 8465创建一个QMessageBox: QMessageBo ... -
更新QTableView中的进度条状态
2012-05-30 14:37 14887前段时间,我接触了,如何在一个QTableView中加入一个控 ... -
QThread 线程暂停 停止功能的实现
2012-05-29 11:56 12223为了实现Qt中线程的暂停运行,和停止运行的控制功能 需要在设 ... -
QT环境变量
2012-05-28 18:53 5598不知道为啥同事有台电脑,装完Qt-VS2008库,和VS Ad ... -
广告光
2012-05-24 18:33 0盈创广告联盟 http://www.yo114.cn/ ... -
Test
2012-05-24 18:22 2195Test<IMG SRC="cf08e32c2 ...
相关推荐
在标题提到的"QT-QabstractTableModel模型、重写sort方法排序"中,我们关注的重点是如何利用`QAbstractTableModel`来实现自定义排序功能。`sort`方法是`QAbstractItemModel`的一部分,它允许对模型中的数据进行排序...
在本项目"QT自定义混合控件——基于View/Model/Delegate的QTableView/QTreewidget/Combobox实现"中,我们将深入探讨如何利用QT库中的核心组件构建一个强大的数据展示和交互界面。 首先,我们要理解View/Model/...
过滤后的文件信息(如路径、名称、大小等)可以存储在自定义模型中,随后更新到`QTableView`上。 ### 总结 通过以上步骤,我们可以构建一个具备自定义复选框功能的`QTableView`,并展示扫描到的特定类型文件。使用...
总结起来,"QTableView-MODEL VIEW 自定义模型实现"是一个关于如何在Qt环境中使用自定义数据模型驱动QTableView的教程或示例。通过自定义模型,开发者可以灵活地处理各种复杂的数据源,同时保持Qt的Model/View架构的...
本文将深入探讨如何自定义`QAbstractTableModel`以及如何使用`QSqlTableModel`,这两个都是Qt提供的重要数据模型类。我们将通过分析"qt 自定义tablemodel和使用sqlmodel的例子"中的`TableModelView.zip`和`...
在QT编程中,创建一个可拖拽...总的来说,实现QT中可拖拽排序的表格涉及多方面的技术,包括事件处理、数据模型操作、自定义视图以及样式设置。理解并掌握这些知识点,对于提升QT应用的用户体验和功能完整性至关重要。
1. 定义自定义模型类,继承自QAbstractTableModel或QStandardItemModel,实现数据的添加、更新和删除方法,并覆盖`data()`、`flags()`等方法以提供数据访问。 2. 创建视图(QTableView),设置相应的模型,并可能...
总结起来,QT5分页组件是通过自定义控件、信号与槽机制以及与数据模型的交互来实现的。它简化了大量数据的显示,并提供了良好的用户体验。通过学习和实践,开发者可以熟练掌握这一功能,提升应用程序的易用性。
2. **数据模型与视图**:在Qt中,数据通常通过数据模型(如QStandardItemModel或QAbstractTableModel)来管理,视图(如QTableView)则用于显示模型中的数据。课程表可能采用这种模式,将课程数据存储在一个模型中,...
`QAbstractTableModel`是Qt的一个核心组件,它允许我们自定义数据模型,从而可以方便地与QML进行数据交互。 首先,让我们了解`QAbstractTableModel`。它是`QAbstractItemModel`的一个子类,专门设计用于表格视图...
虽然QTableWidget提供了基本的排序功能,但若需要更复杂的数据结构和排序逻辑,可能需要创建自定义的QAbstractTableModel子类,重写`data()`, `headerData()`, `sort()`等方法。 6. **样式与显示**: 可以通过`...
在Qt框架中,QAbstractItemModel是用于构建自定义数据模型的核心类,它为QTableView、QTreeView和QListView等视图组件提供了数据接口。QAbstractModel的子类化是实现自定义数据模型的关键步骤,这允许我们创建适应...
开发者可能使用了QT的QAbstractTableModel或QSqlModel来创建自定义的数据模型。 2. 控制器:这部分代码负责处理用户输入,如点击按钮,以及更新视图和模型。这通常涉及到信号和槽机制,QT的一个关键特性,它使得对象...
- 创建一个继承自QAbstractTableModel的自定义模型类,实现必要的方法如rowCount()、columnCount()、data()等,以满足数据的读取需求。 - 在模型类中维护一个当前页的数据列表,以及总行数和每页行数的信息。 - ...
QTableView是QT中的一个关键组件,它用于展示表格数据,通常与QAbstractItemModel或QSqlTableModel等模型类配合使用。在QTableView中添加自定义元素,如按钮,可以实现更丰富的用户交互。 在QT中,要在QTableView的...
数据模型可以是自定义的`QAbstractTableModel`子类,或者使用`QStandardItemModel`。例如: ```cpp QStandardItemModel *model = new QStandardItemModel(this); tableView->setModel(model); ``` **翻页功能**:...
在QT中,我们可以利用QStandardItemModel或自定义的QAbstractTableModel子类来表示数据,并通过对话框让用户输入信息。 查询功能则需要提供多种查询条件,如书名、作者等。QT的QSortFilterProxyModel可以帮助我们...
对于自定义模型,你需要重写`QAbstractTableModel`的相关方法如`rowCount()`, `columnCount()`, `data()`, `headerData()`等。 **4. 显示列头** 如果需要显示列头,`QTableView`会自动从模型的`headerData()`方法...
在压缩包文件`CTableModelTest`中,可能包含了这个自定义模型类的源代码、测试用例或者其他相关资源,用于展示如何使用这个派生类。分析这些文件可以帮助深入理解该模型的实现细节和使用方式。 总之,开发一个`...