Qt基礎(chǔ)教程之自定義對(duì)話框及調(diào)用方法_第1頁(yè)
Qt基礎(chǔ)教程之自定義對(duì)話框及調(diào)用方法_第2頁(yè)
Qt基礎(chǔ)教程之自定義對(duì)話框及調(diào)用方法_第3頁(yè)
Qt基礎(chǔ)教程之自定義對(duì)話框及調(diào)用方法_第4頁(yè)
Qt基礎(chǔ)教程之自定義對(duì)話框及調(diào)用方法_第5頁(yè)
已閱讀5頁(yè),還剩13頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、在一個(gè)應(yīng)用程序設(shè)計(jì)中,為了實(shí)現(xiàn)一些特定的功能,必領(lǐng)設(shè)計(jì)自定義對(duì)話框自定義對(duì)話框的設(shè)計(jì)一般從 QDialog繼承,并且可以采用UI設(shè)計(jì)器可視化地 設(shè)計(jì)對(duì)話框。對(duì)話框的調(diào)用一般包括創(chuàng)建對(duì)話框、傳遞數(shù)據(jù)給對(duì)話框、顯示對(duì) 話框獲取輸入、判斷對(duì)話框單擊按鈕的返回類型、獲取對(duì)話框輸入數(shù)據(jù)等過程。本節(jié)將通過實(shí)例samp6_2來詳細(xì)介紹這些原理。圖1是實(shí)例samp6_2的主窗 口,及其設(shè)置表格行列加勺對(duì)話框。圖1實(shí)例samp6_2主窗口及其設(shè)置表格行列數(shù)的對(duì)話框主窗 口采用 QTableView 和 QStandardltemModel、QltemSelectionModel 構(gòu)成一個(gè)通用的數(shù)據(jù)表格編輯器,設(shè)

2、計(jì)了3個(gè)對(duì)話框,分別具有不同的功能,并且展示對(duì)話框不同調(diào)用方式的特點(diǎn):? 設(shè)置表格行列數(shù)對(duì)話框 QWDialogSize該對(duì)話框每次動(dòng)態(tài)創(chuàng)建,以模態(tài)方式顯示(必須關(guān)閉此對(duì)話框才可以返回主窗 口操作),對(duì)話框關(guān)閉后獲取返回值,用于設(shè)置主窗口的表格行數(shù)和列數(shù),并 且刪除對(duì)話框?qū)ο螅尫艃?nèi)存。這種對(duì)話框創(chuàng)建和調(diào)用方式適用于比較簡(jiǎn)單,不需要從主窗口傳遞大量數(shù)據(jù)做 初始化的對(duì)話框,調(diào)用后刪除對(duì)話框?qū)ο罂梢怨?jié)約內(nèi)存。? 設(shè)置表頭標(biāo)題對(duì)話框QWDialogHeaders圖2是設(shè)置表格表頭標(biāo)題的對(duì)話框,該對(duì)話框在父窗口(本例中就是主窗口) 存續(xù)期間只創(chuàng)建一次,創(chuàng)建時(shí)傳遞表格表頭字符串列表給對(duì)話框,在對(duì)話框里

3、編輯表頭標(biāo)題后,主窗口獲取編輯之后的表頭標(biāo)題。E設(shè)置表頭標(biāo)題? X表頭標(biāo)題*取梢姓名 issiy 年齡 籍貫圖2設(shè)置表格表頭標(biāo)題對(duì)話框注意,對(duì)話框以模態(tài)方式顯示,關(guān)閉后只是隱藏,并不刪除對(duì)象,下次再調(diào)用時(shí)只是打開己創(chuàng)建的對(duì)話框?qū)ο?。這種創(chuàng)建和調(diào)用方式適用于比較復(fù)雜的對(duì)話框,需要從父窗口傳遞大量數(shù)據(jù)做 對(duì)話框初始化。下次調(diào)用時(shí)不需要重復(fù)初始化,能提高對(duì)話框調(diào)用速度,但是 會(huì)一直占用內(nèi)存,直到父窗口刪除時(shí),對(duì)話框才從內(nèi)存中刪除。? 單元格定位與文字設(shè)置對(duì)話框 QWDialogLocate圖3是單元格定位和文字設(shè)置對(duì)話框,該對(duì)話框以非模態(tài)方式調(diào)用,顯示對(duì)話 框時(shí)還可以對(duì)主窗口進(jìn)行操作,對(duì)話框只是浮動(dòng)

