QMainWindow 不再处于活动状态窗口

QMainWindow no longer active window

本文关键字:活动状态 窗口 不再 QMainWindow      更新时间:2023-10-16

我正在用Qt制作一个简单的游戏,我想在用户切换到不同的窗口时暂停游戏(这可能是通过最小化它或意外点击旁边的窗口等(。 我的游戏被包装在QMainWindow中,所以我希望能够检测到它何时失去焦点。

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

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

有谁知道确定您的QMainWindow是否"失去焦点"的好方法?

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

bool MyMainWindow::event(QEvent * e)
{
    switch(e->type())
    {
        // ...
        case QEvent::WindowActivate :
            // gained focus
            break ;
        case QEvent::WindowDeactivate :
            // lost focus
            break ;
        // ...
    } ;
    return QMainWindow::event(e) ;
}

从文档中 -

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

从文档的这一部分来看,大约focusPolicy -

此属性保存小组件接受键盘焦点的方式。

如果小组件通过以下方式接受键盘焦点,则Qt::TabFocus策略 Tab 键,Qt::ClickFocus小部件是否通过单击接受焦点, 如果同时接受两者,则Qt::StrongFocus,如果接受,则Qt::NoFocus(默认值( 它根本不接受焦点。

如果小组件处理键盘,则必须为其启用键盘焦点 事件。这通常是从小部件的构造函数中完成的。为 实例,QLineEdit构造函数调用 setFocusPolicy ( Qt::StrongFocus (.

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

> 尝试QWidget::isActiveWindow() .