我正在用Qt制作一个简单的游戏,我想在用户切换到另一个窗口时暂停游戏(这可能是通过最小化它或不小心点击它旁边的窗口等)。我的游戏包含在QMainWindow中,因此我希望能够检测到失去焦点的时间。
我为此尝试了几种不同的方法,但我没有成功。我首先尝试重载QMainWindow的focusOutEvent,但是这个方法只在我第一次用setFocus给窗口焦点时调用。我还尝试重载窗口的事件(QEvent *)方法来检查QEvent :: ApplicationActive和QEvent :: ApplicationDeactivate。
我会发布我的QMainWindow的代码,但没有太多要显示,我实际上只是尝试实现这两种方法,但都没有被调用。我没有做任何其他设置这些方法(也许我错过了一步?)。
有没有人知道确定你的QMainWindow是否“失去焦点”的好方法?
答案 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
构造函数调用setFocusPolicy
(Qt::StrongFocus
)。
因此,相应地设置您的焦点政策,我猜您将收到适当的焦点事件。
答案 2 :(得分:0)
尝试QWidget::isActiveWindow()
。