Nano Hash - криптовалюты, майнинг, программирование

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

26.09.2012

Ответы:


1

Вы можете повторно реализовать

void QWidget::closeEvent ( QCloseEvent * event ) 

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

26.09.2012
  • Да, это сделало свое дело! Я забыл, что мое главное окно уже было подклассом, поэтому это был простой встроенный виртуальный элемент в заголовке основного окна (void closeEvent(QCloseEvent * event) {isRunning = false;} для пользователей Google). 26.09.2012

  • 2

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

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

    26.09.2012
  • sendPostedEvents не работал (по крайней мере сам по себе), но, судя по документам, добавить его не помешает из-за определенных крайних случаев. 26.09.2012
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..