Qt Model/View理解(二)---構造model(細心研讀,發現超簡單,Model就是做三件事:返回行數量、列數量、data如何顯示。然后把model與view聯系起來即可,兩個例子都是如此)good


數據是一個集合,顯示也是一個集合。例如一篇《西游記》的文章,所有的文字就是數據集合,展示方式就是顯示的集合,可以以書本的形式,也可以以電紙書的形式,更可以用視頻的方式展現。

下面是將一個二維數組中的數據顯示到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
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM