[英]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.