0

我正在使用(很棒的)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()。尽管这可能工作正常,但让我感到困扰的是,它使用小部件而不是小部件本身来等待类的责任。

任何建议都会非常有帮助!

4

1 回答 1

1

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

wait()对于那些感兴趣的人的工作实施是:

void Widget::wait()
{
    static QEventLoop loop;
    connect(this, SIGNAL(done()), &loop, SLOT(quit()));
    loop.exec();
}
于 2013-01-07T13:39:32.463 回答