2012-03-16 93 views
4

我正在用Qt做一个简单的游戏,我想在用户切换到不同的窗口时暂停游戏(这可以通过最小化它或通过不小心点击它旁边的窗口等)。我的游戏被包装在一个QMainWindow中,所以我希望能够检测到什么时候失去焦点。QMainWindow不再活动窗口

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

我会发布我的QMainWindow的代码,但没有太多要显示,我从字面上试图实现这两种方法,但都没有被调用。我没有别的办法来设置这些方法(也许我错过了一个步骤?)。

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

回答

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

documentation -

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

documentation的这一部分,约focusPolicy -

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

政策是Qt::TabFocus如果部件由 黏合,Qt::ClickFocus如果控件通过点击接受焦点, Qt::StrongFocus如果同时接受,并Qt::NoFocus(默认值),如果 它不接受焦点在所有接受键盘焦点。

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

因此,相应地设置你的焦点政策,我想你会得到适当的焦点事件。

0

尝试QWidget::isActiveWindow()