// 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)终止app。但我仍然不明白出了什么问题。
呀!看起来我明白了什么问题。这是关于方法的信息
QApplication::quitOnLastWindowClosed(bool)
:
此属性保存应用程序在最后一个窗口关闭时是否隐式退出。 默认值为true。如果此属性为true,则当最后一个可见主要窗口(即没有父级的窗口)具有Qt :: WA_QuitOnClose属性时应用程序退出集已关闭。默认情况下,为子窗口以外的所有窗口小部件设置此属性。有关Qt :: Window对象的详细列表,请参阅Qt :: WindowType。
隐藏QMainWindow后,没有可见窗口。关闭QMessageBox时,应用程序退出。
答案 0 :(得分:3)
问题似乎如下:当关闭对话框时,应用程序认为没有更多窗口打开(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;
}
或者,您可以将应用程序设置为窗口的父级
答案 1 :(得分:2)
我不确定,但我认为当QMessageBox关闭时,它试图将焦点返回到他的父母(你的MainWindow)女巫被隐藏。此操作失败,系统抛出异常。
答案 2 :(得分:1)
只需尝试以下操作-将其放置:
...
app.setQuitOnLastWindowClosed(false);
...
发送给您:
int main(int argc, char* argv[])
{
QApplication app(argc, argv);
...
app.setQuitOnLastWindowClosed(false);
...
MainWindow* window = new MainWindow();
window->show();
return app.exec();
}
这应该有帮助!