QDialog 模態對話方塊與事件迴圈

2021-08-25 18:52:28 字數 1820 閱讀 2487

qtcn中文論壇中有網友問到:

假設程式正常執行時,只有乙個簡單的窗體a,此時只有乙個gui主線程,在這個主線程中有乙個事件迴圈處理窗體上的事件。當此程式執行到某階段時,彈出乙個模態窗體b(書上說模態窗體是有其自己的事件迴圈的),此時模態窗體b是否會有乙個對應的子執行緒處理其事件迴圈?
這兒其實有兩個問題:

題外:如果進一步呢?其實我們還可以說:

兩種常規用法:

qdialog * dlg = new qdialog()

dlg->show();

qdialog dlg;

dlg.exec();

這種情況下,我們一般都是將物件分配上 stack 上,而不是heap上。

當然,你喜歡用 heap,也沒問題:

dialog * dlg = new qdialog();

dlg->exec();

delete dlg;

前面的 show() 與 exec() 並不是模態與非模態的區別。

想讓乙個widget成為模態,我們只需要對其設定:

setattribute(qt::wa_showmodal, true);
注意:這是qwidget的成員函式,也就是說,qwidget可以顯示為模態或非模態!

除了直接呼叫setattribute外,qwidget 提供了乙個易用的函式,來設定窗體的模態。其原始碼如下:

void qwidget::setwindowmodality(qt::windowmodality windowmodality)

如果你沒有使用qdialog::open()的需求,你可能也不需要該函式。

除了qwidget提供的成員,qdialog 提供了 setmodal 的成員函式,我們看看其**:

void qdialog::setmodal(bool modal)

不用解釋了吧?我們要顯示模態對話方塊,只需要類似下面的**:

qdialog * dlg = new qdialog();

dlg->setattribute(qt::wa_showmodal, true);

dlg->show();

有問題是不?為啥exec() 直接可以顯示模態對話方塊呢?看qdialog源**吧

int qdialog::exec()

看到答案沒:exec() 先設定modal屬性,而後呼叫 show() 顯示對話方塊,最後啟用事件迴圈

用前面的 qdialog::exec() 一樣,都是呼叫的 qeventloop::exec()

int qeventloop::exec(processeventsflags flags)

bool qeventloop::processevents(processeventsflags flags)

bool qguieventdispatcherwin32::processevents(qeventloop::processeventsflags flags)

事件迴圈和執行緒沒有必然的聯絡,事件迴圈可以用在qthread中,而且從qt4.4開始,qthread的run函式預設就呼叫了自己的事件迴圈。

對與qdialog來說,當它自己的qeventloop啟用時,主程式的 qeventloop 當然是處於暫停狀態了。說到底,就是兩個死迴圈,乙個在內,乙個在外,只有裡面的退出後,外邊的迴圈才會執行。不過由於兩個迴圈執行的命令是基本一樣的,都是呼叫並處理程式收到的各種事件,所以,可能變得不容易理解

QDialog 模態對話方塊與事件迴圈

qtcn中文論壇中有問到 假設程式正常執行時,只有乙個簡單的窗體a,此時只有乙個gui主線程,在這個主線程中有乙個事件迴圈處理窗體上的事件。當此程式執行到某階段時,彈出乙個模態窗體b 書上說模態窗體是有其自己的事件迴圈的 此時模態窗體b是否會有乙個對應的子執行緒處理其事件迴圈?這兒其實有兩個問題 題...

QDialog 模態對話方塊與事件迴圈

qtcn中文論壇中有問到 假設程式正常執行時,只有乙個簡單的窗體a,此時只有乙個gui主線程,在這個主線程中有乙個事件迴圈處理窗體上的事件。當此程式執行到某階段時,彈出乙個模態窗體b 書上說模態窗體是有其自己的事件迴圈的 此時模態窗體b是否會有乙個對應的子執行緒處理其事件迴圈?這兒其實有兩個問題 題...

QDialog 模態對話方塊與事件迴圈

qtcn中文論壇中有問到 假設程式正常執行時,只有乙個簡單的窗體a,此時只有乙個gui主線程,在這個主線程中有乙個事件迴圈處理窗體上的事件。當此程式執行到某階段時,彈出乙個模態窗體b 書上說模態窗體是有其自己的事件迴圈的 此時模態窗體b是否會有乙個對應的子執行緒處理其事件迴圈?這兒其實有兩個問題 題...