我正在使用QGLWidget作为前端开发基于OpenGL的游戏。但是由于所有不必要的开销(加上必须分发繁重的QT库!)我计划迁移到GLUT,并且在大跃进之前我正在用更多标准替代品替换'Qt-stuff'。
要替换控制帧率和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
析构函数中切换一个静态标志并检测到它,但这不起作用,因为直到{{1}才调用结束。我知道我可以通过绑定QApps的main
信号,或者从Qapp中制作一个派生类,然后拦截它来实现它,但这种做法无法摆脱信号/插槽的目的。是否有一种简单的方法可以判断QApplication是否已被命令从类外部关闭?
答案 0 :(得分:4)
您可以重新实现
void QWidget::closeEvent ( QCloseEvent * event )
设置静态标志的方法。该方法从窗口调用close事件。
答案 1 :(得分:2)
我建议在app.sendPostedEvents();
电话之前添加QApplication::processEvents()
。它实际上可以解决您的问题,但如果没有,您至少可以使用@dzhon提到的事件处理程序。
Nitpick:Qt通常没有格式化为全部大写。说'QT'让你看起来好像在谈论QuickTime!