2012-09-26 36 views
4

我正在開發基於OpenGL的遊戲,使用QGLWidget作爲前端。但是由於所有不必要的開銷(再加上必須分發沉重的QT庫!),我計劃遷移到GLUT,並且正在用更多的標準替代品替代'Qt-stuff',然後才能實現巨大的飛躍。Qt - 如何在不使用插槽的情況下檢測自定義事件循環中的關閉窗口

要更換控制幀率和FPS定時器QTimers,我想楔這些功能變成一個簡單的循環,它取代了app.exec()調用,如下所示:

//main.cpp 
#include <QApplication> 
#include <windows.h> 
#include "mainwindow.h" 

int main(int argc, char *argv[]) { 
    QApplication app(argc, argv); 
    MainWindow mainWin;//only contains a glwidget 
    mainWin.show(); 

    do { 
    app.processEvents(); 
    //call draw functions/fps based on system tick count 
    //... 
    Sleep(10); 
    } while (!app.closingDown()); //<-- this doesn't terminate 

    return 0; 
} 

到目前爲止它在運行時工作正常,但是一旦您嘗試關閉窗口(通過系統'X'按鈕),窗口就會消失,但程序會掛起在後臺。問題是我找不到指示已調用exit()或close()的靜態標誌或查詢函數。 bool closingDown()似乎總是錯誤的,我試圖在~MainWindow析構函數中檢測靜態標誌並檢測該標誌,但這不起作用,因爲在main結束之前不會調用該標誌。我知道我可以通過綁定QApps的aboutToQuit()信號,或者從Qapp派生一個派生類並攔截它,但是這種做法違背了從信號/插槽移開的目的。是否有一種簡單的方法來判斷QApplication是否被命令從課外關閉?

回答

4

您可以重新實現

void QWidget::closeEvent (QCloseEvent * event) 

方法來設置靜態的標誌。該方法從窗口調用關閉事件。

+0

是的,這是訣竅!我忘記了我的主窗口已經進行了分類,所以它在mainwindow頭文件中是一個簡單的內聯虛擬(void closeEvent(QCloseEvent * event){isRunning = false;}'for googlers)。 – Ghost2

2

我建議在撥打QApplication::processEvents()之前加入app.sendPostedEvents();。它可能實際上解決了你的問題,但是如果沒有,你至少可以使用@dzhon提到的事件處理程序。 Nitpick:Qt通常不是全格式格式化的。說'QT'使它看起來好像你在談論QuickTime!

+0

sendPostedEvents不起作用(至少在它自己的情況下),但基於文檔,由於某些邊緣情況,添加它並沒有什麼壞處。 – Ghost2

相關問題