Qt源码解析 索引
源码解析6-系统封装-QTableView实现源码
一个简单的模型/视图应用程序
如果你想开发一个模型/视图应用程序,你应该从哪里开始?我们建议从一个简单的示例开始,然后逐步扩展它。这使得理解架构变得容易得多。事实证明,在调用 IDE 之前尝试详细了解模型/视图体系结构对许多开发人员来说不太方便。从具有演示数据的简单模型/视图应用程序着手要容易得多。试试看!只需将以下示例中的数据替换为您自己的即可。
下面是 7 个非常简单且独立的应用程序,它们展示了模型/视图编程的不同方面。源代码可以在examples/widgets/tutorials/modelview
目录中找到。
我们从一个使用QTableView来显示数据的应用程序开始。稍后我们将添加编辑功能。
(文件来源:examples/widgets/tutorials/modelview/1_readonly/main.cpp)
// main.cpp
#include <QApplication>
#include <QTableView>
#include "mymodel.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTableView tableView;
MyModel myModel;
tableView.setModel(&myModel);
tableView.show();
return a.exec();
}
我们有通常的main()函数:
这是有趣的部分:我们创建 MyModel 的实例并使用tableView.setModel(&myModel); 将它的指针传递给tableView。tableView将调用它收到的指针的方法来找出两件事:
- 应显示多少行和列。
- 每个单元格应该打印什么内容。
该模型需要一些代码来对此做出响应。
我们有一个表数据集,所以让我们从QAbstractTableModel开始,因为它比更通用的QAbstractItemModel更容易使用。
(文件来源:examples/widgets/tutorials/modelview/1_readonly/mymodel.h)
// mymodel.h
#include <QAbstractTableModel>
class MyModel : public QAbstractTableModel
{
Q_OBJECT
public:
MyModel(QObject *parent = nullptr);
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;
};
QAbstractTableModel需要实现三个抽象方法。
(文件来源:examples/widgets/tutorials/modelview/1_readonly/mymodel.cpp)
// mymodel.cpp
#include "mymodel.h"
MyModel::MyModel(QObject *parent)
: QAbstractTableModel(parent)
{
}
int MyModel::rowCount(const QModelIndex & /*parent*/) const
{
return 2;
}
int MyModel::columnCount(const QModelIndex & /*parent*/) const
{
return 3;
}
QVariant