首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QEventLoop处理所有事件

QEventLoop处理所有事件
EN

Stack Overflow用户
提问于 2018-03-27 20:42:30
回答 1查看 1.3K关注 0票数 0

我有一个菜单屏幕,必须更新之前,登录屏幕关闭。代码类似于下面的代码;

代码语言:javascript
复制
emit updateMainMenuAccordingToUserRights;

QCoreApplication::processEvents();

emit jumpMainMenu();

问题是,“我如何确保所有事件都已处理完毕?”因为updateMainMenuAccordingToUserRights信号触发的一些插槽会向事件循环中添加新的事件,以更新视图组件。在跳转主菜单之前,我必须确定它已经更新了。我搜索了一下,并看到QCoreApplication::processEvent只处理了一次循环。好吧,这就是为什么上面的代码不能工作的原因。甚至我也尝试过一些QEventLoop方法,但无法解决这个问题。

谢谢你的建议。

EN

回答 1

Stack Overflow用户

发布于 2018-03-28 00:10:58

我有一个菜单屏幕,必须在登录屏幕关闭之前更新。

一点也不-这是XY的问题。换句话说,你的设计是错误的。您需要以某种方式将登录屏幕与菜单屏幕相结合,以便菜单屏幕在关闭登录屏幕之前获得它需要更新的信息。在此之后的任何时候,登录屏幕都可以关闭。

很可能是将登录屏幕与登录控制器紧密耦合在一起,因此LoginScreen类应该发出MenuScreen将处理的事件。

您当前的信号名称表明屏幕之间的耦合非常紧密。您只需要一个信号:loginDone(const LoginData &),其中LoginData是一个包含登录用户信息的结构/类,等等。

然后,问题中的三行代码简单地变成:

代码语言:javascript
复制
auto d = this->getLoginData();
emit loginDone(d);
close();

代码语言:javascript
复制
LoginData LoginScreen::getLoginData() const {
  LoginData d;
  d.foo = this->foo();
  d.bar = this->bar();
  ...
  return d;
}

然后,一个函数(最好在控制器类中)通过LoginScreen对象松散地将MenuScreen耦合到LoginData

代码语言:javascript
复制
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可以是控制器公开的数据的视图。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49522097

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档