繁体   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