QEventLoop 的使用兩例

2021-07-11 19:39:28 字數 1093 閱讀 8988

qt 是事件驅動的,所以當你用qt的時候,幾乎時時刻刻和 qeventloop 打交道、,只是你可能沒有意識到:

qdialog::exec()

qthread::exec()

qdrag::exec()

qmenu::exec()

...

在前面列出的這些常見函式的背後,都有各自的qeventloop,可能是我們很少有機會想到自己顯式使用qeventloop的緣故吧,對這個類似乎總是有些陌生。

manual 中說的很簡潔

at any time, you can create a qeventloop object and call exec() on it to start a local event loop. from within the event loop, calling exit() will force exec() to return.
在任何時候,你都可以建立乙個qeventloop的物件,然後呼叫它的exec() 來開始乙個區域性的事件迴圈。

看manual容易讓人頭大,那麼,看例子吧:

直接sleep一下行麼,顯然,如果你的使用者不介意你的程式介面不響應使用者操作,沒問題!可是如果介意呢?

此時,開啟乙個區域性的事件迴圈,讓其執行100ms後自己退出,似乎很不錯。寫來看看:

qeventloop eventloop;

qtimer::singleshot(100, &eventloop, slot(quit()));

eventloop.exec();

注:讓主線程等待有其他方法,此處略過。

不少人遇到過這個問題:在乙個槽函式內建立了乙個視窗物件,卻沒有看到視窗彈出來,或者看到視窗一閃而過。比如:

void ***x::slot1()

當然,大家都知道原因:因為到了後面的大括號處,dlg因為出作用域,會被析構掉。解決方法很簡單,增大w的生存時間即可。比如:

能否用 qeventloop 來解決呢?答案是,可以

void ***x::slot1()

恩至此,問題解決。其實,這也是 qdialog::exec() 內部所做的事情,只不過此處不是模態對話方塊而已。

QEventLoop 的使用兩例

qt 是事件驅動的,所以當你用qt的時候,幾乎時時刻刻和 qeventloop 打交道 只是你可能沒有意識到 qdialog exec qthread exec qdrag exec qmenu exec 在前面列出的這些常見函式的背後,都有各自的qeventloop,可能是我們很少有機會想到自己顯...

QEventLoop 的使用兩例

qt 是事件驅動的,所以當你用qt的時候,幾乎時時刻刻和 qeventloop 打交道 只是你可能沒有意識到 qdialog exec qthread exec qdrag exec qmenu exec 在前面列出的這些常見函式的背後,都有各自的qeventloop,可能是我們很少有機會想到自己顯...

QT中使用QEventLoop來實現事件迴圈

這裡的意思是說qeventloop類為我們提供了一種進入和退出乙個事件迴圈的方法。在任何時候,你都可以建立乙個qeventloop例項,然後呼叫exec 來啟動乙個事件迴圈,在這個迴圈期間,可以呼叫exit 來強制使exct 返回。事件迴圈是乙個無限 迴圈 當呼叫事件的exec 的時候,程式就會在e...