Qt工作笔记-依赖于QAbstractTableModel实现自定义TableModel

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}

猜你喜欢

转载自blog.csdn.net/qq78442761/article/details/86064634