【问题标题】:QMainWindow no longer active windowQMainWindow 不再是活动窗口
【发布时间】:2012-03-16 04:08:34
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c++ qt qt4


    【解决方案1】:

    我曾经有过类似的需求,并通过重载 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) ;
    }
    

    【讨论】:

      【解决方案2】:

      来自documentation -

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

      来自documentation的这一部分,关于focusPolicy-

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

      如果小部件通过以下方式接受键盘焦点,则策略为 Qt::TabFocus 选项卡,Qt::ClickFocus 如果小部件通过单击接受焦点, Qt::StrongFocus 如果它同时接受,Qt::NoFocus(默认)如果 它根本不接受焦点。

      如果小部件处理键盘,您必须为它启用键盘焦点 事件。这通常由小部件的构造函数完成。为了 例如,QLineEdit 构造函数调用 setFocusPolicy(Qt::StrongFocus)。

      所以相应地设置你的焦点策略,我想你会收到适当的焦点事件。

      【讨论】:

        【解决方案3】:

        试试QWidget::isActiveWindow()

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-01-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多