1. 程式人生 > >記QDialog中exec、show、hide等函式要點

記QDialog中exec、show、hide等函式要點

QWidget 的show()、hide()、setVisible()、setHidden() 這4個函式讓人看得眼花繚亂,但是開啟原始碼一看,原來最終呼叫的只是一個函式:setVisible(bool visible) (注意這些只是QWideget中是這樣,而對話方塊因為加入了獲取返回值的功能,所以有區別)。

QWidget的close :這個函式在Qt的幫助文件中描述得很詳細,它的執行過程是這樣的:

首先,我們直接呼叫close(或者點選關閉按鈕)時,它會生成 QCloseEvent 事件;

其次,我們可以選擇阻止或接受改事件,如果我們接受了事件(預設),它就直接呼叫hide()函式,在介面上隱藏,如果我們阻止事件,close將直接返回,什麼都不做;

再次,如果我們為它設定過標記位:Qt::WA_DeleteOnClose(關閉時刪除它),則出來呼叫hide()外,還會呼叫deleteLater()函式。

QDialog 和 QWidget 相比,多了 exec()、open()、done()、reject ()和 accept ()5個相關函式。

1. QDialog::show():非模態視窗顯示,但是如果在視窗中顯示設定為模態對話方塊:setModal (true),則顯示半模態對話方塊。

(用show是不能直接獲取對話方塊返回值的,因為程式執行到show時沒有阻塞會繼續執行。

steModal(true) == setModality(QT::ApplicationModal))

2. QDailog::open():模態(視窗級(Qt::WindowModal))視窗顯示。

3. QDialog::exec():模態(應用程式級(Qt::ApplicationModal))視窗顯示。exec() 先設定modal屬性,而後呼叫 show() 顯示對話方塊,最後啟用事件迴圈。(這裡注意會阻塞在呼叫exec的位置)在使用者關閉這個對話方塊之前,不能和同一應用程式中的其它視窗互動。

4. QDialog::done(int):和close比較類似,因為它呼叫了close所呼叫的 close_helper 函式。只不過不同於close函式,它始終會先讓Widget不可見,然後close操作,最後根據引數發射訊號。

5. QDialog::reject():呼叫done()函式,原始碼為:done(Rejected)。

6. QDialog::accept():呼叫done()函式,原始碼為:done(Accepted)。

1.exec()是一個迴圈時間函式,哪它什麼時候才能返回了?當呼叫 accept()(返回QDialog::Accepted), reject()(返回QDialog::Rejected),done(int r)(返回r),close()(返回QDialog::Rejected),hide()(這也就是說exec顯示的視窗一旦呼叫hide隱藏就返回了,不能再響應訊號什麼的)(返回 QDialog::Rejected),destory()(返回QDialog::Rejected)。還有就是delete 自己的時候也會返回 QDialog::Rejected(destory()就會delete自己)。

2.close()會銷燬物件嘛。答案是隻有當設定了 setAttribute(WA:closeOnDelelte)是才會刪除,如果這個標誌沒有設定,其作用和hide(),setvisible(false)一樣,只會隱藏改物件。

3.當dialog在exec()時候。後臺執行緒同樣可以操作介面,如收到每個訊息,還可以彈出QDialog。