Проблема со скрытым QMainWindow: приложение вылетает после отображения QMessageBox

// main.cpp

#include <QApplication>

#include "mainwindow.h"

int main(int argc, char* argv[])
{
    QApplication app(argc, argv);
    MainWindow* window = new MainWindow();
    window->show();
    return app.exec();
}

// mainwindow.cpp

#include <QTimer>
#include <QMessageBox>
#include <iostream>

#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{
    this->setCentralWidget(new QWidget());
}

void MainWindow::mousePressEvent(QMouseEvent* event)
{
    this->hide();
    QTimer* timer = new QTimer();
    timer->setInterval(3*1000);
    timer->start();
    connect(timer, SIGNAL(timeout()), this, SLOT(showMessageBox()));
}

void MainWindow::showMessageBox()
{
    QMessageBox::information(this, "Hello,", "world!", QMessageBox::Ok);
}

MainWindow::~MainWindow()
{
    std::cerr << "Destructor called" << std::endl;
}

Я нажимаю на окно - оно скрывается и появляется QMessageBox. Нажимаю «ОК» - приложение завершается, а деструктор MainWindow не вызывается. Почему приложение завершает работу? Может, я что-то пропустил ? Qt 4.7.0, Linux.

... Ой! Похоже, я нашел то, что мне нужно.

a.setQuitOnLastWindowClosed(false);

Когда мне это нужно, я завершаю приложение с помощью a.exit (0). Но я все еще не понять, что было не так.

Да! Похоже, я понимаю, что было не так. Это информация о методе

QApplication :: quitOnLastWindowClosed (bool) :

Это свойство определяет, неявно ли приложение завершает работу, когда закрывается последнее окно. По умолчанию это правда. Если это свойство истинно, приложения завершают работу , когда закрывается последнее видимое основное окно (т.е. окно без родителя) с установленным атрибутом Qt :: WA_QuitOnClose. . По умолчанию этот атрибут установлен для всех виджетов, кроме вложенных окон. Обратитесь к Qt :: WindowType для получения подробного списка объектов Qt :: Window.

После того, как QMainWindow скрыт, нет видимых окон. Когда QMessageBox закрывается, приложение завершает работу .

8
задан Andrey Moiseev 1 March 2011 в 13:01
поделиться