版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第8章 Qt 5模型/視圖結(jié)構(gòu)概 述Qt 5模型/視圖結(jié)構(gòu)Qt的模型/視圖結(jié)構(gòu)分為三部分:模型(Model)、視圖(View)和代理(Delegate)。其中,模型與數(shù)據(jù)源通信,并為其他部件提供接口;而視圖從模型中獲得用來引用數(shù)據(jù)條目的模型索引(Model Index)。在視圖中,代理負(fù)責(zé)繪制數(shù)據(jù)條目,當(dāng)編輯條目時,代理和模型直接進(jìn)行通信。模型/視圖/代理之間通過信號和槽進(jìn)行通信,如圖8.1所示。 數(shù)據(jù)發(fā)生改變時,模型發(fā)出信號通知視圖。 用戶對界面進(jìn)行操作,視圖發(fā)出信號。 代理發(fā)出信號告知模型和視圖編輯器目前的狀態(tài)。1模型(Model)2視圖(View)3代理(Delegate)01基 本 概
2、 念基 本 概 念1模型(Model)InterView框架中的所有模型都基于抽象基類QAbstractItemModel,此類由QProxyModel、QAbstractListModel、QAbstractTableModel、QAbstractProxyModel、QDirModel、QFileSystemModel、QHelpContentModel和QStandardItemModel類繼承。其中,QAbstractListModel類和QAbstractTableModel類是列表和表格模型的抽象基類,如果需要實(shí)現(xiàn)列表或表格模型,則應(yīng)從這兩個類繼承。完成QStringList存儲的
3、QStringListModel類繼承自QAbstractListModel類,而與數(shù)據(jù)庫有關(guān)的QSqlQueryModel類繼承自QAbstractTableModel類;QAbstractProxyModel類是代理模型的抽象類;QDirModel類是文件和目錄的存儲模型。2視圖(View)InterView框架中的所有視圖都基于抽象基類QAbstractItemView,此類由QColumnView、QHeaderView、QListView、QTableView和QTreeView類繼承。其中,QListView類由QUndoView類和QListWidget類繼承;QTableVie
4、w類由QTableWidget類繼承;QTreeView類由QTreeWidget類繼承。而QListWidget類、QTableWidget類和QTreeWidget類實(shí)際上已經(jīng)包含了數(shù)據(jù),是模型/視圖集成在一起的類。3代理(Delegate)InterView框架中的所有代理都基于抽象基類QAbstractItemDelegate,此類由QItemDelegate和QStyledItemDelegate類繼承。其中,QItemDelegate類由表示數(shù)據(jù)庫中關(guān)系代理的QSqlRelationalDelegate類繼承。02“實(shí)例”模型/視圖類使用“實(shí)例”模型/視圖類使用【例】(簡單)(CH
5、801)實(shí)現(xiàn)一個簡單的文件目錄瀏覽器,完成效果如圖8.2所示。創(chuàng)建工程“DirModeE”,其源文件“main.cpp”中的具體代碼。其中,(a) QDirModel model:新建一個QDirModel對象,為數(shù)據(jù)訪問做準(zhǔn)備。QDirModel的創(chuàng)建還可以設(shè)置過濾器,即只有符合條件的文件或目錄才可被訪問。QDirModel類繼承自QAbstractItemModel類,為訪問本地文件系統(tǒng)提供數(shù)據(jù)模型。它提供新建、刪除、創(chuàng)建目錄等一系列與文件操作相關(guān)的函數(shù),此處只是用來顯示本地文件系統(tǒng)。(b) tree.setModel(&model):調(diào)用setModel()函數(shù)設(shè)置View對象
6、的Model為QDirModel對象的model。(c) tree.setSelectionMode(QAbstractItemView:MultiSelection):設(shè)置QTreeView對象的選擇方式為多選。(d) list.setSelectionModel(tree.selectionModel():設(shè)置QListView對象與QTreeView對象使用相同的選擇模型。(e) table.setSelectionModel(tree.selectionModel():設(shè)置QTableView對象與QTreeView對象使用相同的選擇模型。(f)QObject:connect(&tre
7、e,SIGNAL(doubleClicked(QModelIndex),&list,SLOT(setRoot Index(QModelIndex)、QObject:connect(&tree,SIGNAL (doubleClicked (QModel Index), &table,SLOT(setRootIndex(QModelIndex);:為了實(shí)現(xiàn)雙擊QTreeView對象中的某個目錄時,QListView對象和QTableView對象中顯示此選定目錄下的所有文件和目錄,需要連接QTreeView對象的doubleClicked()信號與QListView對象和QTableView對象的s
8、etRootIndex()槽函數(shù)。最后運(yùn)行效果如圖8.2所示?!皩?shí)例”模型/視圖類使用第8章 Qt 5模型/視圖結(jié)構(gòu)模型(Model)模型(Model)【例】(難度一般)(CH802)通過實(shí)現(xiàn)將數(shù)值代碼轉(zhuǎn)換為文字的模型來介紹如何使用自定義模型。此模型中保存了不同軍種的各種武器,實(shí)現(xiàn)效果如圖8.3所示。模型(Model)具體操作步驟如下。(1)ModelEx類繼承自QAbstractTableModel類,頭文件“modelex.h”中的具體代碼如下:#include #include #include #include class ModelEx : public QAbstractTable
9、Modelpublic: explicit ModelEx(QObject *parent=0); /虛函數(shù)聲明/(a) virtual int rowCount(const QModelIndex &parent=QModelIndex() const; virtual int columnCount(const QModelIndex &parent=QModelIndex() const; QVariant data(const QModelIndex &index, int role) const; QVariant headerData(int section, Qt:Orienta
10、tion orientation, int role) const;signals:public slots:private: QVector army; QVector weaponType; QMap armyMap;/使用QMap數(shù)據(jù)結(jié)構(gòu)保存“數(shù)值文字”的映射 QMap weaponTypeMap; QStringList weapon; QStringList header; void populateModel();/完成表格數(shù)據(jù)的初始化填充;模型(Model)(2)源文件“modelex.cpp”中的具體代碼如下:#include modelex.hModelEx:ModelEx(
11、QObject *parent):QAbstractTableModel(parent) armyMap1=tr(空軍); armyMap2=tr(海軍); armyMap3=tr(陸軍); armyMap4=tr(海軍陸戰(zhàn)隊(duì)); weaponTypeMap1=tr(轟炸機(jī)); weaponTypeMap2=tr(戰(zhàn)斗機(jī)); weaponTypeMap3=tr(航空母艦); weaponTypeMap4=tr(驅(qū)逐艦); weaponTypeMap5=tr(直升機(jī)); weaponTypeMap6=tr(坦克); weaponTypeMap7=tr(兩棲攻擊艦); weaponTypeMap8
12、=tr(兩棲戰(zhàn)車); populateModel();模型(Model)populateModel()函數(shù)的具體實(shí)現(xiàn)代碼如下:void ModelEx:populateModel() headertr(軍種)tr(種類)tr(武器); army12342431; weaponType13574862; weapontr(B-2)tr(尼米茲級)tr(阿帕奇)tr(黃蜂級) tr(阿利伯克級)tr(AAAV)tr(M1A1)tr(F-22);columnCount()函數(shù)中,因?yàn)槟P偷牧泄潭椤?”,所以直接返回“3”。int ModelEx:columnCount(const QModelIn
13、dex &parent) const return 3; rowCount()函數(shù)返回模型的行數(shù)。int ModelEx:rowCount(const QModelIndex &parent) const return army.size();模型(Model)data()函數(shù)返回指定索引的數(shù)據(jù),即將數(shù)值映射為文字。QVariant ModelEx:data(const QModelIndex &index, int role) const if(!index.isValid() return QVariant(); if(role=Qt:DisplayRole)/(a) switch(ind
14、ex.column() case 0: return armyMaparmyindex.row(); break; case 1: return weaponTypeMapweaponTypeindex.row(); break; case 2: return weaponindex.row(); default: return QVariant(); return QVariant();模型(Model)表8.1列出了Item主要的角色及其描述。常 量描 述Qt:DisplayRole顯示文字Qt:DecorationRole繪制裝飾數(shù)據(jù)(通常是圖標(biāo))Qt:EditRole在編輯器中編輯的數(shù)
15、據(jù)Qt:ToolTipRole工具提示Qt:StatusTipRole狀態(tài)欄提示Qt:WhatsThisRoleWhats This文字Qt:SizeHintRole尺寸提示Qt:FontRole默認(rèn)代理的繪制使用的字體Qt:TextAlignmentRole默認(rèn)代理的對齊方式Qt:BackgroundRole默認(rèn)代理的背景畫刷Qt:ForegroundRole默認(rèn)代理的前景畫刷Qt:CheckStateRole默認(rèn)代理的檢查框狀態(tài)Qt:UserRole用戶自定義的數(shù)據(jù)的起始位置模型(Model)headerData()函數(shù)返回固定的表頭數(shù)據(jù),設(shè)置水平表頭的標(biāo)題,具體代碼如下:QVariant
16、 ModelEx:headerData(int section, Qt:Orientation orientation, int role) const if(role=Qt:DisplayRole&orientation=Qt:Horizontal) return headersection; return QAbstractTableModel:headerData(section,orientation,role);模型(Model)(3)在源文件“main.cpp”中,將模型和視圖關(guān)聯(lián),具體代碼如下:#include #include modelex.h#include int mai
17、n(int argc,char *argv) QApplication a(argc,argv); ModelEx modelEx; QTableView view; view.setModel(&modelEx); view.setWindowTitle(QObject:tr(modelEx); view.resize(400,400); view.show(); return a.exec();(4)運(yùn)行效果如圖8.3所示。第8章 Qt 5模型/視圖結(jié)構(gòu)視圖(View)視圖(View)【例】(難度中等)(CH803)通過利用自定義的View,實(shí)現(xiàn)一個對TableModel的表格數(shù)據(jù)進(jìn)行顯示
18、的柱狀統(tǒng)計(jì)圖例子,以此介紹如何應(yīng)用自定義的View。實(shí)現(xiàn)效果如圖8.4所示。視圖(View)具體實(shí)現(xiàn)步驟如下。(1)完成主窗體,以便顯示View的內(nèi)容。MainWindow 類繼承自QMainWindow類,作為主窗體。以下是頭文件“mainwindow.h”的具體代碼。#include #include #include #include #include #include #include class MainWindow : public QMainWindow Q_OBJECTpublic: MainWindow(QWidget *parent = 0); MainWindow();
19、void createAction(); void createMenu(); void setupModel(); void setupView();private: QMenu *fileMenu; QAction *openAct; QStandardItemModel *model; QTableView *table; QSplitter *splitter;視圖(View)(2)下面是源文件“mainwindow.cpp”中的具體代碼:#include mainwindow.h#include MainWindow:MainWindow(QWidget *parent) : QMa
20、inWindow(parent) createAction(); createMenu(); setupModel(); setupView(); setWindowTitle(tr(View Example); resize(600,600);MainWindow:MainWindow()void MainWindow:createAction() openAct = new QAction(tr(打開),this);void MainWindow:createMenu() fileMenu = new QMenu(tr(文件),this); fileMenu-addAction(openA
21、ct); menuBar()-addMenu(fileMenu);視圖(View)setupModel()函數(shù)新建一個Model,并設(shè)置表頭數(shù)據(jù),其具體實(shí)現(xiàn)代碼如下:void MainWindow:setupModel() model = new QStandardItemModel(4,4,this); model-setHeaderData(0,Qt:Horizontal,tr(部門); model-setHeaderData(1,Qt:Horizontal,tr(男); model-setHeaderData(2,Qt:Horizontal,tr(女); model-setHeaderD
22、ata(3,Qt:Horizontal,tr(退休);視圖(View)setupView()函數(shù)的具體實(shí)現(xiàn)代碼如下:void MainWindow:setupView() table = new QTableView;/新建一個QTableView對象 table-setModel(model);/為QTableView對象設(shè)置相同的Model QItemSelectionModel *selectionModel=new QItemSelectionModel(model);/(a) table-setSelectionModel(selectionModel); connect(selec
23、tionModel,SIGNAL(selectionChanged(QItemSelection, ItemSelection),table,SLOT(selectionChanged(QItemSelection,QItemSelection);/(b) splitter = new QSplitter; splitter-setOrientation(Qt:Vertical); splitter-addWidget(table); setCentralWidget(splitter);其中,(a) QItemSelectionModel *selectionModel=new QItemS
24、electionModel(model):新建一個QItemSelectionModel對象作為QTableView對象使用的選擇模型。(b) connect(selectionModel,SIGNAL(selectionChanged(QItemSelection,ItemSelection),table,SLOT (selectionChanged(QItemSelection,QItemSelection):連接選擇模型的selectionChanged()信號與QTableView對象的selectionChanged()槽函數(shù),以便使自定義的HistogramView對象中的選擇變化
25、能夠反映到QTableView對象的顯示中。視圖(View)(3)此時,運(yùn)行效果如圖8.5所示。視圖(View)以上只是實(shí)現(xiàn)了簡單的主窗體框架顯示,還沒有完成事件。具體實(shí)現(xiàn)步驟如下。(1)在頭文件“mainwindow.h”中添加代碼如下:public: void openFile(QString);public slots: void slotOpen();(2)在源文件mainwindow.cpp中添加代碼如下:#include #include #include #include 其中,在createAction()函數(shù)中添加代碼如下:connect(openAct,SIGNAL(tri
26、ggered(),this,SLOT(slotOpen();視圖(View)slotOpen()槽函數(shù)完成打開標(biāo)準(zhǔn)文件對話框,具體代碼如下:void MainWindow:slotOpen() QString name; name = QFileDialog:getOpenFileName(this,打開,.,histogram files (*.txt); if (!name.isEmpty() openFile(name);openFile()函數(shù)完成打開所選的文件內(nèi)容,其具體實(shí)現(xiàn)代碼。新建一個文本文件,命名為“histogram.txt”,保存在項(xiàng)目D:QtCH8CH803build-V
27、iewEx-Desktop_Qt_5_11_1_MinGW_32bit-Debug目錄下,加載文件數(shù)據(jù)后的運(yùn)行效果如圖8.6所示。視圖(View)具體實(shí)現(xiàn)步驟如下。(1)自定義HistogramView類繼承自QAbstractItemView類,用于對表格數(shù)據(jù)進(jìn)行柱狀圖顯示。下面是頭文件“histogramview.h”的具體代碼。其中,(a) visualRect()、scrollTo()、indexAt()、moveCursor()、horizontalOffset()、verticalOffset()、isIndexHidden()、setSelection()和visualRegio
28、nForSelection():QAbstractItemView 類中的純虛函數(shù)。這些純虛函數(shù)不一定都要實(shí)現(xiàn),可以根據(jù)需要選擇性地實(shí)現(xiàn),但一定要聲明。(b) QModelIndex indexAt(const QPoint &point)const:當(dāng)鼠標(biāo)在視圖中單擊或位置發(fā)生改變時被觸發(fā),它返回鼠標(biāo)所在點(diǎn)的QModelIndex值。(c) void mousePressEvent(QMouseEvent *event):柱狀統(tǒng)計(jì)圖可以被鼠標(biāo)單擊選擇,選中后以不同的方式顯示。(d)void selectionChanged(const QItemSelection &selected,con
29、st QItemSelection &deselected):當(dāng)數(shù)據(jù)項(xiàng)選擇發(fā)生變化時,此槽函數(shù)將響應(yīng)。(e) void dataChanged(const QModelIndex &topLeft,const QModelIndex &bottomRight):當(dāng)模型中的數(shù)據(jù)發(fā)生變更時,此槽函數(shù)將響應(yīng)。(f) void setSelection(const QRect &rect,QItemSelectionModel:SelectionFlags flags):將位于QRect內(nèi)的數(shù)據(jù)項(xiàng)按照SelectionFlags(描述被選擇的數(shù)據(jù)項(xiàng)以何種方式進(jìn)行更新)指定的方式進(jìn)行更新。(g) QIt
30、emSelectionModel *selections:用于保存與視圖選擇項(xiàng)相關(guān)的內(nèi)容。(h) QList MRegionList:用于保存其中某一類型柱狀圖的區(qū)域范圍,而每個區(qū)域是QList中的一個值。視圖(View)(2)源文件“histogramview.cpp”的具體代碼。其中,(a) QPainter painter(viewport():以viewport()作為繪圖設(shè)備新建一個QPainter對象。(b) if(selections-isSelected(index) else:使用不同畫刷顏色區(qū)別選中與未被選中的數(shù)據(jù)項(xiàng)。(c) painter.drawRect(QRect(p
31、osM,y0-male*10,width,male*10):根據(jù)當(dāng)前數(shù)據(jù)項(xiàng)的值按比例繪制一個方形表示此數(shù)據(jù)項(xiàng)。(d) MRegionList.insert(row,regionM):將此數(shù)據(jù)所占據(jù)的區(qū)域保存到MRegionList列表中,為后面的數(shù)據(jù)項(xiàng)選擇做準(zhǔn)備。(e) 從int posF=x0+30語句到posF+=50語句之間的代碼段:完成了表格第2列數(shù)據(jù)的柱狀統(tǒng)計(jì)圖的繪制。同樣,使用不同的畫刷顏色區(qū)別選中與未被選中的數(shù)據(jù)項(xiàng),同時保存每個數(shù)據(jù)項(xiàng)所占的區(qū)域至FRegionList列表中。(f) 從int posS=x0+40語句到posS+=50語句之間的代碼段:完成了表格第3列數(shù)據(jù)的柱狀統(tǒng)
32、計(jì)圖的繪制。視圖(View)dataChanged()函數(shù)實(shí)現(xiàn)當(dāng)Model中的數(shù)據(jù)更改時,調(diào)用繪圖設(shè)備的update()函數(shù)進(jìn)行更新,反映數(shù)據(jù)的變化。具體實(shí)現(xiàn)代碼如下:void HistogramView:dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight) QAbstractItemView:dataChanged(topLeft,bottomRight); viewport()-update();setSelectionModel()函數(shù)為selections賦初值,具體代碼如下:void Histo
33、gramView:setSelectionModel(QItemSelectionModel *selectionModel) selections=selectionModel;視圖(View)(3)下面的工作是完成對選擇項(xiàng)的更新。selectionChanged()函數(shù)中完成當(dāng)數(shù)據(jù)項(xiàng)發(fā)生變化時調(diào)用update()函數(shù),重繪繪圖設(shè)備即可工作。此函數(shù)是將其他View中的操作引起的數(shù)據(jù)項(xiàng)選擇變化反映到自身View的顯示中。具體代碼如下:void HistogramView:selectionChanged(const QItemSelection &selected, const QItemSe
34、lection &deselected) viewport()-update();鼠標(biāo)按下事件函數(shù)mousePressEvent(),在調(diào)用setSelection()函數(shù)時確定鼠標(biāo)單擊點(diǎn)是否在某個數(shù)據(jù)項(xiàng)的區(qū)域內(nèi),并設(shè)置選擇項(xiàng)。具體代碼如下:void HistogramView:mousePressEvent(QMouseEvent *event) QAbstractItemView:mousePressEvent(event); setSelection(QRect(event-pos().x(),event-pos().y(),1,1),QItemSelectionModel:Select
35、Current);視圖(View)setSelection()函數(shù)的具體代碼如下:void HistogramView:setSelection(const QRect &rect,QItemSelectionModel:SelectionFlags flags) int rows = model()-rowCount(rootIndex();/獲取總行數(shù) int columns = model()-columnCount(rootIndex();/獲取總列數(shù) QModelIndex selectedIndex;/(a) for(int row=0; rowrows; +row)/(b) fo
36、r(int column=1; columnindex(row,column,rootIndex(); QRegion region=itemRegion(index);/(c) if(!ersected(rect).isEmpty() selectedIndex = index; if(selectedIndex.isValid()/(d) selections-select(selectedIndex,flags); else QModelIndex noIndex; selections-select(noIndex,flags); 視圖(View)其中,(a) QM
37、odelIndex selectedIndex:用于保存被選中的數(shù)據(jù)項(xiàng)的Index值。此處只實(shí)現(xiàn)用鼠標(biāo)單擊選擇,而沒有實(shí)現(xiàn)用鼠標(biāo)拖曳框選,因此,鼠標(biāo)動作只可能選中一個數(shù)據(jù)項(xiàng)。若需實(shí)現(xiàn)框選,則可使用QModelIndexList來保存所有被選中的數(shù)據(jù)項(xiàng)的Index值。(b) for(int row=0;rowrows;+row)for(int column=1;columnsetSelectionModel(selectionModel):新建的QItemSelectionModel對象作為QTableView對象和HistogramView對象使用的選擇模型。(b)connect(select
38、ionModel,SIGNAL(selectionChanged(QItemSelection,QItemSelection),histogram,SLOT(selectionChanged(QItemSelection,QItemSelection):連接選擇模型的selection Changed()信號與HistogramView對象的selectionChanged()槽函數(shù),以便使QTableView對象中的選擇變化能夠反映到自定義的HistogramView對象的顯示中。(6)運(yùn)行效果如圖8.4所示。第8章 Qt 5模型/視圖結(jié)構(gòu)代理(Delegate)代理(Delegate)【例
39、】(難度中等)(CH804)利用Delegate設(shè)計(jì)表格中控件,如圖8.7所示。代理(Delegate)實(shí)現(xiàn)步驟如下。(1)首先,加載表格數(shù)據(jù),以便后面的操作。源文件“main.cpp”中的具體代碼。(2)選擇“構(gòu)建”“構(gòu)建項(xiàng)目DateDelegate”菜單項(xiàng),首先按照如圖8.8所示的格式編輯本例所用的數(shù)據(jù)文件“test.txt”,保存在項(xiàng)目D:QtCH8 CH804build-DateDelegate- Desktop_Qt_5_11_1_MinGW_32bit-Debug目錄下,然后運(yùn)行程序,效果如圖8.7所示。代理(Delegate)(3)在圖8.7中,使用手動的方式實(shí)現(xiàn)對生日的錄入編輯
40、。下面使用日歷編輯框QDateTimeEdit 控件實(shí)現(xiàn)對生日的編輯,用自定義的Delegate來實(shí)現(xiàn)。(4)DateDelegate 繼承自QItemDelegate類。頭文件“datedelegate.h”中的具體代碼如下:#include class DateDelegate : public QItemDelegate Q_OBJECTpublic: DateDelegate(QObject *parent = 0); QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem & option, const QM
41、odelIndex &index) const;/(a) void setEditorData(QWidget *editor, const QModelIndex &index) const;/(b) void setModelData(QWidget *editor, QAbstractItemModel *model, const QModel Index &index) const; /將Delegate中對數(shù)據(jù)的改變更新至Model中 void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem & opt
42、ion, const QModelIndex &index) const;/更新控件區(qū)的顯示;其中,(a) QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const:完成創(chuàng)建控件的工作,創(chuàng)建由參數(shù)中的QModelIndex對象指定的表項(xiàng)數(shù)據(jù)的編輯控件,并對控件的內(nèi)容進(jìn)行限定。(b) void setEditorData(QWidget *editor, const QModelIndex &index) const:設(shè)置控件顯示的數(shù)據(jù),將M
43、odel中的數(shù)據(jù)更新至Delegate中,相當(dāng)于一個初始化工作。代理(Delegate)(5)源文件“datedelegate.cpp”中的具體代碼如下:#include datedelegate.h#include DateDelegate:DateDelegate(QObject *parent):QItemDelegate(parent)createEditor()函數(shù)的具體實(shí)現(xiàn)代碼如下:QWidget *DateDelegate:createEditor(QWidget *parent,const QStyleOptionView Item &/*option*/,const QMod
44、elIndex &/*index*/) const QDateTimeEdit *editor = new QDateTimeEdit(parent);/(a) editor-setDisplayFormat(yyyy-MM-dd);/(b) editor-setCalendarPopup(true);/(c) editor-installEventFilter(const_cast(this);/(d) return editor;其中,(a) QDateTimeEdit *editor = new QDateTimeEdit(parent):新建一個QDateTimeEdit對象作為編輯時
45、的輸入控件。(b) editor-setDisplayFormat(yyyy-MM-dd):設(shè)置該QDateTimeEdit對象的顯示格式為yyyy-MM-dd,此為ISO標(biāo)準(zhǔn)顯示方式。代理(Delegate)日期的顯示格式有多種,可設(shè)定為:yy.MM.dd 19.01.01d.MM.yyyy 1.01.2019其中,y表示年,M表示月(必須大寫),d表示日。(c) editor-setCalendarPopup(true):設(shè)置日歷選擇的顯示以Popup的方式,即下拉菜單方式顯示。(d) editor-installEventFilter(const_cast(this):調(diào)用QObject
46、類的installEvent Filter()函數(shù)安裝事件過濾器,使DateDelegate能夠捕獲QDateTimeEdit對象的事件。代理(Delegate)setEditorData()函數(shù)的具體代碼如下:void DateDelegate:setEditorData(QWidget *editor, const QModelIndex &index) const QString dateStr= index.model()-data(index).toString();/(a) QDate date = QDate:fromString(dateStr,Qt:ISODate);/(b)
47、 QDateTimeEdit *edit=static_cast(editor);/(c) edit-setDate(date);/設(shè)置控件的顯示數(shù)據(jù)其中,(a) QString dateStr= index.model()-data(index).toString():獲取指定index數(shù)據(jù)項(xiàng)的數(shù)據(jù)。調(diào)用QModelIndex的model()函數(shù)可獲得提供index的Model對象,data()函數(shù)返回的是一個QVariant對象,toString()函數(shù)將它轉(zhuǎn)換為一個QString類型數(shù)據(jù)。(b) QDate date = QDate:fromString(dateStr,Qt:ISODa
48、te):通過QDate的fromString()函數(shù)將以QString類型表示的日期數(shù)據(jù)轉(zhuǎn)換為QDate類型。Qt:ISODate表示QDate類型的日期是以ISO格式保存的,這樣最終轉(zhuǎn)換獲得的QDate數(shù)據(jù)也是ISO格式,使控件顯示與表格顯示保持一致。(c) QDateTimeEdit *edit=static_cast(editor):將editor轉(zhuǎn)換為QDateTimeEdit對象,以獲得編輯控件的對象指針。代理(Delegate)setModelData()函數(shù)的具體代碼如下:void DateDelegate:setModelData(QWidget *editor,QAbstra
49、ctItemModel *model, const QModelIndex &index) const QDateTimeEdit *edit=static_cast(editor);/(a) QDate date = edit-date();/(b) model-setData(index,QVariant(date.toString(Qt:ISODate);/(c)其中,(a) static_cast(editor):通過緊縮轉(zhuǎn)換獲得編輯控件的對象指針。(b) QDate date = edit-date():獲得編輯控件中的數(shù)據(jù)更新。(c) model-setData(index,QVa
50、riant(date.toString(Qt:ISODate):調(diào)用setData()函數(shù)將數(shù)據(jù)修改更新到Model中。updateEditorGeometry()函數(shù)的具體代碼如下:void DateDelegate:updateEditorGeometry(QWidget *editor,const QStyleOptionViewItem &option,const QModelIndex &index) const editor-setGeometry(option.rect);代理(Delegate)(6)在“main.cpp”文件中添加如下代碼: #include datedele
51、gate.h在語句tableView.setModel(&model);后面添加如下代碼:DateDelegate dateDelegate;tableView.setItemDelegateForColumn(1,&dateDelegate);(7)此時運(yùn)行程序,雙擊第1行第2列,將顯示如圖8.9所示的日歷編輯框控件。代理(Delegate)下面使用下拉列表框QComboBox控件實(shí)現(xiàn)對職業(yè)類型的輸入編輯,使用自定義的Delegate實(shí)現(xiàn)。(1)ComboDelegate繼承自QItemDelegate類。頭文件“combodelegate.h”中的具體代碼如下:#include class
52、 ComboDelegate : public QItemDelegate Q_OBJECTpublic: ComboDelegate(QObject *parent = 0); QWidget *createEditor(QWidget *parent,const QStyleOptionViewItem &option,constQModelIndex&index) const; void setEditorData(QWidget *editor, const QModelIndex &index) const; void setModelData(QWidget *editor, QA
53、bstractItemModel *model, const QModel Index &index) const; void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const;代理(Delegate)(2)源文件“combodelegate.cpp”中的具體代碼如下:#include combodelegate.h#include ComboDelegate:ComboDelegate(QObject *parent):QItemD
54、elegate(parent)createEditor()函數(shù)中創(chuàng)建了一個QComboBox控件,并插入可顯示的條目,安裝事件過濾器。具體代碼如下:QWidget *ComboDelegate:createEditor(QWidget *parent,const QStyleOptionView Item &/*option*/,const QModelIndex &/*index*/) const QComboBox *editor = new QComboBox(parent); editor-addItem(工人); editor-addItem(農(nóng)民); editor-addItem(
55、醫(yī)生); editor-addItem(律師); editor-addItem(軍人); editor-installEventFilter(const_cast(this); return editor;代理(Delegate)setEditorData()函數(shù)中更新了Delegate控件中的數(shù)據(jù)顯示,具體代碼如下:void ComboDelegate:setEditorData(QWidget *editor,const QModelIndex &index) const QString str =index.model()-data(index).toString(); QComboBo
56、x *box = static_cast(editor); int i=box-findText(str); box-setCurrentIndex(i);setModelData()函數(shù)中更新了Model中的數(shù)據(jù),具體代碼如下:void ComboDelegate:setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const QComboBox *box = static_cast(editor); QString str = box-currentText(); model-
57、setData(index,str);代理(Delegate)updateEditorGeometry()函數(shù)的具體代碼如下:void ComboDelegate:updateEditorGeometry(QWidget *editor,const QStyleOptionViewItem &option, const QModelIndex &/*index*/) const editor-setGeometry(option.rect);在“main.cpp”文件中添加以下內(nèi)容: #include combodelegate.h在語句tableView.setModel(&model)的后面添加以下代碼:ComboDelegate comboDelegate;tableView.setItemDelegateForColumn(2,&comboDelegate);代理(Delegate)此時
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度林產(chǎn)品加工與許可經(jīng)營合同2篇
- 二零二五年度俄語企業(yè)內(nèi)部培訓(xùn)翻譯合同
- 二零二五年度房地產(chǎn)廣告經(jīng)紀(jì)服務(wù)合同3篇
- 2025年度消防工程清包及消防產(chǎn)品采購合同范本3篇
- 海南醫(yī)學(xué)院《法律社會學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 海南師范大學(xué)《建筑物理(熱)》2023-2024學(xué)年第一學(xué)期期末試卷
- 二零二五年度數(shù)據(jù)中心專用個人機(jī)柜租賃及云服務(wù)接入合同3篇
- 二零二五年度杭州建筑工程裝修設(shè)計(jì)與施工合同3篇
- 數(shù)據(jù)庫系統(tǒng)課程設(shè)計(jì)任務(wù)書(知識研究)
- 網(wǎng)頁設(shè)計(jì)課程設(shè)計(jì)成品
- T-CERDS 3-2022 企業(yè)ESG評價(jià)體系
- 落實(shí)國家組織藥品集中采購使用檢測和應(yīng)急預(yù)案
- 報(bào)價(jià)經(jīng)理崗位職責(zé)
- 裝飾裝修施工及擔(dān)保合同
- 《廣東省普通高中學(xué)生檔案》模板
- 公司章程范本下載
- GB/T 41120-2021無損檢測非鐵磁性金屬材料脈沖渦流檢測
- 青年心理學(xué)第五講(戀愛心理)
- ITV系列電氣比例閥英文說明書
- SL 537-2011 水工建筑物與堰槽測流規(guī)范
- 質(zhì)量管理-AQL抽樣基礎(chǔ)知識培訓(xùn)課件
評論
0/150
提交評論