Qt工作笔记-依赖于QAbstractTableModel实现自定义TableModel
发布日期:2021-06-30 10:58:46 浏览次数:2 分类:技术文章

本文共 3100 字,大约阅读时间需要 10 分钟。

目录

 


理论

设计模式里面有一句话叫 要依赖于抽象,不要依赖于具体。

但在Qt有些官方实例里,却依赖于具体实现某一子功能,这可以是为了方便把,

但在TableModel有一个依赖与抽象,

官方解释如下:

所以最少要实现这几个函数,才能跑起来:

//必须实现这3个    int rowCount(const QModelIndex &parent) const Q_DECL_OVERRIDE;    int columnCount(const QModelIndex &parent) const Q_DECL_OVERRIDE;    QVariant data(const QModelIndex &index, int role) const Q_DECL_OVERRIDE;

只有重写了这几个函数,虚表才能被覆盖,调用自己写的东西,实现自己想要的结果;

 

源码

程序运行截图如下:

程序结构如下:

源码如下:

mytableviewmodel.h

#ifndef MYTABLEVIEWMODEL_H#define MYTABLEVIEWMODEL_H#include 
#include
class MyTableViewModel: public QAbstractTableModel{ Q_OBJECTpublic: MyTableViewModel(); //必须实现这3个 int rowCount(const QModelIndex &parent) const Q_DECL_OVERRIDE; int columnCount(const QModelIndex &parent) const Q_DECL_OVERRIDE; QVariant data(const QModelIndex &index, int role) const Q_DECL_OVERRIDE; //按照功能可选实现 QVariant headerData(int section, Qt::Orientation orientation, int role) const Q_DECL_OVERRIDE; //还可以实现如下的几个函数 //如:setData(),XXXX等函数 //自己添加的函数,方便管理 void addItem(QString one, QString two, QString three);private: //方便数据存储 QVector
> m_aryData;};#endif // MYTABLEVIEWMODEL_H

widget.h

#ifndef WIDGET_H#define WIDGET_H#include 
namespace Ui {class Widget;}class Widget : public QWidget{ Q_OBJECTpublic: explicit Widget(QWidget *parent = 0); ~Widget();private: Ui::Widget *ui;};#endif // WIDGET_H

main.cpp

#include "widget.h"#include 
int main(int argc, char *argv[]){ QApplication a(argc, argv); Widget w; w.show(); return a.exec();}

mytableviewmodel.cpp

#include "mytableviewmodel.h"#include 
MyTableViewModel::MyTableViewModel(): QAbstractTableModel(NULL){}int MyTableViewModel::rowCount(const QModelIndex &parent) const{ Q_UNUSED(parent) return m_aryData.size();}int MyTableViewModel::columnCount(const QModelIndex &parent) const{ Q_UNUSED(parent) return 3;}QVariant MyTableViewModel::data(const QModelIndex &index, int role) const{ if(role == 0) return m_aryData[index.row()][index.column()]; else return QVariant();}QVariant MyTableViewModel::headerData(int section, Qt::Orientation orientation, int role) const{ if(role == Qt::DisplayRole && orientation == Qt::Horizontal){ if(section == 0) return QStringLiteral("第一列"); else if(section == 1) return QStringList("第二列"); else if(section == 2) return QStringLiteral("第三列"); } return QVariant();}void MyTableViewModel::addItem(QString one, QString two, QString three){ beginInsertRows(QModelIndex(), m_aryData.size(),m_aryData.size()); QVector
list; list << one << two << three; m_aryData << list; endInsertRows();}

widget.cpp

#include "widget.h"#include "ui_widget.h"#include "mytableviewmodel.h"#include 
Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget){ ui->setupUi(this); MyTableViewModel *model = new MyTableViewModel; model->addItem("data1", "data2", "data3"); ui->tableView->setModel(model);}Widget::~Widget(){ delete ui;}

 

转载地址:https://it1995.blog.csdn.net/article/details/86064634 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Qt文档阅读笔记-QQmlApplicationEngine解析与实例(qml与C++混合编程及QQuick与widgets混合)
下一篇:Qt工作笔记-通过C++使widgets与QQuick交互(包含qml界面对象与C++对象映射)

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年04月29日 09时05分11秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章