Qt - 如何在不使用插槽的情况下检测自定义事件循环中的关闭窗口

时间:2012-09-26 08:32:12

标签: c++ qt event-loop

我正在使用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是否已被命令从类外部关闭?

2 个答案:

答案 0 :(得分:4)

您可以重新实现

void QWidget::closeEvent ( QCloseEvent * event ) 

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

答案 1 :(得分:2)

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

Nitpick:Qt通常没有格式化为全部大写。说'QT'让你看起来好像在谈论QuickTime!