Qt — Как обнаружить закрытое окно в пользовательском цикле событий без использования слотов

Я работаю над игрой на основе 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 заканчивается. Я знаю, что мог бы сделать это, привязавшись к QApps aboutToQuit() сигнал, или, возможно, создание производного класса из Qapp, и перехват его, но такой вид отрицает цель удаления от сигналов / слотов. Есть ли простой способ определить, было ли приказано завершить QApplication извне класса?

4

Решение

Вы можете переопределить

void QWidget::closeEvent ( QCloseEvent * event )

метод для установки вашего статического флага. Этот метод вызывает закрытие событий из окна.

4

Другие решения

Я рекомендую добавить app.sendPostedEvents(); до этого QApplication::processEvents() вызов. Это может на самом деле решить вашу проблему, но если нет, вы можете по крайней мере использовать обработчики событий, как упомянуто @dzhon.

Nitpick: Qt обычно не форматируется во всех заглавных буквах. Когда вы говорите «QT», это выглядит так, как будто вы говорите о QuickTime!

2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector