我有一个菜单屏幕,必须更新之前,登录屏幕关闭。代码类似于下面的代码;
emit updateMainMenuAccordingToUserRights;
QCoreApplication::processEvents();
emit jumpMainMenu();问题是,“我如何确保所有事件都已处理完毕?”因为updateMainMenuAccordingToUserRights信号触发的一些插槽会向事件循环中添加新的事件,以更新视图组件。在跳转主菜单之前,我必须确定它已经更新了。我搜索了一下,并看到QCoreApplication::processEvent只处理了一次循环。好吧,这就是为什么上面的代码不能工作的原因。甚至我也尝试过一些QEventLoop方法,但无法解决这个问题。
谢谢你的建议。
发布于 2018-03-28 00:10:58
我有一个菜单屏幕,必须在登录屏幕关闭之前更新。
一点也不-这是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;
}然后,一个函数(最好在控制器类中)通过LoginScreen对象松散地将MenuScreen耦合到LoginData:
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可以是控制器公开的数据的视图。
https://stackoverflow.com/questions/49522097
复制相似问题