C++ Qt用户界面关闭命令

C++ Qt用户界面关闭命令,c++,qt,C++,Qt,我的项目中有一个QMainWindow作为GUI的中心,这个窗口可以打开一个新窗口。我希望当用户关闭主窗口时,mais窗口打开的所有其他窗口也将关闭 我试图在主窗口的析构函数中放置一个信号来调用另一个窗口close()slot,但它不起作用。我只能通过在主窗口中创建一个closeEvent(),向另一个窗口关闭插槽发送信号来实现这一点 所以我的问题是,Qt如何处理所有这些?如果窗口存在,如果主窗口在其析构函数中触发信号,为什么它们无法接收信号?我在析构函数中向其他线程发送其他信号,它们接收到的信

我的项目中有一个QMainWindow作为GUI的中心,这个窗口可以打开一个新窗口。我希望当用户关闭主窗口时,mais窗口打开的所有其他窗口也将关闭

我试图在主窗口的析构函数中放置一个信号来调用另一个窗口
close()
slot,但它不起作用。我只能通过在主窗口中创建一个
closeEvent()
,向另一个窗口关闭插槽发送信号来实现这一点


所以我的问题是,Qt如何处理所有这些?如果窗口存在,如果主窗口在其析构函数中触发信号,为什么它们无法接收信号?我在析构函数中向其他线程发送其他信号,它们接收到的信号很好。

有两种方法可以解决这个问题,这两种方法都适用于我:

方法1: 如果要在关闭时删除它们,请设置属性Qt::WA_DeleteOnClose。删除父对象时,将自动删除子对象

对于QMainWindow实例,请调用setAttribute(Qt::WA_DeleteOnClose)方法 例:我的main.cpp

    #include "st.h"
    #include <QtGui/QApplication>

    int main(int argc, char *argv[])
    {
  QApplication a(argc, argv);
  St *w = new St();
  w->setAttribute(Qt::WA_DeleteOnClose);
  w->show();
  return a.exec();
    }

我会用以下方法:

void MyMainWindow::closeEvent(QCloseEvent *e)
{
    foreach (QWidget *widget, QApplication::topLevelWidgets()) {
        if (widget != this) { // avoid recursion.
            widget->close();
        }
    }
    e->accept();
}

上述代码将在主窗口关闭后立即搜索并关闭所有顶级窗口。

您的错误非常简单:在窗口关闭时不会调用析构函数。您已经发现在
closeEvent
中发出信号是一种解决方案,因此我不太明白问题所在

如果您坚持在析构函数中发出信号,您必须做两件事:

  • 在堆上分配小部件

  • 在小部件上设置
    Qt::WA_DeleteOnClose
    属性

  • intmain(){
    QScopedPointer小部件(新的MyWidget);
    小部件->设置属性(Qt::WA_DeleteOnClose);
    ...
    }
    
    为什么不让主窗口成为应用程序所有其他“逻辑子”窗口的父窗口?在这种情况下,主窗口的关闭将关闭所有子窗口。我将主窗口的父窗口设置为窗口的父窗口…这只是构造函数中的一个
    吗?我想不是…我只是放置了一个
    这个
    ,窗口被渲染到主窗口空间中使用move member函数将新窗口移动到您想要的位置展示。还是你想说你没有第二个窗口?如果您使用QWidget派生类作为窗口(并且有其父类),您可以使用setWindowFlags(Qt::window);(在文档中查找其他选项,而不是Qt::Window)我只是在一些文档中发现了一个QWidget的子类…这是错误的吗?@vahancho它会关闭所有顶级Widget吗,即使它不是主窗口的子窗口?是的,它应该关闭所有顶级Widget。另外,你的评论出现在错误的帖子下:)这不是问题,我只是想了解引擎盖下发生了什么…我的意思是,为什么信号没有发送到窗口,而是发送到其他线程。我想了解更多Qt关闭UI的方式,事情的顺序,但为了结束这个答案,我决定把你的答案标记为答案,因为它涵盖了正在发生的事情。谢谢我想这太过分了,因为将主窗口设置为其他窗口的父窗口就可以了
    
    void MyMainWindow::closeEvent(QCloseEvent *e)
    {
        foreach (QWidget *widget, QApplication::topLevelWidgets()) {
            if (widget != this) { // avoid recursion.
                widget->close();
            }
        }
        e->accept();
    }