4、在窗口上方。在對(duì)話框里可以 定位主窗口表格的某個(gè)單元格 并設(shè)置其文字內(nèi)容,在主窗口上的表格中單擊鼠 標(biāo)時(shí),單元格的行號(hào)、列號(hào)也會(huì)更新在對(duì)話框中。對(duì)話框關(guān)閉后將自動(dòng)刪除, 釋放內(nèi)存。EJ單元格定位與文字設(shè)置列號(hào)。 :列增A設(shè)定文字徐關(guān)閉行號(hào) 2 C 行增 設(shè)定文字李四圖3浮動(dòng)于主窗口上方的對(duì)話框,可交互操作這種對(duì)話框適用于主窗口與對(duì)話框需要交互操作的情況,例如用于查找和替換 操作的對(duì)話框。對(duì)話框QWDialogSize的創(chuàng)建和使用倉(cāng)I建對(duì)話框QWDialogSize實(shí)例主窗口從 QMainWindow繼承,主窗口用一個(gè) QTableView 組件作為界面中 心組件,設(shè)計(jì)幾個(gè)Action 用于創(chuàng)建

5、主工具欄按鈕。主窗口采用| QStandardItemModel作為數(shù)據(jù)模型,QltemSelectionModel 作為選擇模型,界 面和主窗口 Model/View結(jié)構(gòu)的設(shè)計(jì)前面已經(jīng)講過,本節(jié)不再詳述。在項(xiàng)目主窗口建立后,要?jiǎng)?chuàng)建如圖 1所示的設(shè)置表格行列數(shù)的對(duì)話框,單擊 Qt Creator 的菜單項(xiàng) File->New File or Project ,選擇 Qt 類別下的“Qt Designer Form Class ”,創(chuàng)建可視化設(shè)計(jì)的對(duì)話框類。在隨后出現(xiàn)的向?qū)Ю铮x擇窗口模板為 Dialog without Buttons ,并設(shè)置自定義對(duì)話框的類名設(shè)置創(chuàng)建的對(duì)話框類名稱為

6、QWDialogSize ,系統(tǒng)自動(dòng)生成qwdialogsize.h 、 qwdialogsize.cpp 和 qwdialogsize.ui 3個(gè)文件。QWDialogSize對(duì)話框的界面設(shè)計(jì)在UI設(shè)計(jì)器里進(jìn)行,放置界面組件并設(shè)置好 布局。對(duì)話框的調(diào)用和返回值設(shè)計(jì)QWDialogSize對(duì)話框的界面時(shí),在上面放置了兩個(gè) QPushButton按鈕, 并分別命名為btnOK和btnCancel ,分別是“確定”和“取消”按鈕,用于獲 取對(duì)話框運(yùn)行時(shí)用戶的選擇。那么,如何獲得用戶操作的返回值呢?在信號(hào)與槽編輯器里,將 btnOK的clicked。信號(hào)與對(duì)話框的accept() 槽關(guān)聯(lián),將btnC

7、ancel的clicked。信號(hào)與對(duì)話框的reject()槽關(guān)聯(lián)即可,如圖4所示。 JI發(fā)送者信號(hào)接收者槽btnOKcLickedt)Q?DialogSizeaccept 0btnCancelclicked。Q7Dia.logSLzsrejectOAction Edi tor Sigaals & Slots Edit。丁圖4對(duì)話框設(shè)計(jì)時(shí)“確定”和 “取消”按鈕的信號(hào)與槽關(guān)聯(lián)單擊“確定”按鈕會(huì)執(zhí)行accept() 槽(或在代碼里調(diào)用accept() 槽函數(shù)也 是一樣的),這會(huì)關(guān)閉對(duì)話框(默認(rèn)情況下,對(duì)話框只是被隱藏,并不被刪除),并返回QDialog:Accepted 作為exec()函

8、數(shù)的返回值。單擊“取消”按鈕會(huì)執(zhí)行reject() 槽函數(shù),也會(huì)關(guān)閉對(duì)話框,并返回 QDialog:Rejected 作為exec()函數(shù)的返回值。完成后的QWDialogSize的類完整定義如下:1. class QWDialogSize : public QDialog2. 3. Q_OBJECT4. public :5. explicit QWDialogSize(QWidget *parent = 0);6. QWDialogSize();7. int rowCount();/獲取對(duì)話框輸入的行數(shù)8. int columnCount();/獲取對(duì)話框輸入的列數(shù)9. void setRo

9、wColumn(int row, int column); /初始對(duì)話框上兩個(gè)SpinBox 的值10. private slots:11. private :12. Ui:QWDialogSize *ui;13. ;在QWDialogSize的類定義中定義3個(gè)public 函數(shù),用于與對(duì)話框調(diào)用者的 數(shù)據(jù)交互。因?yàn)榇绑w上的組件都是私有成員,外界不能直接訪問界面組件,只 能通過接口函數(shù)訪問。下面是類的接口函數(shù)實(shí)現(xiàn)代碼。在析構(gòu)函數(shù)中彈出一個(gè)消息提示對(duì)話框,以便 觀察對(duì)話框是何時(shí)被刪除的。1. QWDialogSize:QWDialogSize、2. 3. QMessageBox:informat

10、ion ( this,"提示","設(shè)置表格行列數(shù)對(duì)話框被刪 除)delete ui;4. 5.6. int QWDialogSize:rowCount()7. /用于主窗口調(diào)用獲得行數(shù)的輸入值8. return ui->spinBoxRow->value();9. 10.1.1 int QWDialogSize:columnCount()12 ./用于主窗口調(diào)用獲得列數(shù)的輸入值13 . return ui->spinBoxColumn->value();14 .15 .16 .void QWDialogSize:setRowColumn(i

11、nt row, int column)17 . /初始化數(shù)據(jù)顯示18 . ui->spinBoxRow->setValue(row);19 . ui->spinBoxColumn->setValue(column);20 .下面是主窗口中的“設(shè)置行數(shù)列數(shù)”工具欄按鈕的響應(yīng)代碼,用于創(chuàng)建、顯示 對(duì)話框,并讀取對(duì)話框上設(shè)置的行數(shù)、列數(shù)。1. void MainWindow:on_actTab_SetSize_triggered()2. /模態(tài)對(duì)話框,動(dòng)態(tài)創(chuàng)建,用過后刪除3. QWDialogSize *dlgTableSize= newQWDialogSize( this

12、);4. Qt:WindowFlags flags=dlgTableSize->windowFlags();5. dlgTableSize->setWindowFlags(flags |Qt:MSWindowsFixedSizeDialogHint);6. dlgTableSize->setRowColumn(theModel->rowCount(),theModel->columnCount ();7. int ret=dlgTableSize->exec () ;/以模態(tài)方式顯示對(duì)話框8. if (ret=QDialog:Accepted)9. /OK按

13、鈕被按下,獲取對(duì)話框上的輸入,設(shè)置行數(shù)和列數(shù)10. int cols=dlgTableSize->columnCount();11. theModel->setColumnCount(cols);12. int rows=dlgTableSize->rowCount();13. theModel->setRowCount(rows);14. 15. delete dlgTableSize;16. 從代碼中可以看到,每次單擊此工具欄按鈕時(shí),對(duì)話框都被重新創(chuàng)建。創(chuàng)建后用QDialog的setWindowFlags() 函數(shù)將對(duì)話框設(shè)置為固定大小,然后調(diào)用對(duì) 話框的自定義函數(shù)

14、setRowColumn(),將主窗口數(shù)據(jù)模型theModd的現(xiàn)有的行 數(shù)和列數(shù)顯示到對(duì)話框上的兩個(gè) SpinBox組件里。調(diào)用對(duì)話框的exec()函數(shù),以模態(tài)顯示的方式顯示對(duì)話框。模態(tài)顯示方式下, 用戶只能在對(duì)話框上操作,不能操作主窗口,主程序也在此處等待exec()函數(shù)的返回結(jié)果。當(dāng)用戶單擊“確定”按鈕關(guān)閉對(duì)話框后,exec()返回結(jié)果為QDialogxAccepted ,主程序獲得此返回結(jié)果后,通過對(duì)話框的自定義函數(shù) columnCount()和rowCount()獲得對(duì)話框上新輸入的列數(shù)和行數(shù),然后設(shè)置 為數(shù)據(jù)模型的列數(shù)和行數(shù)。最后使用delete 刪除創(chuàng)建的對(duì)話框?qū)ο螅尫艃?nèi)存。所以

15、,關(guān)閉對(duì)話框時(shí), 會(huì)出現(xiàn)QWDialogSize析構(gòu)函數(shù)里的消息提示對(duì)話框。注意,在對(duì)話框上單擊按鈕或關(guān)閉對(duì)話框時(shí),對(duì)話框只是隱藏(缺省的),而 并沒有從內(nèi)存中刪除。如果對(duì)話框一關(guān)閉就自動(dòng)刪除,則在后面調(diào)用對(duì)話框的 自定義函數(shù)獲得輸入的行數(shù)和列數(shù)時(shí)會(huì)出現(xiàn)嚴(yán)重錯(cuò)誤。對(duì)話框QWDialogHeaders的倉(cāng)1J建和使用對(duì)話框的生存期對(duì)話框的生存期是指它從創(chuàng)建到刪除的存續(xù)區(qū)間。前面介紹的設(shè)置表格行數(shù)和 列數(shù)的對(duì)話框的生存期只在調(diào)用它的按鈕的槽函數(shù)里,因?yàn)閷?duì)話框是動(dòng)態(tài)創(chuàng)建 的,調(diào)用結(jié)束后就會(huì)被刪除。而對(duì)于圖2所示的設(shè)置表頭標(biāo)題對(duì)話框,我們希望在主窗口里首次調(diào)用時(shí)創(chuàng)建 它,對(duì)話框關(guān)閉時(shí)并不刪除,只是隱藏

