Qt4 Widget:在不阻塞小部件的情况下实现等待功能

时间:2013-01-07 11:15:47

标签: 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()
}

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

过去,我通过让窗口小部件的父级等待窗口小部件发出通知已完成的信号来解决此问题。只有收到此信号后,我才会拨打fun2()。虽然这可能工作正常,但令我困扰的是,它使用小部件而不是小部件本身来等待类的责任。

任何建议都会非常有用!

1 个答案:

答案 0 :(得分:1)

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

感兴趣的人wait()的工作实施是:

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