4

我正在开发一个使用 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析构函数中切换一个静态标志并检测到它,但这也不起作用,因为直到main结束才会调用它。我知道我可能可以通过绑定 QApps 的aboutToQuit()信号来做到这一点,或者可能从 Qapp 创建一个派生类并拦截它,但这违背了远离信号/插槽的目的。有没有一种简单的方法可以从课堂外判断 QApplication 是否已被命令关闭?

4

2 回答 2

4

你可以重新实现

void QWidget::closeEvent ( QCloseEvent * event ) 

设置静态标志的方法。该方法从窗口调用关闭事件。

于 2012-09-26T09:55:54.833 回答
2

我建议在通话app.sendPostedEvents();之前添加。QApplication::processEvents()它实际上可以解决您的问题,但如果没有,您至少可以使用@dzhon 提到的事件处理程序。

Nitpick:Qt 通常不采用全大写格式。说“QT”会让你看起来好像在谈论 QuickTime!

于 2012-09-26T09:59:01.890 回答