QMainWindow不再是活动窗口

时间:2012-03-16 04:08:35

标签: c++ qt qt4

我正在用Qt制作一个简单的游戏,我想在用户切换到另一个窗口时暂停游戏(这可能是通过最小化它或不小心点击它旁边的窗口等)。我的游戏包含在QMainWindow中,因此我希望能够检测到失去焦点的时间。

我为此尝试了几种不同的方法,但我没有成功。我首先尝试重载QMainWindow的focusOutEvent,但是这个方法只在我第一次用setFocus给窗口焦点时调用。我还尝试重载窗口的事件(QEvent *)方法来检查QEvent :: ApplicationActive和QEvent :: ApplicationDeactivate。

我会发布我的QMainWindow的代码,但没有太多要显示,我实际上只是尝试实现这两种方法,但都没有被调用。我没有做任何其他设置这些方法(也许我错过了一步?)。

有没有人知道确定你的QMainWindow是否“失去焦点”的好方法?

3 个答案:

答案 0 :(得分:6)

我有一次类似的需求,并通过重载我的QMainWindow的event(QEvent*)方法来解决它:

bool MyMainWindow::event(QEvent * e)
{
    switch(e->type())
    {
        // ...

        case QEvent::WindowActivate :
            // gained focus
            break ;

        case QEvent::WindowDeactivate :
            // lost focus
            break ;
        // ...
    } ;
    return QMainWindow::event(e) ;
}

答案 1 :(得分:1)

来自documentation -

  

小部件通常必须setFocusPolicy()以外的其他内容   Qt :: NoFocus以接收焦点事件。 (注意   应用程序员可以在任何小部件上调用setFocus(),甚至是那些   通常不会接受焦点。)

documentation的这一部分开始,关于focusPolicy -

  

此属性保持窗口小部件接受键盘焦点的方式。

     

如果小部件接受键盘焦点,则策略为Qt::TabFocus   Tab键,Qt::ClickFocus如果小部件通过单击接受焦点,   Qt::StrongFocus如果它同时接受,Qt::NoFocus(默认值)if   它根本不接受焦点。

     

如果小部件处理键盘,则必须为小部件启用键盘焦点   事件。这通常是从小部件的构造函数完成的。对于   例如,QLineEdit构造函数调用   setFocusPolicyQt::StrongFocus)。

因此,相应地设置您的焦点政策,我猜您将收到适当的焦点事件。

答案 2 :(得分:0)

尝试QWidget::isActiveWindow()