前言
Qt中對話框是幾乎每個項目都會用到的GUI窗口對象。本文通過講解及其子類在項目中經(jīng)常被用到的功能點,幫助小伙伴們理解和掌握其使用方法。
是Qt對話框類樹中的基類,Qt為我們提供了很多子類,即標準對話框,實現(xiàn)了豐富的對話框功能。下面我們先看一下本身需要關(guān)注的一些問題。
一句話描述模態(tài)對話框:
除模態(tài)對話框外,用戶無法選擇并操作其他窗口,只有關(guān)閉了模態(tài)對話框,用戶才能操作其他窗口。
下面的代碼,用::exec函數(shù)實現(xiàn)了模態(tài)對話框(請結(jié)合Qt中的類幫助文檔閱讀下面的代碼):
等效于
原理上,exec函數(shù)是阻塞執(zhí)行的,直到模態(tài)對話框關(guān)閉才返回,可以看出,exec內(nèi)部有一個自己的消息循環(huán),一直在循環(huán)處理消息。用代碼模擬如下:
而調(diào)用show函數(shù)是不需要對話框關(guān)閉就會立即返回的,相當于(true),僅僅設(shè)置了允許窗口顯示的標記而已。先調(diào)用(true),再調(diào)用show()仍然是立即返回的,這種情況下,模態(tài)對話框使用的消息循環(huán)是main函數(shù)中app.exec中的啟動的應(yīng)用全局消息循環(huán)。原理上嘗試理解即可,暫時不需要掌握,在后面的文章中會有對消息循環(huán)()的專門講解。
使用場景
exec阻塞執(zhí)行方式,不會將本來可以在一個函數(shù)內(nèi)實現(xiàn)的業(yè)務(wù)代碼,分散到多個函數(shù)中去。
比如下面的例子,彈出對話框讓用戶輸入名稱,然后校驗用戶輸入的用戶名是否正確,在一個函數(shù)內(nèi)即可完成此功能:
如果使用show會怎么樣呢?使用show實現(xiàn)同樣的功能,代碼如下:
非模態(tài)對話框使用比較簡單,定義好對話框變量后,直接調(diào)用成員函數(shù)show即可顯示,這里不做過多講解。
子類
說完了,下面開始介紹子類。
Qt標準對話框
根據(jù)使用頻率大致對子類排序,見下表,讀者可根據(jù)此順序?qū)W習(xí)使用:
子類描述信息對話框,最常用,用于顯示提示信息、警告信息、詢問信息、致命信息,并接受用戶選擇下一步操作。文件對話框,常用,用于選擇文件、文件夾。輸入對話框,用于獲取字符串輸入、數(shù)值輸入、以及選擇列表中的某一項。、顏色和字體對話框。進度顯示對話框。錯誤信息顯示對話框,提供不再顯示某條內(nèi)容的消息的選項。向?qū)υ捒?,用于引?dǎo)用戶進行某個操作。
自定義子類
2. 不要用exec的返回值來傳遞內(nèi)容信息
exec的返回值可以用來傳遞退出碼。由上述內(nèi)容可知,done、、可以用來退出對話框并設(shè)置退出碼。
筆者在初次自定義對話框時,總想著將對話框中的輸入內(nèi)容,用exec返回。例如,將用戶在對話框中選擇的列表項索引,用done(index)來返回。這里明確地告訴小伙伴們模態(tài)對話框是什么時候?qū)嵗膶υ捒?/strong>,這樣的用法是不提倡的。因為如果是字符串,那怎么返回呢?
正確的做法是,使用done返回用戶對編輯的確認狀態(tài),即確認設(shè)置內(nèi)容還是取消設(shè)置,確認內(nèi)容用,取消設(shè)置用。這樣一來,自定義的類需要提供對話框數(shù)據(jù)獲取接口,當exec返回后,再使用對話框?qū)ο髮嵗?,調(diào)用數(shù)據(jù)獲取接口獲取用戶編輯的數(shù)據(jù)。
舉個簡單的例子:
結(jié)語
本文代碼略多,粗略地講解了Qt中對話框的類型和理解對話框工作原理的關(guān)鍵問題。細節(jié)的部分需要讀者自己去實踐,文章中無法講解得太過詳細。講解太過詳細,第一,讀起來費時費力,倒不如花時間自己寫代碼嘗試,第二,學(xué)習(xí)容易出現(xiàn)問題的地方是較難理解的地方,細節(jié)不需要面面俱到 ,用到的時候再查就可以。學(xué)習(xí)Qt某個模塊,要先把握住某一個功能模塊的運作機理、框架,而不是一頭鉆進龐雜的內(nèi)容里,沒有方向地去學(xué)習(xí),效率很低也很痛苦。
本文是Qt基礎(chǔ)文章,筆者想盡快寫完Qt的基礎(chǔ)部分,除了基礎(chǔ)還有很多東西需要掌握,不能一直在基礎(chǔ)上轉(zhuǎn)圈圈。小伙伴們?nèi)绻幸蓡?,歡迎留言。如果問題很多,筆者會考慮建一個討論群,盡自己能力幫助想要學(xué)習(xí)Qt的同學(xué),大家一起進步。
本文首發(fā)于微信公眾號“Qt未來工程師”。