QMainWindow不再是活动窗口。

4
我正在使用Qt制作一个简单的游戏,希望在用户切换到其他窗口时暂停游戏(可能是最小化它或者无意中点击了旁边的窗口等)。我的游戏包含在QMainWindow中,所以我想检测到窗口失去焦点的情况。
我尝试了几种不同的方法,但没有成功。我首先尝试重载QMainWindow的focusOutEvent,但这个方法只在我用setFocus第一次给窗口设置焦点时调用。我还尝试了重载窗口的event(QEvent*)方法以检查QEvent::ApplicationActive和QEvent::ApplicationDeactivate。
我想发布我的QMainWindow代码,但是没有什么可以展示的,我只是尝试实现这两种方法,但都没有被调用。我没有做任何其他设置这些方法的事情(也许我漏掉了什么步骤?)。
有人知道如何确定你的QMainWindow是否“失去焦点”吗?
3个回答

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

来自文档 -

一个小部件通常必须将 setFocusPolicy() 设置为 Qt::NoFocus 以外的其他内容,才能接收到焦点事件。(请注意,应用程序员可以在任何小部件上调用 setFocus(),即使那些通常不接受焦点的小部件。)

文档的这一部分,关于focusPolicy -

该属性用于设置小部件接受键盘焦点的方式。
如果小部件通过制表符接受键盘焦点,则策略为Qt::TabFocus;如果小部件通过单击接受焦点,则策略为Qt::ClickFocus;如果小部件两种方式都接受,则策略为Qt::StrongFocus;如果根本不接受焦点,则策略为Qt::NoFocus(默认值)。
如果小部件需要处理键盘事件,则必须启用键盘焦点。通常在小部件的构造函数中完成此操作。例如,QLineEdit构造函数调用setFocusPolicy(Qt::StrongFocus)。
因此,请相应地设置您的焦点策略,我想那样您将会收到适当的焦点事件。

0
尝试使用 QWidget::isActiveWindow()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接