![](/img/trans.png)
[英]Why won't my nested QEventLoop deliver all the events for my QThread?
[英]QEventLoop process all events
我有一個菜單屏幕,必須在登錄屏幕關閉之前進行更新。 代碼類似於下面的代碼。
emit updateMainMenuAccordingToUserRights;
QCoreApplication::processEvents();
emit jumpMainMenu();
問題是“如何確定所有事件均已處理?”。 因為updateMainMenuAccordingToUserRights信號觸發的某些插槽將新事件添加到事件循環中,以更新視圖組件。 在跳轉主菜單之前,我必須確保它已經被更新。 我搜索了一下,發現QCoreApplication :: processEvent僅處理一次循環。 好的,這就是上面的代碼不起作用的原因。 即使我嘗試了一些QEventLoop方法,也無法解決此問題。
感謝您的任何建議。
我有一個菜單屏幕,必須在登錄屏幕關閉之前進行更新
完全沒有-這是一個XY問題。 換句話說:您的設計是錯誤的。 您需要以某種方式將登錄屏幕輕輕地耦合到菜單屏幕,以便菜單屏幕獲得在關閉登錄屏幕之前需要更新的信息。 在此之后的任何時候,登錄屏幕確實可以關閉。
您很可能將登錄屏幕與登錄控制器緊密耦合,因此LoginScreen
類應該發出MenuScreen
將處理的事件。
您當前的信號名稱表明屏幕之間的耦合非常緊密。 您只需要一個信號: loginDone(const LoginData &)
,其中LoginData
是一個結構/類,用於承載有關已登錄用戶等的信息。
然后,問題中的三行代碼就變成了:
auto d = this->getLoginData();
emit loginDone(d);
close();
和
LoginData LoginScreen::getLoginData() const {
LoginData d;
d.foo = this->foo();
d.bar = this->bar();
...
return d;
}
然后,一個函數(最好在控制器類中)將通過LoginData
對象將LoginScreen
與MenuScreen
松散耦合:
void setLoginDataOnMenu(const LoginData &data, MenuScreen *menu) {
...
menu->show();
};
int main(int argc, char **argv) {
QApplication app{argc, argv};
LoginScreen login;
MenuScreen menu;
QObject::connect(&login, &LoginScreen::loginDone, &menu, [&](const LoginData &){
setLoginDataOnMenu(data, &menu);
});
login.show();
return app.exec();
};
理想情況下,您希望有一個單獨的控制器類來實現邏輯,而不是將其顯示在屏幕中。 然后, LoginScreen
和MenuScreen
可以是控制器公開的數據的視圖。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.