版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq78442761/article/details/86064634
目录
理论
设计模式里面有一句话叫 要依赖于抽象,不要依赖于具体。
但在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 <QAbstractTableModel>
#include <QVector>
class MyTableViewModel: public QAbstractTableModel
{
Q_OBJECT
public:
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<QVector<QString>> m_aryData;
};
#endif // MYTABLEVIEWMODEL_H
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
main.cpp
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
mytableviewmodel.cpp
#include "mytableviewmodel.h"
#include <QDebug>
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<QString> list;
list << one << two << three;
m_aryData << list;
endInsertRows();
}
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include "mytableviewmodel.h"
#include <QDebug>
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;
}