gpt4 book ai didi

c++ - QEventLoop 处理所有事件

转载 作者:行者123 更新时间:2023-11-28 04:44:34 25 4
gpt4 key购买 nike

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

emit updateMainMenuAccordingToUserRights;

QCoreApplication::processEvents();

emit jumpMainMenu();

问题是“我如何确定所有事件都已处理?”。因为一些由 updateMainMenuAccordingToUserRights 信号触发的槽将新事件添加到事件循环中以更新 View 组件。在跳转主菜单之前,我必须确保它已经更新。我搜索了一下,发现 QCoreApplication::processEvent 只处理一次循环。好的,这就是上面代码不起作用的原因。即使我尝试了一些 QEventLoop 方法,也无法解决这个问题。

感谢您的任何建议。

最佳答案

I've a menu screen which must be updated before the login screen closed

一点也不——这是一个 XY 问题。换句话说:你的设计是错误的。您需要以某种方式将登录屏幕轻轻地耦合到菜单屏幕,以便菜单屏幕在登录屏幕关闭之前获得它需要更新自身的信息。在此之后的任何时候,登录屏幕确实可以关闭。

很可能您将登录屏幕与登录 Controller 紧密耦合,因此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;
}

然后,一个函数(最好在 Controller 类中)将通过 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();
};

理想情况下,您希望有一个单独的 Controller 类来实现逻辑,而不是将其放在屏幕中。 LoginScreenMenuScreen 可以是 Controller 公开的数据的 View 。

关于c++ - QEventLoop 处理所有事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49522097/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com