从json数组构造QAbstractTableModel子类,快速绘制QTableView

一般的,QSqlTableModel可以关联数据库的一张表,QTableView对象通过setModel,关联这个model对象,这样,编码上很方便能将QTableView展示成数据库表的样式。

但是如果数据来源不是数据库表,而是json数组,则需要继承QAbstractTableModel,然后再让tableview->setModel。

下文的AbsTblMdlJsonArray就简易地实现了这个功能。

#pragma once
#include <memory>
#include <QAbstractTableModel>
#include <QJsonArray>

class AbsTblMdlJsonArray : public QAbstractTableModel {
public:
	AbsTblMdlJsonArray(const QJsonArray &src, QObject *parent = Q_NULLPTR);
	int	columnCount(const QModelIndex &parent = QModelIndex()) const override;
	QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
	//QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override;
	//QModelIndex parent(const QModelIndex &index) const override;
	int	rowCount(const QModelIndex &parent = QModelIndex()) const override;
	QVariant headerData(int section, Qt::Orientation orientation, int role
使用自定义模型继承 `QAbstractTableModel` 是 Qt 中实现灵活、高效表格数据管理的核心方式。相比于 `QStandardItemModel`,自定义模型可以更好地控制内存、支持大型数据集、实现动态更新和只读/编辑模式等。 下面是一个完整的 C++ 示例,演示如何创建一个继承自 `QAbstractTableModel` 的自定义模型,并将其与 `QTableView` 配合使用。 --- ```cpp #include <QApplication> #include <QMainWindow> #include <QTableView> #include <QAbstractTableModel> #include <QVBoxLayout> #include <QWidget> #include <QVariant> // 自定义表格模型 class PersonTableModel : public QAbstractTableModel { Q_OBJECT public: // 数据结构:每行表示一个人的信息 struct Person { QString name; int age; QString city; }; explicit PersonTableModel(QObject *parent = nullptr) : QAbstractTableModel(parent) { // 初始化一些示例数据 m_data = { {"张三", 25, "北京"}, {"李四", 30, "上海"}, {"王五", 35, "深圳"}, {"赵六", 28, "广州"} }; } // 必须重写的方法之一:返回行数 int rowCount(const QModelIndex &parent = QModelIndex()) const override { Q_UNUSED(parent); return m_data.size(); } // 必须重写的方法之一:返回列数 int columnCount(const QModelIndex &parent = QModelIndex()) const override { Q_UNUSED(parent); return 3; // 姓名、年龄、城市 } // 必须重写的方法之一:提供视图要显示的数据 QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override { if (!index.isValid()) return QVariant(); if (role == Qt::DisplayRole) { const Person &person = m_data.at(index.row()); switch (index.column()) { case 0: return person.name; case 1: return person.age; case 2: return person.city; default: return QVariant(); } } return QVariant(); } // 可选:设置表头数据 QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override { if (role != Qt::DisplayRole) return QVariant(); if (orientation == Qt::Horizontal) { switch (section) { case 0: return QStringLiteral("姓名"); case 1: return QStringLiteral("年龄"); case 2: return QStringLiteral("城市"); default: return QVariant(); } } else if (orientation == Qt::Vertical) { return QString("第%1行").arg(section + 1); } return QVariant(); } private: QList<Person> m_data; // 存储表格数据 }; // 注意:需要在 .cpp 文件中包含 moc 处理(此处为单文件示例,需确保 MOC 正常工作) #include "main.moc" int main(int argc, char *argv[]) { QApplication app(argc, argv); QMainWindow mainWindow; mainWindow.setWindowTitle("QAbstractTableModel 自定义模型示例"); mainWindow.resize(600, 400); QWidget *centralWidget = new QWidget(&mainWindow); QVBoxLayout *layout = new QVBoxLayout(centralWidget); QTableView *tableView = new QTableView; // 创建并设置自定义模型 PersonTableModel *model = new PersonTableModel(&mainWindow); tableView->setModel(model); layout->addWidget(tableView); mainWindow.setCentralWidget(centralWidget); mainWindow.show(); return app.exec(); } ``` --- ### 🔍 代码解释: 1. **PersonTableModel 继承自 QAbstractTableModel** - 提供对表格数据的抽象访问。 - 使用 `Q_OBJECT` 宏以便支持元对象系统(如信号槽,即使本例未用也建议保留)。 2. **rowCount() 和 columnCount()** - 返回表格的维度。这是必须实现的两个虚函数。 3. **data() 函数** - 根据 `index`(行、列)返回对应位置的数据。 - 只处理 `Qt::DisplayRole` 角色,用于显示文本内容。 - 如果将来需要编辑、图标、颜色等功能,可扩展其他角色(如 `Qt::EditRole`, `Qt::ForegroundRole` 等)。 4. **headerData() 函数** - 提供水平和垂直表头的显示文本。 - 水平表头显示中文列名,垂直表头显示“第X行”。 5. **数据存储在 QList<Person> 中** - 数据结构清晰,易于维护。 - 可以轻松替换为数据库查询结果或网络数据。 6. **MOC 编译问题说明** - 因为此文件包含了 `Q_OBJECT` 且是单 `.cpp` 文件项目,你需要生成 MOC 文件: ```bash moc main.cpp -o main.moc ``` - 或者更推荐的方式是拆分为 `.h` 和 `.cpp` 文件,并在 `.pro` 中正确配置。 --- ### 🛠️ 编译方法(使用 qmake) 创建 `custom_model.pro` 文件: ```pro QT += widgets SOURCES += main.cpp # 启用 MOC CONFIG += qt warn_on # 如果报错找不到 moc 文件,运行: # moc main.cpp -o main.moc ``` 编译命令: ```bash qmake custom_model.pro make ./custom_model ``` --- ### ✅ 运行效果: 程序启动后会显示一个表格,内容与之前 `QStandardItemModel` 示例一致,但这次是由你完全控制的自定义模型驱动,更加灵活高效。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值