码迷,mamicode.com
首页 > 其他好文 > 详细

Qt Model/View理解(二)---构造model(细心研读,发现超简单,Model就是做三件事:返回行数量、列数量、data如何显示。然后把model与view联系起来即可,两个例子都是如此)good

时间:2019-06-18 20:10:32      阅读:217      评论:0      收藏:0      [点我收藏+]

标签:构造   关联   art   创建   版权   view   res   tao   add   

数据是一个集合,显示也是一个集合。例如一篇《西游记》的文章,所有的文字就是数据集合,展示方式就是显示的集合,可以以书本的形式,也可以以电纸书的形式,更可以用视频的方式展现。

下面是将一个二维数组中的数据显示到TableView控件中。

1.声明一个model类,继承于QAbstractTableModel

#define ROW 3
#define COL 2

class TableModel : public QAbstractTableModel
{
Q_OBJECT
public:
TableModel(QObject *parent = 0);
~TableModel();
//QAbstractTableModel 中3个必须重新实现的虚函数
int rowCount(const QModelIndex & parent = QModelIndex()) const;
int columnCount(const QModelIndex & parent = QModelIndex()) const;
QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const;

private:
int num[ROW][COL];
int nn;
};
2.方法实现

TableModel::TableModel(QObject *parent) :QAbstractTableModel(parent)
{
//二维数初始化,从100开始
nn = 100;
for(int i=0;i<ROW;++i){
for(int j=0;j<COL;++j){
num[i][j] = nn;
++nn;
}
}
}

TableModel::~TableModel()
{
}

//体现model的行数,这里有3行
int TableModel::rowCount(const QModelIndex & parent) const
{
return ROW;
}

//体现model的列数,这里有2列
int TableModel::columnCount(const QModelIndex & parent) const
{
return COL;
}

//体现model中显示的数据,这里只是num中每一个成员值。
QVariant TableModel::data(const QModelIndex & index, int role) const
{
if (Qt::DisplayRole == role)
{
return num[index.row()][index.column()];//返回num二维数组中的值
}
return QVariant::Invalid;
}
3.将model与QTableView关联起来。

Widget::Widget(QWidget *parent)
: QWidget(parent)
{
this->resize(300,200);

TableModel *model = new TableModel();

QTableView *tableview = new QTableView(this);

tableview->setModel(model);

tableview->setGeometry(5,5,280,180);
}
4.显示效果,3行2列

 

目前的实现都是从定义好的model中取出数据,放在不同的显示控件中,相当于只读,没有对数据部分做任何修改。下一节将以此篇为基础,介绍如何对数据部分进行操作。
---------------------
作者:涛水
来源:CSDN
原文:https://blog.csdn.net/lutao614/article/details/80863790
版权声明:本文为博主原创文章,转载请附上博文链接!

 

 

模型/视图将数据和显示分开进行处理,中间通过代理做桥梁。

如果想往QCombox中添加一些子项,你会怎么做呢?除了常用的addItem方法,下面介绍通过模型/视图的方式添加,逐步理解模型/视图的使用方法。

1.首先添加一个类,继承自QAbstractListModel

class ComboxModel : public QAbstractListModel
{
Q_OBJECT
public:
ComboxModel(QStringList &_list,QObject *parent = 0);
~ComboxModel();
//QAbstractListModel 中3个必须重新实现的虚函数
int rowCount(const QModelIndex & parent = QModelIndex()) const;
int columnCount(const QModelIndex & parent = QModelIndex()) const;
QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const;

private:
QStringList list;

};
2.方法实现

//将QStringList中的字符串显示在combox中。
ComboxModel::ComboxModel(QStringList &_list,QObject *parent) :list(_list),QAbstractListModel(parent)
{
}

ComboxModel::~ComboxModel()
{
}

//体现model的行数,这里就是list的个数
int ComboxModel::rowCount(const QModelIndex & parent) const
{
return list.count();
}

//体现model的列数,这里只有1列
int ComboxModel::columnCount(const QModelIndex & parent) const
{
return 1;
}

//体现model中显示的数据,这里只是list中每一个子项。
QVariant ComboxModel::data(const QModelIndex & index, int role) const
{
if (Qt::DisplayRole == role)
{
return list.at(index.row());//返回list每一项
}
return QVariant::Invalid;
}
3.界面上的combox与model进行关联。

Widget::Widget(QWidget *parent)
: QWidget(parent)
{
this->resize(200,200);

QComboBox *combox = new QComboBox(this);
combox->setGeometry(50,50,100,40);

QStringList list;
list<<"123"<<"345"<<"546"<<"apple";
//创建model并初始化它。
ComboxModel *model = new ComboxModel(list);

combox->setModel(model);
}
4.最后效果

 


---------------------
作者:涛水
来源:CSDN
原文:https://blog.csdn.net/lutao614/article/details/80859968
版权声明:本文为博主原创文章,转载请附上博文链接!

Qt Model/View理解(二)---构造model(细心研读,发现超简单,Model就是做三件事:返回行数量、列数量、data如何显示。然后把model与view联系起来即可,两个例子都是如此)good

标签:构造   关联   art   创建   版权   view   res   tao   add   

原文地址:https://www.cnblogs.com/findumars/p/11047046.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!