2014-02-08 107 views
3

我正在製作一個Qt遊戲,並且我正在製作一個自定義遊戲循環,以便我可以精確控制邏輯時間步並以最大幀速率進行渲染。Qt - QWindow關閉時檢測

通常情況下,創建一個QWindow你可以這樣做:在關閉窗口

... 
QGuiApplication app(argc,argv); 
QWindow* window = new QWindow(); 
window.show(); 
app.exec(); 
... 

而且exec()將返回。

不過,我做了以下方法:

QGuiApplication *app = new QGuiApplication(argc,argv); 
    QWindow* window = new QWindow(); 
    window.show(); 
    while (!terminate_loop) { 
      app->processEvents(); 
      GameUpdate(); 
      GameRender(); 
    } 
    app->exit(); 

然而,當在窗口關閉我的循環不斷去。我需要檢測窗口何時關閉,以便我的循環可以終止。我試過下面爲了捕捉在窗口已關閉:

connect(app,SIGNAL(lastWindowClosed()),this,SLOT(windowClosed())); 

他在關閉窗口下面的插槽應該被解僱,但它永遠不會被解僱。它確實火,當我用app->exec()而不是手動處理事件。

void QTEngine::windowClosed() { 
    terminate_loop = true; 
} 

經進一步調查,Qt文檔說以下內容:

[lastWindowClosed]從EXEC發射()當最後可見主 窗口(即沒有父窗口)被關閉。

由於我沒有使用exec(),此信號未被髮射。有沒有其他的方式來檢測QWindow何時關閉?

回答

-1

我能想到兩種可能的解決方案。我還沒有測試任何一種解決方案。

1)您可以使用Qt::WA_DeleteOnClose標誌創建您的QWindow。當窗口關閉時,它會刪除對象。任何被刪除的QObject都會發出destroyed()信號,這意味着您應該能夠將destroyed()信號連接到您的插槽。

2)您也可以重新實施您的QWindowQWidget::closeEvent()處理程序,併發出您自己的自定義信號。

+0

AFAIK你不能設置的Qt :: WA_DeleteOnClose上QWindow例如,只有在一個QWidget實例 – user1095108

+1

既不解決方案適用於QWindow,因爲它沒有從QWidget中派生。 – fkorsa

4

您應該使用Qt內部事件循環來設計您的遊戲應用程序。提供Qt的"OpenGL Window" example展示了一個渲染循環的好例子。

但是,可以在QWindow上獲取關閉事件。版本5.4.1未提供方便的closeEvent()函數。但是,您可以在QWindow上安裝事件過濾器對象並獲取關閉事件。這裏有一個這樣的事件過濾器對象實現的例子:

class CloseEventFilter : public QObject 
{ 
    Q_OBJECT 
public: 
    CloseEventFilter(QObject *parent) : QObject(parent) {} 

protected: 
    bool eventFilter(QObject *obj, QEvent *event) 
    { 
      if (event->type() == QEvent::Close) 
      { 
       // Do something interesting, emit a signal for instance. 
      } 

      return QObject::eventFilter(obj, event); 
    } 

}; 

要將事件過濾器連接到你的窗口,你只需要使用任何QObject的子類,包括QWindow實施installEventFilter()函數。

QGuiApplication *app = new QGuiApplication(argc,argv); 
QWindow* window = new QWindow(); 
CloseEventFilter *closeFilter = new CloseEventFilter(window); 
window->installEventFilter(closeFilter); 
...