如何在 setQuitOnLastWindowClosed(false) 时关闭 qt 应用程序
How to close the qt application when setQuitOnLastWindowClosed(false)
我想创建一个包含 3 个 windows 的项目:mainWindow、childWindow1、childWindow2,并且一次只能显示一个 window。我可以在这些 windows.
之间切换
所以我有三个任务:
- 我在主窗口中放置了两个按钮,并希望使用它们来显示子 windows 和隐藏主 window 中的一个。
- 当我关闭子 window 时,我希望显示主要 window。
- 当我关闭主程序时 window,终止整个应用程序。
我首先遇到了一个问题:
如果我关闭子 window,应用程序退出。
所以我使用 qApp.setQuitOnLastWindowClosed(false),并完成了任务 2。
但是又出现了一个问题:
如果我关闭主程序window,程序仍然是运行ning.
最后一题:
如何在任务栏中显示子window?它看起来连接到 运行 一个在任务栏中找不到的程序。
我到处搜索,如果有任何帮助,我们将不胜感激!
main.cpp:
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);
}
为此,您需要执行以下操作:
在你的 main.cpp
:
QApplication a(argc, argv);
a.setQuitOnLastWindowClosed(false);
MainWindow w;
QObject::connect(&w, &MainWindow::exited, &a, &QApplication::quit);
w.show();
return a.exec();
exited
信号将用于在关闭主 window.
后退出应用程序
在您的 MainWindow
中,您应该像这样重新实现 closeEvent
:
void MainWindow::closeEvent(QCloseEvent *event)
{
QMainWindow::closeEvent(event);
emit exited();
}
不要忘记将 exited()
添加到 MainWindow
signals
部分;
最后,新建windows的代码应该是这样的:
child1 = new ChildWindow;
child1->setAttribute(Qt::WA_DeleteOnClose);
connect(child1, &QObject::destroyed, this, &QWidget::show);
child1->show();
hide();
请注意,我没有将 this
作为 ChildWindow
的父级传递,这允许它出现在任务栏中。
因此,创建一个新的 ChildWindow
将隐藏主 window,关闭 ChildWindow
将自动删除它(这是您不需要将父级传递给的另一个原因ChildWindow
构造函数)并关闭 MainWindow
将关闭整个应用程序,这要归功于我们的 exited
信号。
我想创建一个包含 3 个 windows 的项目:mainWindow、childWindow1、childWindow2,并且一次只能显示一个 window。我可以在这些 windows.
之间切换所以我有三个任务:
- 我在主窗口中放置了两个按钮,并希望使用它们来显示子 windows 和隐藏主 window 中的一个。
- 当我关闭子 window 时,我希望显示主要 window。
- 当我关闭主程序时 window,终止整个应用程序。
我首先遇到了一个问题: 如果我关闭子 window,应用程序退出。 所以我使用 qApp.setQuitOnLastWindowClosed(false),并完成了任务 2。 但是又出现了一个问题: 如果我关闭主程序window,程序仍然是运行ning.
最后一题: 如何在任务栏中显示子window?它看起来连接到 运行 一个在任务栏中找不到的程序。
我到处搜索,如果有任何帮助,我们将不胜感激!
main.cpp:
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);
}
为此,您需要执行以下操作:
在你的
main.cpp
:QApplication a(argc, argv); a.setQuitOnLastWindowClosed(false); MainWindow w; QObject::connect(&w, &MainWindow::exited, &a, &QApplication::quit); w.show(); return a.exec();
exited
信号将用于在关闭主 window.
在您的
MainWindow
中,您应该像这样重新实现closeEvent
:void MainWindow::closeEvent(QCloseEvent *event) { QMainWindow::closeEvent(event); emit exited(); }
不要忘记将 exited()
添加到 MainWindow
signals
部分;
最后,新建windows的代码应该是这样的:
child1 = new ChildWindow; child1->setAttribute(Qt::WA_DeleteOnClose); connect(child1, &QObject::destroyed, this, &QWidget::show); child1->show(); hide();
请注意,我没有将 this
作为 ChildWindow
的父级传递,这允许它出现在任务栏中。
因此,创建一个新的 ChildWindow
将隐藏主 window,关闭 ChildWindow
将自动删除它(这是您不需要将父级传递给的另一个原因ChildWindow
构造函数)并关闭 MainWindow
将关闭整个应用程序,这要归功于我们的 exited
信号。