如何在 setQuitOnLastWindowClosed(false) 时关闭 qt 应用程序

How to close the qt application when setQuitOnLastWindowClosed(false)

我想创建一个包含 3 个 windows 的项目:mainWindow、childWindow1、childWindow2,并且一次只能显示一个 window。我可以在这些 windows.

之间切换

所以我有三个任务:

  1. 我在主窗口中放置了两个按钮,并希望使用它们来显示子 windows 和隐藏主 window 中的一个。
  2. 当我关闭子 window 时,我希望显示主要 window。
  3. 当我关闭主程序时 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);
}

为此,您需要执行以下操作:

  1. 在你的 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.

后退出应用程序
  1. 在您的 MainWindow 中,您应该像这样重新实现 closeEvent

    void MainWindow::closeEvent(QCloseEvent *event)
    {
        QMainWindow::closeEvent(event);
        emit exited();
    }
    

不要忘记将 exited() 添加到 MainWindow signals 部分;

  1. 最后,新建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 信号。