QT------模子/视图

[复制链接]
发表于 2025-11-16 15:05:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
一、模子/视图结构概述


  • 根本原理:

    • Qt 的模子/视图(Model/View)架构将数据的存储和体现分离,进步了代码的可维护性和复用性。
    • 模子(Model):负责存储和管理数据,提供数据的访问接口,如获取数据、插入数据、修改数据、删除数据等。
    • 视图(View):负责体现数据,不关心数据的存储和利用,只根据模子的数据举行体现。
    • 署理(Delegate):负责在视图中渲染和编辑数据项,提供了一种机制来定制数据的体现和编辑方式,比方利用自界说的部件举行数据的编辑。

二、QAbstractItemModel 类


  • 功能:

    • 是全部项模子的抽象基类,界说了项模子必须实现的接口,如 rowCount、columnCount、data、setData 等,用于提供数据的存储和利用接口。
    • 可以自界说继续自 QAbstractItemModel 的模子类,以满意差别的数据存储和利用需求。

三、QAbstractItemView 类


  • 功能:

    • 是全部项视图的抽象基类,提供了体现数据的通用接口,如 setModel 用于关联一个模子,视图会根据模子的数据举行体现和更新。
    • 常见的派生类有 QListView、QTreeView、QTableView 等,分别用于列表、树状、表格情势的数据体现。

四、QStringListModel 类及示例步调功能实现


  • 功能:

    • 存储一个字符串列表,方便地用于 QListView 和 QComboBox 等视图的数据体现。

  1. #include <QApplication>
  2. #include <QListView>
  3. #include <QStringListModel>
  4. int main(int argc, char *argv[])
  5. {
  6.     QApplication app(argc, argv);
  7.     QStringListModel *model = new QStringListModel;
  8.     QStringList stringList;
  9.     stringList << "Item 1" << "Item 2" << "Item 3";
  10.     model->setStringList(stringList);
  11.     QListView *listView = new QListView;
  12.     listView->setModel(model);
  13.     listView->show();
  14.     return app.exec();
  15. }
复制代码

  • 代码表明:

    • 创建一个 QStringListModel 并添加一些字符串元素。
    • 创建一个 QListView 并将 QStringListModel 设置为其模子,QListView 将体现字符串列表中的元素。

五、自界说署理


  • 自界说署理功能:

    • 答应用户自界说数据在视图中的体现和编辑方式,比方利用自界说的部件举行数据的编辑,大概添加一些特定的体现效果。


六、QStyledItemDelegate 类及计划自界说署理类


  • 功能:

    • 提供了默认的数据项体现和编辑功能,可作为自界说署理的基类。

  1. #include <QApplication>
  2. #include <QListView>
  3. #include <QStyledItemDelegate>
  4. #include <QPainter>
  5. #include <QStyleOptionViewItem>
  6. class CustomDelegate : public QStyledItemDelegate
  7. {
  8. protected:
  9.     void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override
  10.     {
  11.         QStyleOptionViewItem opt = option;
  12.         initStyleOption(&opt, index);
  13.         // 自定义绘制
  14.         painter->save();
  15.         painter->setPen(Qt::red);
  16.         painter->drawText(opt.rect, Qt::AlignCenter, index.data().toString());
  17.         painter->restore();
  18.     }
  19.     QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override
  20.     {
  21.         // 创建自定义编辑器
  22.         QLineEdit *editor = new QLineEdit(parent);
  23.         return editor;
  24.     }
  25.     void setEditorData(QWidget *editor, const QModelIndex &index) const override
  26.     {
  27.         QLineEdit *lineEdit = qobject_cast<QLineEdit*>(editor);
  28.         if (lineEdit) {
  29.             lineEdit->setText(index.data().toString());
  30.         }
  31.     }
  32.     void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override
  33.     {
  34.         QLineEdit *lineEdit = qobject_cast<QLineEdit*>(editor);
  35.         if (lineEdit) {
  36.             model->setData(index, lineEdit->text());
  37.         }
  38.     }
  39.     void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const override
  40.     {
  41.         editor->setGeometry(option.rect);
  42.     }
  43. };
  44. int main(int argc, char *argv[])
  45. {
  46.     QApplication app(argc, argv);
  47.     QStringListModel *model = new QStringListModel;
  48.     QStringList stringList;
  49.     stringList << "Item 1" << "Item 2" << "Item 3";
  50.     model->setStringList(stringList);
  51.     QListView *listView = new QListView;
  52.     listView->setModel(model);
  53.     CustomDelegate *delegate = new CustomDelegate;
  54.     listView->setItemDelegate(delegate);
  55.     listView->show();
  56.     return app.exec();
  57. }
复制代码

  • 代码表明:

    • 自界说 CustomDelegate 类,继续自 QStyledItemDelegate。
    • paint 方法用于自界说数据项的绘制,这里将文本绘制为赤色。
    • createEditor 方法创建自界说的编辑部件(这里是 QLineEdit)。
    • setEditorData 方法将模子数据设置到编辑器中。
    • setModelData 方法将编辑器的数据更新到模子中。
    • updateEditorGeometry 方法设置编辑器的位置和巨细。

七、QFileSystemModel 和 QTreeView 类及示例步调功能实现


  • 功能:

    • QFileSystemModel 提供了文件体系的数据模子,可以体现文件和目次。
    • QTreeView 可以用来体现 QFileSystemModel 提供的数据。

  1. #include <QApplication>
  2. #include <QTreeView>
  3. #include <QFileSystemModel>
  4. int main(int argc, char *argv[])
  5. {
  6.     QApplication app(argc, argv);
  7.     QFileSystemModel *model = new QFileSystemModel;
  8.     model->setRootPath(QDir::homePath());
  9.     QTreeView *treeView = new QTreeView;
  10.     treeView->setModel(model);
  11.     treeView->setRootIndex(model->index(QDir::homePath()));
  12.     treeView->show();
  13.     return app.exec();
  14. }
复制代码

  • 代码表明:

    • 创建 QFileSystemModel 并设置根路径为用户的主目次。
    • 创建 QTreeView 并将 QFileSystemModel 设置为其模子。
    • 将 QTreeView 的根索引设置为用户主目次,使其体现用户主目次下的文件和目次结构。


回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表