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

标签 c++ user-interface qt4 widget wait

我正在使用(很棒的)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/

相关文章:

c++ - 什么是并行 for 循环,应该如何/何时使用它?

c++ - 使用 C++ 元编程模板重载运算符

c++ - Project Euler #8,我不明白为什么我的代码给出了荒谬的高值

c++ - 从原始指针/引用创建智能指针

java - 带有 JFileChooser UI (?) 的 OS X 中的错误

javascript - 如何在 jquery dynatree 中添加下拉列表作为子节点

c++ - QML 双向 C++ 绑定(bind)不再接收更改

python - 如何用 wxPython、PyQt、PySide 或 Tkinter 解释 Python?

linux - KDE 和 Gnome 的图形用户界面

c++ - Ubuntu + qt,如何更新?