16、,下次調(diào)用時(shí)再次顯示此對(duì)話框。只有在主窗口釋放時(shí)該對(duì)話框才釋放,所以這個(gè)對(duì)話框的生存期在主窗口存續(xù)期間。QWDialogHeaders的定義和實(shí)現(xiàn)設(shè)置表頭標(biāo)題的對(duì)話框類是 QWDialogHeaders,它也是從QDialog繼承的可視 對(duì)話框類。其界面顯示使用 QListView 組件,用QStringListModel變量管理字符串列表數(shù)據(jù),構(gòu)成 Model/View 結(jié)構(gòu)。對(duì)話框上同樣有“確定”和“取消” 兩個(gè)按鈕,設(shè)置與對(duì)話框的accept() 和reject()槽關(guān)聯(lián)。QWDialogHeaders類的定義如下:1. class QWDialogHeaders : public QD

17、ialog2. 3. Q_OBJECT4. private :5. QStringListModel *model;6.7. public :8. explicit QWDialogHeaders(QWidget *parent = 0);9. QWDialogHeaders();10. void setHeaderList(QStringList& headers);11. QStringList headerList();12. private :13. Ui:QWDialogHeaders *ui;14. ;QWDialogSize類接口函數(shù)實(shí)現(xiàn)的代碼如下:1. QWDialog

18、Headers二QWDialogHeaders(QWidget *parent):2. QDialog(parent),3. ui( newUi:QWDialogHeaders)4. 5. ui->setupUi( this );6. model= newQStringListModel;7. ui->listView->setModel(model);8. 9.10. QWDialogHeaders:QWDialogHeaders()11. 12. QMessageBox:information( this ,"提示","設(shè)置表頭標(biāo)題對(duì)話框被刪

19、除");13. delete ui;14. 15.16. void QWDialogHeaders二setHeaderList(QStringList &headers)17K18 . model->setStringList(headers);19 .20 .21 .QStringList QWDialogHeaders二headerList()22 .23 . return model->stringList();24 .QWDialogHeaders對(duì)話框的使用因?yàn)橐谥鞔翱谥兄貜?fù)調(diào)用此對(duì)話框,所以在 MainWindow的private 部分定 義一個(gè)QW

20、DialogHeaders類型的指針變量,并且將此指針初始化設(shè)置為NULL,用于判斷對(duì)話框是否已經(jīng)被創(chuàng)建。在MainWindow中的定義如下:private:QWDialogHeaders *dlgSetHeaders=NULL;下面是主窗口工具欄上的“設(shè)置表頭標(biāo)題”按鈕的響應(yīng)代碼:1. void MainWindow:on_actTab_SetHeader_triggered()2. / 一次創(chuàng)建,多次調(diào)用,對(duì)話框關(guān)閉時(shí)只是隱藏3. if (dlgSetHeaders=NULL)/如果對(duì)象沒有被創(chuàng)建過,就創(chuàng)建對(duì)象4. dlgSetHeaders = newQWDialogHeaders(th

21、is );5.6. if (dlgSetHeaders->headerList().count()!=theModel->columnCount()7. /如果表頭列數(shù)變化,重新初始化8. QStringList strList;9. for (int i=0;i<theModel->columnCount();i+)/獲取現(xiàn)有的表頭標(biāo)題10. strList.append(theModel->headerData(i,Qt:Horizontal,Qt:DisplayRole).toString();11. dlgSetHeaders->setHeaderL

22、ist(strList);/用于對(duì)話框初始化顯示12. 13.14. int ret=dlgSetHeaders->exec();/以模態(tài)方式顯示對(duì)話框15. if (ret=QDialog:Accepted) OK鍵被按下16. 17. QStringList strList=dlgSetHeaders->headerList();/獲取對(duì)話框上修改后的StringList18. theModel->setHorizontalHeaderLabels(strList);/設(shè)置模型的表頭標(biāo)題19. 20. 在這段代碼中,首先判斷主窗口的成員變量dlgSetHeaders 是否

23、為NULL.,如果為NULL (初始化為NULL),說明對(duì)話框還沒有被創(chuàng)建,就創(chuàng)建對(duì)話框。初始化的工作是獲取主窗口數(shù)據(jù)模型現(xiàn)有的表頭標(biāo)題,然后調(diào)用對(duì)話框的自定 義函數(shù)setHeaderList(),設(shè)置其為對(duì)話框的數(shù)據(jù)源。使用exec()函數(shù)模態(tài)顯示對(duì)話框,然后在“確定”按鈕被單擊時(shí)獲取對(duì)話框 上輸入的字符串列表,設(shè)置為主窗口數(shù)據(jù)模型的表頭標(biāo)題。注意,這里在結(jié)束對(duì)話框操作后,并沒有使用delete 操作刪除對(duì)話框?qū)ο螅@樣對(duì)話框就只是隱藏,它還在內(nèi)存中。關(guān)閉對(duì)話框時(shí)不會(huì)出現(xiàn)析構(gòu)函數(shù)里的 消息提示對(duì)話框。對(duì)話框創(chuàng)建時(shí),傳遞主窗口的指針作為對(duì)話框的父對(duì)象,即:dlgSetHeaders = new

24、 QWDialogHeaders(this);所以,主窗口釋放時(shí)才會(huì)自動(dòng)刪除此對(duì)話框?qū)ο?,也就是程序退出時(shí)才刪除此 對(duì)話框,才會(huì)出現(xiàn) QWDialogHeaders析構(gòu)函數(shù)里的消息提示對(duì)話框。對(duì)話框QWDialogLocate的創(chuàng)建與使用非模態(tài)對(duì)話框前面設(shè)計(jì)的兩個(gè)對(duì)話框是以模態(tài)(Modal)方式顯示的,即用 QDialog:exec() 函數(shù)顯示。模態(tài)顯示的對(duì)話框不允許鼠標(biāo)再去單擊其他窗口,直到對(duì)話框退出。若使用QDialog:show(),則能以非模態(tài)(Modeless)方式顯不對(duì)話框。非模態(tài)顯示的對(duì)話框在顯示后繼續(xù)運(yùn)行主程序,還可以在主窗口上操作,主窗口和 非模態(tài)對(duì)話框之間可以交互控制,典

25、型的例子是文字編輯軟件里的“查找 /替換” 對(duì)話框。圖3中的單元格定位與文字設(shè)置對(duì)話框以非模態(tài)方式顯示,對(duì)話框類是 QWDialogLocate,它有如下的一些功能:?主窗口每次調(diào)用此對(duì)話框時(shí),就會(huì)創(chuàng)建此對(duì)話框?qū)ο?,并?StayOnTop的方式 顯示,對(duì)話框關(guān)閉時(shí)自動(dòng)刪除。?在對(duì)話框中可以定位主窗口上 Table View 組件的單元格,并設(shè)置單元格的文 字。?在主窗口的TableView 組件中單擊鼠標(biāo)時(shí),如果對(duì)話框己創(chuàng)建,則自動(dòng)更新對(duì) 話框上單元格的行號(hào)和列號(hào) SpinBox組件的值。? 主窗口上的actTab_Locate 用于調(diào)用對(duì)話框,調(diào)用時(shí) actTab_Locate 設(shè)置為 禁

