我正在使用 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 结束才被调用。我知道我可以通过绑定(bind)到 QApps 的 aboutToQuit() 信号,或者从 Qapp 创建一个派生类并拦截它来做到这一点,但这种方式违背了远离信号/插槽的目的。是否有一种简单的方法可以从类外部判断 QApplication 是否已被命令关闭?

最佳答案

你可以重新实现

void QWidget::closeEvent ( QCloseEvent * event )

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

关于c++ - Qt - 如何在不使用插槽的情况下检测自定义事件循环中的关闭窗口,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12597648/

10-16 20:57