2012-03-16 76 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()