亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Qt學習筆記-----Model/View架構之自定義Model

2019-11-14 11:53:18
字體:
來源:轉載
供稿:網友

Model/View Framework中提供了模型model的抽象基類QAbstractItemModel, 如果需要自定義模型就需要繼承這個類并且實現一些必要的函數。 此外,Qt中又提供了QAbstractTableModel和QAbstractListModel分別繼承于上述基類,由名字可以清楚的知道這兩個類分別適用于表格模型和列表模型。對于這兩個模型來說,很多函數已經重新實現過了,使用時直接繼承即可。

QAbstractItemModel QAbstractItemModel為元素模型類提供了抽象接口,自定義模型時需要繼承這個類。自定義的模型分為只讀模型和可編輯模型。

只讀模型:內部數據不能修改 為了實現一個只讀模型,需要重新實現以下函數:

flags

Qt::ItemFlags QAbstractItemModel::flags(const QModelIndex &index) const

這個函數返回被給模型索引index的標志,用于其他組件獲得每一個元素的信息。在很多模型中,返回的flags應該包括Qt::ItemIsEnabled和Qt::ItemIsSelectable,表示模型中的元素是可以被訪問和選擇的。通常實現的形式為:

if(!index.isValid()) return Qt::ItemIsEnabled;return QAbstractItemModel::flags(index) | Qt::ItemIsEnabled | Qt::ItemIsSelectable;

data

QVariant QAbstractItemModel::data(const QModelIndex &index, int role = Qt::DisplayRole) const

這個函數返回模型索引index的底層數據(一個模型索引包括某一元素的信息,包括行,列,以及數據),用于視圖和委托訪問數據。通常的實現形式如下:

if(!index.isValid()) return QVariant();if(index.row() >= /*數據總個數*/) return QVariant();if(role == Qt::DisplayRole){ int row = index.row(); int column = index.column(); //根據模型存儲數據所用的數據結構來返回對應行和列的數據 return /*數據*/}return QVariant();

headerData

QVariant QAbstractItemModel::headerData(int section, Qt::Orientation orientation, int role == Qt::DisplayRole) const

這個函數返回某部分對應方向上的表頭,為Views提供顯示在Views頂部(即最上方和最左邊)的標識。通常實現形式為:

if(role != Qt::DisplayRole) return QVariant();if(orientation == Qt::Horizontal)//headersData在最上方,水平方向或if(orientation == Qt::Vertical) //headersData在最左邊,垂直方向{ //判斷section,section表示的是第幾個 return ...}return QVariant();

rowCount

int QAbstractItemModel::rowCount(const QModelIndex &parent = QModelIndex()) const

這個函數返回被給的模型索引下有多少行,返回的是parent的孩子數。而不是整個行數。如果沒有子元素,則返回0。

對于繼承于QAbstractListModel的類來說,只需要重新實現這四個函數。而對于繼承于QAbstractTableModel和QAbstractItemModel的類來說,除了上述四個函數,還需要重新實現columnCount函數,因為列表只有1列,而表格和樹則需要自定義:

columnCount

int QAbstractItemModel::columnCount(const QModelIndex &parent = QModelIndex()) const

這個函數通常與給定的parent無關,所涉及的類有幾列就返回幾。

可編輯模型:允許數據被修改,也可以允許插入和刪除操作。

實現可編輯模型,除了上述只讀模型的函數外,還需要重新實現以下函數:

flags

Qt::ItemFlags QAbstractItemModel::flags(const QModelIndex &index) const

這個函數和只讀模型的函數一樣,只是返回時需要增加Qt::ItemIsEditable,形式如下:

if(!index.isValid()) return Qt::ItemIsEnabled;return QAbstractItemModel::flags(index) | Qt::ItemIsEditabled;

setData

bool QAbstractItemModel::setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole)

data函數用來獲取數據,setData函數用來設置模型索引index中存儲的數據,形式如下:

if(index.isValid() && role == EditRole){ int row = index.row(); //根據行號從內部數據結構中定位,然后將其改編成value emit dataChanged(index, index); return true;}return false;

另外需要注意的是,在改變完內部數據后,需要發出dataChanged(index, index)信號通知Views和Delegate內部數據已經發生改變。

setHeaderData

bool QAbstractItemModel::setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role = Qt::EditRole)

headerData函數用于返回表頭,這個函數設置表頭為value,形式如下:

