qtcn中文論壇中有網友問到:
假設程式正常執行時,只有乙個簡單的窗體a,此時只有乙個gui主線程,在這個主線程中有乙個事件迴圈處理窗體上的事件。當此程式執行到某階段時,彈出乙個模態窗體b(書上說模態窗體是有其自己的事件迴圈的),此時模態窗體b是否會有乙個對應的子執行緒處理其事件迴圈?這兒其實有兩個問題:
題外:如果進一步呢?其實我們還可以說:
兩種常規用法:
qdialog * dlg = new qdialog()dlg->show();
qdialog dlg;這種情況下,我們一般都是將物件分配上 stack 上,而不是heap上。dlg.exec();
當然,你喜歡用 heap,也沒問題:
dialog * dlg = new qdialog();前面的 show() 與 exec() 並不是模態與非模態的區別。dlg->exec();
delete dlg;
想讓乙個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();有問題是不?為啥exec() 直接可以顯示模態對話方塊呢?看qdialog源**吧dlg->setattribute(qt::wa_showmodal, true);
dlg->show();
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是否會有乙個對應的子執行緒處理其事件迴圈?這兒其實有兩個問題 題...