QT UI关闭顺序

Qt UI Closing order

本文关键字:顺序 UI QT      更新时间:2023-10-16

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

我试图将信号放在主窗口的驱动器中,以调用另一个窗口close()插槽,但行不通。我只能通过在主窗口中制作一个closeEvent()来进行此项工作,该窗口将信号发送到另一个窗口关闭插槽。

所以我的问题是,QT如何处理所有这些?如果窗户存在,为什么主窗将其发射到灾难函数中,为什么他们无法收到信号?我向其他线程发射其他信号,然后将它们接收好。

我会以以下方式进行此操作:

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

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

您的错误非常简单:窗口关闭时未调用驱动器。您已经发现在closeEvent中发射信号是一个解决方案,所以我不太了解问题是什么。

如果您坚持在灾难中发出信号,则必须做两件事:

  1. 在堆上分配小部件。

  2. 在小部件上设置Qt::WA_DeleteOnClose属性。

int main() {
  QScopedPointer<MyWidget> widget(new MyWidget);
  widget->setAttribute(Qt::WA_DeleteOnClose);
  ...
}

有两种解决此问题的方法,两种方式都对我有用:

方法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();
    }

还将"此"指针传递给您正在创建的任何子窗口。 但是,然后您就可以在堆上创建QMainWindow实例,而不是在堆栈上创建QMAINWINDOW实例,否则您的应用程序将崩溃。

方法2:

超载QMainWindow和Close Event方法的CloseEvent方法,请致电 所有孩子的Deletelater()方法。

     void St::closeEvent(QCloseEvent *c)
     {
   m_b->deleteLater();//This is a pushbutton
   odlg->deleteLater();//This is child dialog
       //both are children of QMainWindow
     }