在之前25.QT-模型视图章节中,没有具体描述如何重写model模型,所以本章以QabstractTableModel为例,来谈谈model如何实现. 1.QabstractTableModel常用功能 QAbstractTableModel子类化时,必须覆写: Int rowCount(); //返回显示的行数 int columnCount(); //返回显示的列数 Qvariant headerData 可编辑功能 如果不想实现QabstractTableModel可编辑功能, 则调用QTableView ->setEditTriggers(QAbstractItemView::NoEditTriggers ::data(index, Qt::EditRole)读取默认编辑值 //当我们编辑完成后, delegate会调用QAbstractTableModel :: setData (index, value ret; } return ret; } }; class CustomModel : public QAbstractTableModel { Q_OBJECT
#include <QAbstractTableModel> #include <QString> const int COLS= 3; const int ROWS= 2; class MyModel : public QAbstractTableModel { Q_OBJECT public: MyModel(QObject *parent); int rowCount(const QModelIndex &index) const { qDebug() << index.row() << index.column(); return Qt::ItemIsEditable | QAbstractTableModel : QMainWindow(parent) { tableView = new QTableView(this); setCentralWidget(tableView); QAbstractTableModel
d->show(); } } } TableModel #ifndef TABLEMODEL_H #define TABLEMODEL_H #include <QAbstractTableModel > class TableModel : public QAbstractTableModel { Q_OBJECT public: explicit TableModel(QObject }; #endif // TABLEMODEL_H #include "tablemodel.h" TableModel::TableModel(QObject *parent) : QAbstractTableModel && orientation == Qt::Horizontal) { return m_HorizontalHeader.at(section); } return QAbstractTableModel
(painter, option, index); } } TableModel类 #ifndef TABLEMODEL_H #define TABLEMODEL_H #include <QAbstractTableModel > class TableModel : public QAbstractTableModel { Q_OBJECT public: explicit TableModel(QObject }; #endif // TABLEMODEL_H #include "tablemodel.h" TableModel::TableModel(QObject *parent) : QAbstractTableModel && orientation == Qt::Horizontal) { return m_HorizontalHeader.at(section); } return QAbstractTableModel
我们有一个表数据集,因此让我们从QAbstractTableModel开始,因为它比更通用的QAbstractItemModel更加易于使用。 【译者注:以后会更加了解这两个类的】 mymodel.h 代码: #include <QAbstractTableModel> class MyModel : public QAbstractTableModel ; QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const Q_DECL_OVERRIDE; }; QAbstractTableModel mymodel.cpp 代码: #include "mymodel.h" MyModel::MyModel(QObject *parent) :QAbstractTableModel(parent
//currencymodel.h #ifndef CURRENCYMODEL_H #define CURRENCYMODEL_H #include <QAbstractTableModel> #include <QVariant> #include <QMap> class CurrencyModel:public QAbstractTableModel { public: CurrencyModel CURRENCYMODEL_H //currencymodel.cpp #include "currencymodel.h" CurrencyModel::CurrencyModel(QObject *parent):QAbstractTableModel
msg.exec(); } 好了自定义按钮处理完了 我们建一个Table添加一些数据 #ifndef TABLEMODEL_H #define TABLEMODEL_H #include <QAbstractTableModel > class TableModel : public QAbstractTableModel { Q_OBJECT public: explicit TableModel(QObject TABLEMODEL_H model的实现 并添加一些数据 #include "tablemodel.h" TableModel::TableModel(QObject *parent) : QAbstractTableModel && orientation == Qt::Horizontal) { return m_HorizontalHeader.at(section); } return QAbstractTableModel
//currencymodel.h #ifndef CURRENCYMODEL_H #define CURRENCYMODEL_H #include <QAbstractTableModel> #include <QVariant> #include <QMap> class CurrencyModel:public QAbstractTableModel { public: CurrencyModel CURRENCYMODEL_H //currencymodel.cpp #include "currencymodel.h" CurrencyModel::CurrencyModel(QObject *parent):QAbstractTableModel
如果把之前的QTableView改成QTreeView,我们在不改变Model的情况下可以直接得到一个没有结构层次的“树”;因为QAbstractTableModel不具有数据层次结构,如果我们想要实现有层次的数据结构 下面梳理下几个类的关系: QObject || QAbstractItemModel || QAbstractTableModel(Table层次结构) QStandardItemModel
TableModel是QAbstractTableModel的子类,它提供了访问数据的标准模型/视图API。它包含一个添加联系人列表。但是,这些数据在单个选项卡中并不都是可见的。 TableModel类通过子类化QAbstractTableModel来提供标准API来访问联系人列表中的数据。 class TableModel : public QAbstractTableModel { Q_OBJECT public: TableModel(QObject* parent = } TableModel::TableModel(const QVector<Contact> & contacts, QObject * parent /*= nullptr*/) :QAbstractTableModel index.isValid()) { return Qt::ItemIsEnabled; } return QAbstractTableModel::flags
TableModel是QAbstractTableModel的子类,它提供用于访问数据的标准模型/视图API。它包含已添加联系人的列表。但是,此数据在单个选项卡中并非全部可见。
当标准模型还无法满足需要时,可子类化QAbstractItemModel、QAbstractListModel或QAbstractTableModel来创建自定义的模型。 return app.exec(); } ---- 示例2: #include "weaponmodel.h" Weaponmodel::Weaponmodel(QObject* parent):QAbstractTableModel DisplayRole && orientation == Qt::Horizontal) { return header[section]; } return QAbstractTableModel
上次和大家分享了Qt Model/View只读表的方法,简单回顾下: 因为是为一个Table设置Model,为了快速入门,我们选择继承QAbstractTableModel。
QProgressBar, QHeaderView, QLabel ) from PySide6.QtCore import Qt, QThread, Signal, QObject, QTimer, QAbstractTableModel import QFont, QColor, QBrush # -------------------- 数据模型 -------------------- class StockTableModel(QAbstractTableModel
mapToGlobal(pos))进阶技巧:动态控件:通过setCellWidget()在表格单元格中嵌入按钮事件过滤:使用installEventFilter()处理特殊交互需求模型视图架构:对于大数据量,建议使用QAbstractTableModel 键盘输入失效检查是否在切换界面时未释放键盘焦点:QWidget.releaseKeyboard()图标显示异常确保使用绝对路径或资源系统:QIcon(":/images/icon.png")表格更新缓慢对大数据量使用QAbstractTableModel
QAbstractListModel:用来创建一维列表模型 QStandardItemModel:用来存储定制数据的通用模型 QAbstractTableModel: 用来创建二维列表模型 常用的视图类层次结构
pos)) 进阶技巧: 动态控件:通过setCellWidget()在表格单元格中嵌入按钮 事件过滤:使用installEventFilter()处理特殊交互需求 模型视图架构:对于大数据量,建议使用QAbstractTableModel 检查是否在切换界面时未释放键盘焦点:QWidget.releaseKeyboard() 图标显示异常 确保使用绝对路径或资源系统:QIcon(":/images/icon.png") 表格更新缓慢 对大数据量使用QAbstractTableModel
在之前60.QT-QabstractTableModel模型、重写sort方法排序章节中,学习了如何用model,本章再来学习QSortFilterProxyModel代理 1.
6.2 项目部署建议 使用 Qt Installer 打包项目 可集成 SQLite 数据库 通过资源文件(.qrc)统一管理图标和样式 七、进阶建议:提升你的 Qt 项目能力 使用 QAbstractTableModel
; //可以直接提交 QSqlRelationalTableModel->Inherits QSqlTableModel->Inherits QSqlQueryModel->Inherits QAbstractTableModel