gpt4 book ai didi

c++ - Qt4 小部件 : implementing a wait function without blocking the widget

转载 作者:行者123 更新时间:2023-11-28 07:49:14 25 4
gpt4 key购买 nike

我正在使用(很棒的)Qt4 库用 C++ 编写一个简单的游戏。一段时间以来,我遇到了以下问题:

小部件提供(除其他外)2 种方法,改变小部件响应用户输入的方式,如鼠标移动和点击等。我们将这些函数称为 fun1()fun2 () 以避免上下文。所有这些函数所做的是切换小部件中的一些内部变量,这些变量由所有事件函数(例如 mouseMoveEvent())检查。当 fun1() 被调用时,用户应该通过与小部件交互并点击某处来执行移动。小部件检查他的举动是否有效,如果有效,则将他的举动应用于当前游戏状态。

现在,包含此小部件的主类随后会在某个时候调用 fun1()fun2()。我必须实现一些(优雅的)措施以确保主循环位于 fun1() 的末尾,直到移动完成。

void Widget::fun1()
{
// Set some members in order to tell the Widget how to respond to events
// ...
wait(); // wait for the move to be completed before returning from fun1()
}

wait() 应该如何实现,同时保持 GUI 的响应能力,即响应用户交互?

过去,我通过让小部件的父级等待小部件发出通知其已完成的信号来解决此问题。仅当收到此信号时,我才调用 fun2()。虽然这可能工作正常,但令我困扰的是它让等待类使用小部件而不是小部件本身负责。

任何建议都会很有帮助!

最佳答案

首先,让我为回答我自己的问题而道歉。事实证明,我已经尝试过的解决方案确实有效,但我愚蠢地从构造函数调用了 fun1()fun2()的主窗口。因此,app.exec() 从未被调用,因为等待函数和事件未被处理。

对于那些感兴趣的人来说,wait() 的工作实现是:

void Widget::wait()
{
static QEventLoop loop;
connect(this, SIGNAL(done()), &loop, SLOT(quit()));
loop.exec();
}

关于c++ - Qt4 小部件 : implementing a wait function without blocking the widget,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14194786/

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