Я работаю над игрой на основе OpenGL, используя QGLWidget в качестве внешнего интерфейса. Но из-за всех ненужных накладных расходов (плюс необходимость распространять тяжелые библиотеки QT!) Я планирую перейти на GLUT и нахожусь в процессе замены «Qt-stuff» более стандартными альтернативами перед большим скачком.
Чтобы заменить QTimers, которые управляют частотой кадров и таймером fps, я пытаюсь втиснуть эти функции в простой цикл, который заменяет вызов 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
. Я знаю, что, вероятно, мог бы сделать это, связав сигнал aboutToQuit()
QApps или, возможно, создав производный класс от Qapp и перехватив его, но это противоречит цели ухода от сигналов/слотов. Есть ли простой способ узнать, было ли приказано завершить работу QApplication вне класса?
void closeEvent(QCloseEvent * event) {isRunning = false;}
для пользователей Google). 26.09.2012