2015-02-27 3 views
0

Согласно этой статье here, хорошо ли это сказать, когда мы закрываем программу Qt. Как только началось событие mainWindow, ничего не будет, кроме обработчика события закрытия и деконструктора класса в потоке графического интерфейса пользователя.Qt: цикл событий во время закрытия

Например, если есть QTimer, то сигнал timeout() в потоке графического интерфейса пользователя обращается к slot в той же теме. Когда началось событие закрытия mainWindow, слот не будет иметь шансов на повторный запуск?

+0

Это зависит от того, чего вы хотите достичь? Если вам нужно управлять настраиваемыми таймерами, вы можете установить флаг 'QApplicatoin :: setQuitOnLastWindowClosed (false);' и управлять циклом событий самостоятельно. –

+0

Я просто опасаюсь, что во время деконструкции определенный объект может быть удален вручную (путем вызова 'delete objectP'), если это так, когда' slot' запускается таймером и используется 'objectP', программа будет разбиваться Выход. – Nyaruko

+1

Установите родителя вашего таймера на свой объект - и все будет в порядке;) –

ответ

1

Это автоматически обрабатывается:

QObject::~QObject()

Всех сигналы и от объекта, автоматически отключается, и любые ожидающие Отправленные событий для объекта удаляется из событий очереди. Однако часто безопаснее использовать deleteLater() вместо , удаляя подкласс QObject напрямую.

Однако для многопоточных приложений, которые вы должны использовать deleteLater(), чтобы избежать аварий:

Предупреждение: Удаление QObject в то время как в ожидании событий, ожидающих быть доставлены может привести к аварии. Вы не должны удалять QObject напрямую , если он существует в другом потоке, чем тот, который выполняется в настоящий момент. Вместо этого используйте deleteLater(), из-за чего цикл цикла будет удалять объект после того, как все ожидающие события будут отправлены на него.

1

Нет, это не так на его лице, чтобы сказать, что когда-то началось близко событие в MainWindow, ничто больше не будет выполняться в GUI потоке, кроме близких обработчиков событий и класса деструкторов.

Предположим, что мы следующий код (в C++ 11):

#include <QApplication> 
#include <QLabel> 
#include <QMessageBox> 
#include <QTimer> 

int main(int argc, char *argv[]) 
{ 
    QApplication app(argc, argv); 
    QLabel label1("Hello, World!"); 
    label1.show(); 
    label1.setMinimumSize(200, 100); 
    app.exec(); 

    QTimer timer; 
    int counter = 0; 
    QObject::connect(&timer, &QTimer::timeout, [&counter]{ counter ++; }); 
    timer.start(100); 
    QMessageBox::information(nullptr, "Done", 
          QString("We're Done with \"%1\"").arg(label1.text())); 
    QMessageBox::information(nullptr, "Really Done", 
          QString("Timer has ticked %1 times").arg(counter)); 
    return 0; 
} 

Очевидно, не деструктор код будет выполняться после того, как exec() вернулся - здесь мы показываем окно сообщения. Главное окно, в данном случае QLabel, все еще существует после того, как exec() вернулся.

Также неверно предполагать, что таймеры будут убиты во всем мире после того, как exec() вернется. Они все еще работают, и до тех пор, пока вы заново запустите цикл событий, они с радостью поедут за вами. Во-вторых, во втором окне сообщения будет отображаться ненулевой счет.

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