Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
setQuitOnLastWindowClosed(false)时如何关闭qt应用程序_Qt_Multi Window - Fatal编程技术网

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

setQuitOnLastWindowClosed(false)时如何关闭qt应用程序,qt,multi-window,Qt,Multi Window,我希望创建一个包含3个窗口的项目:mainWindow、childWindow1、childWindow2,并且一次只能显示一个窗口。我可以在这些窗口之间切换 因此,我有三项任务: 我在主窗口中放置了两个按钮,并希望使用它们使其中一个子窗口显示,主窗口隐藏 当我关闭子窗口时,我希望显示主窗口 当我关闭主窗口时,终止整个应用程序 我首先遇到一个问题: 如果关闭子窗口,应用程序将退出。 因此,我使用qApp.setQuitOnLastWindowClosed(false),完成了任务2。 但另一个问

我希望创建一个包含3个窗口的项目:mainWindow、childWindow1、childWindow2,并且一次只能显示一个窗口。我可以在这些窗口之间切换

因此,我有三项任务:

  • 我在主窗口中放置了两个按钮,并希望使用它们使其中一个子窗口显示,主窗口隐藏
  • 当我关闭子窗口时,我希望显示主窗口
  • 当我关闭主窗口时,终止整个应用程序
  • 我首先遇到一个问题: 如果关闭子窗口,应用程序将退出。 因此,我使用qApp.setQuitOnLastWindowClosed(false),完成了任务2。 但另一个问题出现了: 如果我关闭主窗口,程序仍在运行

    最后一个问题: 如何在任务栏中显示子窗口?它看起来运行了一个在任务栏中找不到的程序

    我到处搜索,任何帮助都将不胜感激

    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);
    }
    

    要实现这一点,您需要执行以下操作:

    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>就不是最好的主意。例如,在我的解决方案中就是这样。