Qt开发总结(15)——Model/View架构使用

本文深入探讨Qt的Model/View架构,通过实例详细讲解如何创建只读表格、设置基本属性、更新显示、设置标题、启用编辑功能、构建树形表以及使用代理。文章提供了丰富的代码示例,帮助读者理解和应用Model/View编程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本篇是上篇Qt开发总结(14)——Model/View 框架的延续,从这篇总结可以很具体的实现一些Model/View控件和效果,大部分都是干货,在最后还给出了官方的一些示例供学习参考。

一个简单的只读表

  //main.cpp
  #include <QtWidgets/QApplication>
  #include <QtWidgets/QTableView>
  #include "mymodel.h"

  int main(int argc, char *argv[])
  {
      QApplication a(argc, argv);
      QTableView tableView;
      MyModel myModel(0);
      tableView.setModel( &myModel );
      tableView.show();
      return a.exec();
  }

我们从上面的代码看到,一个表格的显示只需要为它set model,表格的数据显示变成了莫model的编写。Model可以用一些现有的model,比如上面提到的QStandardItemModel,这里我们新建一个自己的model,并用一个新建类

### Qt Model/View 架构概述 QtModel/View 架构是一种设计模式,旨在分离数据处理逻辑(Model)、数据显示方式(View)以及两者之间的交互控制。这种架构不仅提高了代码的可维护性和重用性,还简化了复杂界面的设计[^1]。 #### Model-View 基础组件 - **Model**: 负责管理应用程序的数据及其内部状态。为了使不同类型的视图能够一致地访问这些信息,所有的模型都实现了 `QAbstractItemModel` 接口所规定的公共接口。对于简单的只读场景,可以创建继承自 `QAbstractTableModel` 或者 `QStandardItemModel` 的子类来实现特定功能[^4]。 - **View**: 显示来自关联模型的信息给用户看,并响应用户的输入事件。常见的视图控件有 `QTableView`, `QListView` 和 `QTreeView` 等。当需要展示表格化或者列表式的二维数组型数据时,推荐使用 `QTableView` 并结合自定义的模型类一起工作[^2]。 - **Delegate (代理)**: 定义了如何绘制单个项目并支持编辑操作。默认情况下,大多数内置视图都有自己的标准委托;然而,开发者也可以通过编写新的委托类来自定义外观和行为。 #### 关键类介绍 - **QModelIndex 类**:作为连接视图与模型之间通信的关键桥梁之一,提供了指向具体条目位置的方法。例如,可以通过指定行号、列号及父级索引来获取某个项目的引用,进而对其进行查询或修改操作[^3]: ```cpp // 获取数据 QModelIndex index = model->index(row, column, parentIndex); QVariant data = model->data(index); // 设置数据 model->setData(index, newValue); // 查找父项 QModelIndex parentIndex = index.parent(); ``` #### 创建自定义模型实例 假设要构建一个非常基本的只读表格式模型,则可以从 `QAbstractTableModel` 开始扩展,并重新实现必要的虚函数如 `rowCount()`, `columnCount()` 以及最重要的 `data()` 方法来返回实际存储的内容[^5]: ```cpp class MyModel : public QAbstractTableModel { public: int rowCount(const QModelIndex &parent = QModelIndex()) const override; int columnCount(const QModelIndex &parent = QModelIndex()) const override; QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; }; ``` 上述代码片段展示了怎样声明一个新的模型类,并指定了三个核心成员函数——它们分别决定了表格有多少行多少列,还有每个单元格里应该呈现什么文字内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bjtuwayne

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值