QT UI关闭顺序
Qt UI Closing order
我在项目中有一个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
中发射信号是一个解决方案,所以我不太了解问题是什么。
如果您坚持在灾难中发出信号,则必须做两件事:
-
在堆上分配小部件。
-
在小部件上设置
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
}
- CMake-按正确顺序将项目与C运行时对象文件链接
- 函数调用中参数的顺序重要吗
- 为什么不;名字在地图上是按顺序排列的吗
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 数到第n个楼梯的路(顺序无关紧要)
- 如何在MS Visual Studio 2019中运行QT UI
- 优先顺序:智能指针和类析构函数
- 在循环中按顺序遍历成员变量
- 独立读取-修改-写入顺序
- QML按钮点击功能执行顺序
- C++中数据类型修饰符的顺序
- 当比特(而不是字节)的顺序至关重要时的持久性
- 如何处理使用.ui文件生成的.h文件
- C++从其他 constexpr 创建 lambda 不能按顺序执行 Constexpr
- 通过选项卡的文本设置QTabWidget顺序
- c++11评估顺序(未定义的行为)
- 如何在C++中递归地按相反顺序打印集合
- 用QT形式顺序命名的UI对象填充数组
- QT UI关闭顺序
- UI小部件按顺序绘制