26、用,當(dāng)對(duì)話框關(guān)閉時(shí)自動(dòng)使能 actTab_Locate 。這樣避免對(duì)話框顯示時(shí),在 主窗口上再次單擊“定位單元格”按鈕,疝在對(duì)話框關(guān)閉和釋放后,按鈕又恢 復(fù)為可用。對(duì)話框QWDialogLocate的類定義代碼如下(各接口函數(shù)的意義和實(shí)現(xiàn)在后面 介紹):1. class QWDialogLocate : public QDialog2. 3. Q_OBJECT4. private :5. void closeEvent(QCloseEvent *event);6. void showEvent(QShowEvent *event);7. public :8. explicit QWDialog

27、Locate(QWidget *parent = 0);9. QWDialogLocate();10. void setSpinRange(int rowCount, int colCount); /設(shè)置最大值11. void setSpinValue(int rowNo, int colNo);/設(shè)置初始值12. private slots:13. void on_btnSetText_clicked();14. private :15. Ui:QWDialogLocate *ui;16. ;對(duì)話框的創(chuàng)建與調(diào)用對(duì)話框QWDialogLocate是從QDialog繼承而來的可視化設(shè)計(jì)的對(duì)話框類

28、,其 界面設(shè)計(jì)不再詳述。為了在主窗口中也能操作對(duì)話框,需要保留對(duì)話框?qū)嵗龑?duì) 象名,所以在 MainWindow定義對(duì)話框QWDialogLocate的一個(gè)指針 dlgLocate ,并初始化為 NULLprivate:QWDialogLocate *dlgLocate=NULL;主窗口上的actTab Locate 用于調(diào)用此對(duì)話框,其triggered。信號(hào)槽函數(shù)代碼如下:1. void MainWindow:on_actTab_Locate_triggered()2. /創(chuàng)建StayOnTop的對(duì)話框,對(duì)話框關(guān)閉時(shí)自動(dòng)刪除3. /通過控制actTab_Locate的enable屬性避免重復(fù)

