setQuitOnLastWindowClosed(false)时如何关闭qt应用程序
我希望创建一个包含3个窗口的项目:mainWindow、childWindow1、childWindow2,并且一次只能显示一个窗口。我可以在这些窗口之间切换 因此,我有三项任务:setQuitOnLastWindowClosed(false)时如何关闭qt应用程序,qt,multi-window,Qt,Multi Window,我希望创建一个包含3个窗口的项目:mainWindow、childWindow1、childWindow2,并且一次只能显示一个窗口。我可以在这些窗口之间切换 因此,我有三项任务: 我在主窗口中放置了两个按钮,并希望使用它们使其中一个子窗口显示,主窗口隐藏 当我关闭子窗口时,我希望显示主窗口 当我关闭主窗口时,终止整个应用程序 我首先遇到一个问题: 如果关闭子窗口,应用程序将退出。 因此,我使用qApp.setQuitOnLastWindowClosed(false),完成了任务2。 但另一个问
int main()
{
QApplication a(argc, argv);
a.setQuitOnLastWindowClosed(false);
MainWindow mainWindow;
mainWindow.show();
return a.exec();
}
mainWindow.cpp:
void mainWindow::button1Clicked()
{
this->hide();
childWindow1 = new ChildWindow1(this);
connect(childWindow1, &QMainWindow::destroyed, this, &QMainWindow::show);
childWindow1->setWindowModality(Qt::WindowModal);
childWindow1->show();
}
childWindow1.cpp
ChildWindow1::ChildWindow1(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
setAttribute(Qt::WA_DeleteOnClose);
}
要实现这一点,您需要执行以下操作:
child1 = new ChildWindow;
child1->setAttribute(Qt::WA_DeleteOnClose);
connect(child1, &QObject::destroyed, this, &QWidget::show);
child1->show();
hide();
main.cpp
中:
QApplication a(argc, argv);
a.setQuitOnLastWindowClosed(false);
MainWindow w;
QObject::connect(&w, &MainWindow::exited, &a, &QApplication::quit);
w.show();
return a.exec();
退出
信号将用于在关闭主窗口后退出应用程序
main窗口中
您应该像这样重新实现closeEvent
:
void MainWindow::closeEvent(QCloseEvent *event)
{
QMainWindow::closeEvent(event);
emit exited();
}
exited()
添加到main窗口
信号
部分
child1 = new ChildWindow;
child1->setAttribute(Qt::WA_DeleteOnClose);
connect(child1, &QObject::destroyed, this, &QWidget::show);
child1->show();
hide();
子窗口
的父窗口传递,这允许它显示在任务栏中
因此,创建一个新的
ChildWindow
将隐藏主窗口,关闭ChildWindow
将自动删除它(这是不需要将父窗口传递给ChildWindow
构造函数的另一个原因)关闭main窗口
将关闭整个应用程序,因为我们发出了退出
信号 你不需要在你的main窗口
类(可能还有子窗口类)中重写吗?@G.M.谢谢你!我解决了第一个问题!解决办法如下:1。注释a.setQuitOnLastWindowClosed(false)代码>;2.覆盖QWidget::closeEvent
,在closeEvent中,qobject_cast(parent())->show();事件->接受()代码>非常感谢!它工作得很好!所以我得到了两个答案来解决我的问题:1<代码>设置QuitOnLastWindowClosed(真)代码>,在2子窗口中重新实现关闭事件
,并在处理关闭事件之前显示主窗口;2. <代码>setQuitOnLastWindowClosed(假)
,在主窗口中重新实现closeEvent
,并发出终止应用程序的信号。qobject\u cast(parent())->show()只要parent
可以nullptr
,code>就不是最好的主意。例如,在我的解决方案中就是这样。