Проблема со скрытым QMainWindow: сбой приложения после отображения QMessageBox - PullRequest
8 голосов
/ 25 февраля 2011
// 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):

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

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

Ответы [ 2 ]

3 голосов
/ 25 февраля 2011

Кажется, что проблема заключается в следующем: когда диалоговое окно закрыто, приложение считает, что больше нет открытых окон (setQuitOnLastWindowClosed относится к видимым окнам верхнего уровня), поэтому оно закрывается. Деструктор вашего окна не вызывается, потому что вы никогда не удаляете объект!

Это должно распечатать сообщение:

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

В качестве альтернативы вы можете установить приложение в качестве родителя окна

2 голосов
/ 25 февраля 2011

Я не уверен, но я думаю, что когда QMessageBox закрылся, он пытается вернуть фокус, чтобы его родитель (Your MainWindow) скрылся.Эта операция не выполняется, и система выдает исключение.

...