29、點(diǎn)擊4. ui->actTab_Locate->setEnabled( false );5. dlgLocate = newQWDialogLocate( this ); / 創(chuàng)建對(duì)話框,傳遞指針6. dlgLocate->setAttribute(Qt:WA_DeleteOnClose); /對(duì)話框關(guān)閉時(shí)自動(dòng)刪除對(duì)話框?qū)ο?,用于不需要讀取返回值的對(duì)話框7. Qt:WindowFlags flags=dlgLocate->windowFlags();/獲取已有 flags8. dlgLocate->setWindowFlags(flags | Qt:WindowS

30、taysOnTopHint); /設(shè)置對(duì)話框固定大小,StayOnTop9. /對(duì)話框初始化設(shè)置10. dlgLocate->setSpinRange(theModel->rowCount(),theModel->columnCount();11. QModelIndex curIndex=theSelection->currentIndex();12. if (curIndex.isValid()13. dlgLocate->setSpinValue(curIndex.row(),curIndex.column();14. dlgLocate->show(

31、); /非模態(tài)顯示對(duì)話框15. 在這段代碼中,使用 QWidget:setAttribute()函數(shù)將對(duì)話框設(shè)置為關(guān)閉時(shí)自動(dòng)刪除:dlgLocate->setAttribute(Qt:WA_DeleteOnClose);setAttribute()用于對(duì)窗體的一些屬性進(jìn)行設(shè)置,當(dāng)設(shè)置為Qt:WA_DeleteOnClose時(shí),窗口關(guān)閉時(shí)會(huì)自動(dòng)刪除,以釋放內(nèi)存。這與前面兩 個(gè)對(duì)話后是不同的,前面兩個(gè)對(duì)話框在關(guān)閉時(shí)缺省是隱藏自己,除非顯式地使 用delete進(jìn)行刪除。程序還調(diào)用QWidget:setWindowFlags()將對(duì)話框設(shè)置為StayOnTop顯示:dlgLocate->s

32、etWindowFlags(flags I Qt:WindowStaysOnTopHint);對(duì)話框窗口效果設(shè)置后,再設(shè)置其初始數(shù)據(jù),然后調(diào)用 show()顯示對(duì)話框。顯示對(duì)話框后,主程序繼續(xù)運(yùn)行,不會(huì)等待對(duì)話框的返回結(jié)果。鼠標(biāo)可以操作 主窗口上的界面,但是因?yàn)閍ctTab_Locate 被禁用了,不能再重復(fù)單擊“定位 單元格”按鈕。對(duì)話框中操作主窗口在對(duì)話框上單擊“設(shè)定文字”按鈕,會(huì)在主窗口中定位到指定的單元格,并設(shè) 定為輸入的文字,按鈕的代碼如下:1. void QWDialogLocate二on_btnSetText_clicked()2. /定位到單元格,并設(shè)置字符串3. int ro

33、w=ui->spinBoxRow->value(); / 行號(hào)4. int col=ui->spinBoxColumn->value();/歹!J號(hào)5.6. MainWindow *parWind = (MainWindow*)parentWidget(); /獲取主窗口7. parWind->setACellText(row,col,ui->edtCaption->text(); /設(shè)置單元格文字8. if (ui->chkBoxRow->isChecked() / 行增9. ui->spinBoxRow->setValue(

34、1+ui->spinBoxRow->value();10.11. if (ui->chkBoxColumn->isChecked()/歹!J增12. ui->spinBoxColumn->setValue(1+ui->spinBoxColumn->value();13. 想要在對(duì)話框中操作主窗口,就需要獲取主窗口對(duì)象,調(diào)用主窗口的函數(shù)并傳 遞參數(shù)。在上面的代碼中,通過下面一行語句獲得主窗口對(duì)象:MainWindow *parWind = (MainWindow*)parentWidget();parentWidget() 是QWidget類的一個(gè)

35、函數(shù),指向父窗口。在創(chuàng)建此對(duì)話框時(shí), 將主窗口的指針傳遞給對(duì)話框的構(gòu)造函數(shù),即:dlgLocate = new QWDialogLocate(this);所以,對(duì)話框的parentWidget指向主窗口。然后調(diào)用主窗口的一個(gè)自定義的 public函數(shù)setACellText(),傳遞行號(hào)、列號(hào)和字符串,由主窗口更新指定 單元格的文字。下面是主窗口的setACellText() 函數(shù)的代碼:1. void MainWindow:setACellText(int row, int column, QString text)2. /定位到單元格,并設(shè)置字符串3. QModelIndex index=

36、theModel->index(row,column);/獲取模型索引4. theSelection->clearSelection();清除現(xiàn)有選擇5. theSelection->setCurrentIndex(index,QItemSelectionModel:Select);/定位到單元格6. theModel->setData(index,text,Qt:DisplayRole);/設(shè)置單元格字符申7. 這樣就實(shí)現(xiàn)了在對(duì)話框里對(duì)主窗口進(jìn)行的操作,主要是獲取主窗口對(duì)象,然后 調(diào)用相應(yīng)的函數(shù)。主窗口中操作對(duì)話框在主窗口上用鼠標(biāo)單擊 TableView 組件的某個(gè)單

37、元格時(shí),如果單元格定位對(duì)話 框dlgLocate 己經(jīng)存在,就將單元格的行號(hào)、列號(hào)更新到對(duì)話框上,實(shí)現(xiàn)代碼 如下:1. void MainWindow:on_tableView_clicked( const QModelIndex &index)2. /單擊單元格時(shí),將單元格的行號(hào)、列號(hào)設(shè)置到對(duì)話框上3. if (dlgLocate!=NULL) 對(duì)話框存在4. dlgLocate->setSpinValue(index.row(),index.column();5. 因?yàn)橹鞔翱谥卸x了對(duì)話框的指針,只要它不為NULL.,就說明對(duì)話框存在,調(diào)用對(duì)話框的一個(gè)自定義函數(shù) setSpi

38、nValue(),刷新對(duì)話框顯示界面。QWDialogLocate 的 setSpinValue()函數(shù)實(shí)現(xiàn)如下:1. void QWDialogLocate:setSpinValue(int rowNo, int colNo)2. /設(shè)置SpinBox數(shù)值3. ui->spinBoxRow->setValue(rowNo);4. ui->spinBoxColumn->setValue(colNo);5. 窗口的CloseEvent 事件對(duì)話框和主窗口之間互相操作的關(guān)鍵是要有對(duì)方對(duì)象的指針,然后才能傳遞參數(shù)并調(diào)用對(duì)方的函數(shù)。在對(duì)話框關(guān)閉時(shí),還需要做一些處理:將主窗口的a

39、ctTab_Locate重新設(shè)置為使能,將主窗口的指向?qū)υ捒虻闹羔榙lgLocate 重新設(shè)置, NULLo由于對(duì)話框dlgLocate 是以非模態(tài)方式運(yùn)行的,程序無法等待對(duì)話框結(jié)束后作 出響應(yīng),但是可以利用窗口的 CloseEvent事件。事件(event)是由窗口系統(tǒng)產(chǎn)生的由某些操作觸發(fā)的特殊函數(shù),例如鼠標(biāo)操作、鍵盤操作的一些事件,還有窗口顯示、關(guān)閉、繪制等相關(guān)的事件。從 QWidget 繼承的窗口部件常用的事件函數(shù)有如下幾種:? closeEvent():窗口關(guān)閉時(shí)觸發(fā)的事件,通常在此事件做窗口關(guān)閉時(shí)的一些處 理,例如顯示一個(gè)對(duì)話框詢問是否關(guān)閉窗口。? showEvent():窗口顯示時(shí)

40、觸發(fā)的事件。? paintEvent():窗口繪制事件,第8章介紹繪圖時(shí)會(huì)用到。? mouseMoveEvent():鼠標(biāo)移動(dòng)事件。? mousePressEvent():鼠標(biāo)鍵按下事件。? mouseReleaseEvent():鼠標(biāo)鍵釋放事件。? keyPressEvent():鍵盤按鍵按下事件。? keyReleaseEvent():鍵盤按鍵釋放事件。要利用某個(gè)事件進(jìn)行一些處理,需要在窗口類里重定義事件函數(shù)并編寫響應(yīng)代碼。在后面的例子中,將逐漸演示一些事件的用法。在本例中,要利用對(duì)話框的closeEvent() 事件,在類定義中聲明了此事件的 函數(shù),其實(shí)現(xiàn)代碼如下:1. void QWD

41、ialogLocate二closeEvent(QCloseEvent *event)2. 窗口關(guān)閉事件,關(guān)閉時(shí)釋放本窗口3. MainWindow *parWind = (MainWindow*)parentWidget(); /獲取父窗口指針4. parWind->setActLocateEnable( true );/ 使能 actTab_Locate5. parWind->setDlgLocateNull();/將窗 口指針設(shè)置為 NULL6. 在closeEvent() 事件里,調(diào)用主窗口的兩個(gè)函數(shù),將 actTab_Locate 重新使 能,將主窗口內(nèi)指向?qū)υ捒虻闹羔樤O(shè)置

42、為NULL.主窗口中這兩片函數(shù)的實(shí)現(xiàn)代碼如下:1. void MainWindow:setActLocateEnable(bool enable)2. 3.ui->actTab_Locate->setEnabled(enable);4. 5. void MainWindow:setDlgLocateNull()6. 7. dlgLocate=NULL;8. 利用closeEvent() 事件,可以詢問窗口是否退出,例如為主窗口添加 closeEvent()事件的處理,代碼如下:1. void MainWindow:closeEvent(QCloseEvent *event)2. /

43、窗口關(guān)閉時(shí)詢問是否退出3. QMessageBox二StandardButton result=QMessageBox二question( this ," 確 認(rèn)","確定要退出本程序嗎?”,QMessageBox:Yes|QMessageBox:No|QMessageBox二Cancel,QMessageBox二N o);4. if (result=QMessageBox:Yes)5. event->accept();6. else7. event->ignore();8. 這樣,主窗口關(guān)閉時(shí)就會(huì)出現(xiàn)一個(gè)詢問對(duì)話框,如果不單擊“Yes”按鈕,程序就不

44、關(guān)閉;否則應(yīng)用程序結(jié)束。利用信號(hào)與槽實(shí)現(xiàn)交互操作前面設(shè)計(jì)的QWDialogLocate對(duì)話框與主窗口之間的交互采用互相引用的方式, 實(shí)現(xiàn)起來比較復(fù)雜。另外一種實(shí)現(xiàn)方式就是利用Qt的信號(hào)與槽機(jī)制,設(shè)計(jì)相應(yīng)的信號(hào)和槽,將信號(hào)與槽關(guān)聯(lián)起來,在進(jìn)行某個(gè)操作時(shí)發(fā)射信號(hào),槽函數(shù)自 動(dòng)響應(yīng)。對(duì)MainWindow和QWDialogLocate稍作修改,采用信號(hào)與槽機(jī)制實(shí)現(xiàn)交互操 作。下面是MainWindow類定義中與此相關(guān)的定義,包括兩個(gè)槽函數(shù)和一個(gè)信號(hào):1. class MainWindow: public QMainWindow2. 3.public slots:4. void setACellTex

45、t (int row, int column, QString &text) ;/設(shè)置單元格內(nèi)容5. void setActLocateEnable (bool enable) ; /設(shè)置 actTab_Locate的enabled 屬性6. signals:7. void celllndexChanged(int rowNo, int colNo) ;/當(dāng)前單元格發(fā)生變化8. ;在主窗口上,”定位單元格”按鈕的響應(yīng)代碼與前面有較大的差別。兩個(gè)槽函數(shù)是對(duì)話框操作主窗口時(shí),主窗口作出的響應(yīng)。信號(hào)是主窗口上 tableView 的當(dāng)前單 元格發(fā)生變化時(shí)發(fā)射的一個(gè)信號(hào),以便對(duì)話框作出響應(yīng)。下

46、面是兩個(gè)槽函數(shù)的實(shí)現(xiàn),以及 tableView 的clicked。信號(hào)的槽函數(shù)里發(fā)射自定義信號(hào)的代碼,代碼中都無須引用對(duì)話框?qū)ο螅?. void MainWindow:setACellText(int row, int column, QString text)2. /定位到單元格,并設(shè)置字符串3. QModelIndex index=theModel->index(row,column);/ 獲取模型索引4. theSelection->clearSelection(); /消除現(xiàn)有選擇5. theSelection->setCurrentIndex(index,QItem

47、SelectionModel:Select);/定位到單元格6. theModel->setData(index,text,Qt:DisplayRole);/設(shè)置單元格字符申7. 8. void MainWindow:setActLocateEnable(bool enable)9. 10. ui->actTab_Locate->setEnabled(enable);11. 12. void MainWindow二on_tableView_clicked( const QModelIndex &index)13. /單擊單元格時(shí)發(fā)射信號(hào),傳遞單元格的行號(hào)、列號(hào)14.

48、emit cellIndexChanged(index.row(),index.column();15. 在主窗口上,”定位單元格”按鈕的響應(yīng)代碼與前面有較大的差別:1. void MainWindow:on_actTab_Locate_triggered()2. /創(chuàng)建StayOnTop的對(duì)話框,對(duì)話框關(guān)閉時(shí)自動(dòng)刪除3. QWDialogLocate *dlgLocate = newQWDialogLocate( this );4. dlgLocate->setAttribute(Qt:WA_DeleteOnClose);5. Qt:WindowFlags flags=dlgLocat

49、e->windowFlags();6. dlgLocate->setWindowFlags(flags I Qt:WindowStaysOnTopHint);7. dlgLocate->setSpinRange(theModel->rcwCoimt(),theModel- >columnCount();8. QModellndex curIndex=theSelection->currentIndex();9. if (curIndex.isValid()10. dlgLocate->setSpinValue(curIndex.row(),curInd

50、ex.column();11. /對(duì)話框發(fā)射信號(hào),設(shè)置單元格文字12. connect(dlgLocate,SIGNAL(changeCellText(int, int, QString&), this ,SLOT(setACellText(int,int,QString&);13. /對(duì)話框發(fā)射信號(hào),設(shè)置actTab_Locate的屬性14. connect(dlgLocate,SIGNAL(changeActionEnable(bool),this ,SLOT(setActLocateEnable(bool);15. /主窗口發(fā)射信號(hào),修改對(duì)話框上的spinBox的值16. connect( this ,SIGNAL(celllndexChanged(int, int

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論