if(role != EditRole) return false;if(orientation == Qt::Horizontal) 或 if(orientation == Qt::Vertical){ //改變存儲表頭的變量 emit headerDataChanged(orientation, section, section); return true;}return false;

同樣,當改變表頭后,需要發出headerDataChanged(orientation, section, section)信號,通知Views和Delegate。

如果需要添加和刪除操作,則需要實現以下函數: insertRows

bool QAbstractItemModel::insertRows(int position, int rows, const QModelIndex &index = QModelIndex())

這個函數在父級為index的結構中的第position行插入rows行。形式如下:

beginInsertRows(index, position, position + rows - 1);//內部變量進行刪除操作endInsertRows();return true;

進行插入操作時,前后分別需要調用beginInsertRows()和endInsertRows()函數。

removeRows

bool QAbstractItemModel::removeRows(int position, int rows, const QModelIndex &index = QModelIndex())

這個函數在父級為index的結構中的第position行刪除rows行。形式如下:

beginRemoveRows(index, position, position + rows - 1);//內部變量進行刪除操作endRemoveRows();return true;

進行刪除操作時,前后需要調用beginRemoveRows()和endRemoveRows()函數。

insertColumns removeColumns 這兩個函數同插入行和刪除行類似,也需要調用兩個函數。

通常情況下,函數應該返回true如果操作成功,但是如果只是部分操作成功,例如只插入了部分行,則需要返回false。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美一级电影久久| 亚洲欧美一区二区精品久久久| 亚洲国产精久久久久久| 日韩国产欧美精品在线| 国产精品久久久久久一区二区| 91久久久久久久久久久久久| 91青草视频久久| 深夜福利一区二区| 狠狠色噜噜狠狠狠狠97| 日韩电影在线观看永久视频免费网站| 国产精品嫩草影院一区二区| 一区二区三欧美| 国产一区二区美女视频| 亚洲国产成人在线视频| 日韩av色综合| 中文字幕九色91在线| 亚洲性日韩精品一区二区| 色狠狠av一区二区三区香蕉蜜桃| 97成人精品区在线播放| 日本久久久久亚洲中字幕| 九九热最新视频//这里只有精品| 欧美激情2020午夜免费观看| 日本成人黄色片| 国产一区二区三区高清在线观看| 成人在线播放av| 国产一区视频在线| 日韩成人激情视频| 亚洲人成电影在线播放| 欧美色图在线视频| 成人免费看吃奶视频网站| 欧美中文字幕精品| 亚洲一级一级97网| 91精品久久久久久久久久久久久久| 欧美做爰性生交视频| 欧美国产精品日韩| 国产99视频精品免视看7| 国产精品久久久久久久久免费| 91亚洲午夜在线| 亚洲色图综合网| 欧美www视频在线观看| 日韩一区视频在线| 97涩涩爰在线观看亚洲| 久久97精品久久久久久久不卡| 最新的欧美黄色| 欧美成人午夜视频| 日韩欧美在线第一页| 亚洲成人精品久久| 色伦专区97中文字幕| 中文字幕日韩免费视频| 欧美大片欧美激情性色a∨久久| 日韩av在线播放资源| 精品国模在线视频| 91色精品视频在线| 国产91精品久久久久久| 亚洲在线免费看| 亚洲影院在线看| 亚洲精品av在线| 在线一区二区日韩| 精品动漫一区二区三区| 国产69精品久久久久9999| 久久国内精品一国内精品| 日韩高清人体午夜| 欧美精品在线播放| 成人激情视频在线| 精品国产电影一区| 欧美性xxxx在线播放| 色狠狠久久aa北条麻妃| 久久伊人色综合| 久久露脸国产精品| 日韩中文字幕视频| 中文字幕欧美专区| 国产在线日韩在线| 琪琪亚洲精品午夜在线| 日韩成人小视频| 中文字幕无线精品亚洲乱码一区| 亚洲女人天堂网| 欧美国产视频一区二区| 亚洲第一色中文字幕| 日本一区二区三区四区视频| 欧美又大又粗又长| 国产精品免费小视频| 九九久久综合网站| 国产自产女人91一区在线观看| 97精品伊人久久久大香线蕉| 亚洲欧美日韩第一区| 国产精品久久久av久久久| 国产精品海角社区在线观看| 国产成人免费91av在线| 欧美在线免费观看| 成人福利网站在线观看11| 亚洲老板91色精品久久| 中文字幕国产亚洲| 中文字幕亚洲欧美日韩在线不卡| 成人激情视频免费在线| 亚洲午夜久久久久久久| 日韩av影片在线观看| 欧美午夜片在线免费观看| 欧美富婆性猛交| 亚洲精品国产拍免费91在线| 亚洲天天在线日亚洲洲精| 国产亚洲精品成人av久久ww| 欧美与欧洲交xxxx免费观看| 亚洲日韩欧美视频一区| 国内免费久久久久久久久久久| 日韩经典一区二区三区| 国产欧美日韩综合精品| 亚洲人午夜精品免费| 一区二区三区四区视频| 俺去啦;欧美日韩| 91sa在线看| 亚洲精品国产综合区久久久久久久| 欧美日韩成人黄色| 久久99精品久久久久久青青91| 国产成人在线视频| 成人午夜在线视频一区| 国产精品久久久久久久久粉嫩av| 日韩暖暖在线视频| 2020欧美日韩在线视频| 成人性教育视频在线观看| 欧美一级在线亚洲天堂| 亚洲欧美日韩图片| 亚洲国产精品资源| 7777kkkk成人观看| 国产色婷婷国产综合在线理论片a| 欧美性感美女h网站在线观看免费| 亚洲男人的天堂网站| 国产精品久久色| 91在线中文字幕| 日产精品久久久一区二区福利| 91网在线免费观看| 亚洲欧美成人在线| 在线日韩日本国产亚洲| 青草热久免费精品视频| 欧美日韩在线另类| 欧美综合在线第二页| 亚洲国产精品久久久久秋霞蜜臀| 欧美成人午夜激情在线| 国产精品三级久久久久久电影| 亚洲精品日韩丝袜精品| 日韩欧美国产视频| 日韩av在线高清| 青草成人免费视频| 国产精品色婷婷视频| 亚洲精品久久久一区二区三区| 久久精品91久久久久久再现| 欧美电影《睫毛膏》| 日韩中文在线中文网在线观看| 91精品视频在线播放| 欧美放荡办公室videos4k| 欧美视频免费在线观看| 亚洲精品ady| 亚洲一二在线观看| 欧美精品在线免费| 在线观看欧美www| 国产精品网址在线| 亚洲欧美一区二区精品久久久| 亚洲欧美一区二区三区四区| 国产成人自拍视频在线观看| 亚洲91av视频| 5252色成人免费视频| 欧美一级淫片丝袜脚交| 欧美激情性做爰免费视频| 81精品国产乱码久久久久久| 国产日韩精品电影|