簡體   English   中英

QEventLoop處理所有事件

[英]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對象將LoginScreenMenuScreen松散耦合:

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();
};

理想情況下,您希望有一個單獨的控制器類來實現邏輯,而不是將其顯示在屏幕中。 然后, LoginScreenMenuScreen可以是控制器公開的數據的視圖。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM