马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
一、模子/视图结构概述
- 根本原理:
- Qt 的模子/视图(Model/View)架构将数据的存储和体现分离,进步了代码的可维护性和复用性。
- 模子(Model):负责存储和管理数据,提供数据的访问接口,如获取数据、插入数据、修改数据、删除数据等。
- 视图(View):负责体现数据,不关心数据的存储和利用,只根据模子的数据举行体现。
- 署理(Delegate):负责在视图中渲染和编辑数据项,提供了一种机制来定制数据的体现和编辑方式,比方利用自界说的部件举行数据的编辑。
二、QAbstractItemModel 类
- 功能:
- 是全部项模子的抽象基类,界说了项模子必须实现的接口,如 rowCount、columnCount、data、setData 等,用于提供数据的存储和利用接口。
- 可以自界说继续自 QAbstractItemModel 的模子类,以满意差别的数据存储和利用需求。
三、QAbstractItemView 类
- 功能:
- 是全部项视图的抽象基类,提供了体现数据的通用接口,如 setModel 用于关联一个模子,视图会根据模子的数据举行体现和更新。
- 常见的派生类有 QListView、QTreeView、QTableView 等,分别用于列表、树状、表格情势的数据体现。
四、QStringListModel 类及示例步调功能实现
- 功能:
- 存储一个字符串列表,方便地用于 QListView 和 QComboBox 等视图的数据体现。
- #include <QApplication>
- #include <QListView>
- #include <QStringListModel>
- int main(int argc, char *argv[])
- {
- QApplication app(argc, argv);
- QStringListModel *model = new QStringListModel;
- QStringList stringList;
- stringList << "Item 1" << "Item 2" << "Item 3";
- model->setStringList(stringList);
- QListView *listView = new QListView;
- listView->setModel(model);
- listView->show();
- return app.exec();
- }
复制代码
- 代码表明:
- 创建一个 QStringListModel 并添加一些字符串元素。
- 创建一个 QListView 并将 QStringListModel 设置为其模子,QListView 将体现字符串列表中的元素。
五、自界说署理
- 自界说署理功能:
- 答应用户自界说数据在视图中的体现和编辑方式,比方利用自界说的部件举行数据的编辑,大概添加一些特定的体现效果。
六、QStyledItemDelegate 类及计划自界说署理类
- 功能:
- 提供了默认的数据项体现和编辑功能,可作为自界说署理的基类。
- #include <QApplication>
- #include <QListView>
- #include <QStyledItemDelegate>
- #include <QPainter>
- #include <QStyleOptionViewItem>
- class CustomDelegate : public QStyledItemDelegate
- {
- protected:
- void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override
- {
- QStyleOptionViewItem opt = option;
- initStyleOption(&opt, index);
- // 自定义绘制
- painter->save();
- painter->setPen(Qt::red);
- painter->drawText(opt.rect, Qt::AlignCenter, index.data().toString());
- painter->restore();
- }
- QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override
- {
- // 创建自定义编辑器
- QLineEdit *editor = new QLineEdit(parent);
- return editor;
- }
- void setEditorData(QWidget *editor, const QModelIndex &index) const override
- {
- QLineEdit *lineEdit = qobject_cast<QLineEdit*>(editor);
- if (lineEdit) {
- lineEdit->setText(index.data().toString());
- }
- }
- void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override
- {
- QLineEdit *lineEdit = qobject_cast<QLineEdit*>(editor);
- if (lineEdit) {
- model->setData(index, lineEdit->text());
- }
- }
- void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const override
- {
- editor->setGeometry(option.rect);
- }
- };
- int main(int argc, char *argv[])
- {
- QApplication app(argc, argv);
- QStringListModel *model = new QStringListModel;
- QStringList stringList;
- stringList << "Item 1" << "Item 2" << "Item 3";
- model->setStringList(stringList);
- QListView *listView = new QListView;
- listView->setModel(model);
- CustomDelegate *delegate = new CustomDelegate;
- listView->setItemDelegate(delegate);
- listView->show();
- return app.exec();
- }
复制代码
- 代码表明:
- 自界说 CustomDelegate 类,继续自 QStyledItemDelegate。
- paint 方法用于自界说数据项的绘制,这里将文本绘制为赤色。
- createEditor 方法创建自界说的编辑部件(这里是 QLineEdit)。
- setEditorData 方法将模子数据设置到编辑器中。
- setModelData 方法将编辑器的数据更新到模子中。
- updateEditorGeometry 方法设置编辑器的位置和巨细。
七、QFileSystemModel 和 QTreeView 类及示例步调功能实现
- 功能:
- QFileSystemModel 提供了文件体系的数据模子,可以体现文件和目次。
- QTreeView 可以用来体现 QFileSystemModel 提供的数据。
- #include <QApplication>
- #include <QTreeView>
- #include <QFileSystemModel>
- int main(int argc, char *argv[])
- {
- QApplication app(argc, argv);
- QFileSystemModel *model = new QFileSystemModel;
- model->setRootPath(QDir::homePath());
- QTreeView *treeView = new QTreeView;
- treeView->setModel(model);
- treeView->setRootIndex(model->index(QDir::homePath()));
- treeView->show();
- return app.exec();
- }
复制代码
- 代码表明:
- 创建 QFileSystemModel 并设置根路径为用户的主目次。
- 创建 QTreeView 并将 QFileSystemModel 设置为其模子。
- 将 QTreeView 的根索引设置为用户主目次,使其体现用户主目次下的文件和目次结构。
|