记录一个qt关闭窗口后crash的bug

今天调试一个程序的时候发现,关闭窗口就意外crash,

debug模式打开,关闭后有一行输出

HEAP[********.exe]: Heap block at 1D014FC8 modified at 1D015040 past requested size of 7

这就奇怪了,程序窗口都关闭了,怎么还crash,而且还是堆栈错误,

经过代码一行一行的注释,发现跟QQuickView有关,

我在QWidget中定义了成员变量

QQuickView m_contentView

然后初始化的时候加载qml,

把QQuickView相干的代码注释后,就不crash了,连其他小伙伴其他地方的crash的bug也不见了,但是总不能不显示界面吧,qml也写了那么多页面了,QQuickWidget换成QWidget也有点不现实,于是想了想以前没问题的时候,QQuickView好像是new出来的,于是把QQuickView换成了指针QQuickView*,结果居然不出问题了。

现在只能猜测跟QQuickView的生命周期有关系,如果定义成成员变量,类构造的时候这个成员变量就已经初始化了,可能qt有什么内存溢出的bug需要解决吧。

总结:

QQuickWidget还是没QWidget稳定

QQuickView等小组件还是手动new出来比较好

### 回答1: 在Qt中,要实现窗口关闭后打开另一个窗口,可以使用信号与槽机制来实现。 首先,在需要打开的窗口类中,我们可以定义一个槽函数,用于接收来自其他窗口的信号。这个槽函数可以是一个普通的成员函数,用于打开新窗口。 接下来,在需要关闭窗口类中,在窗口关闭的事件中发送一个信号。可以使用窗口的closeEvent()函数来捕获窗口关闭事件,并发出自定义的信号。 然后,在主窗口中,创建需要打开的窗口对象,并将其信号与关闭窗口的槽函数进行连接。可以使用QObject类的connect()函数来实现信号与槽的连接。 最后,运行程序,当关闭窗口时,会触发窗口关闭事件,发送关闭信号,从而触发槽函数,打开新的窗口。 例如:代码示例 MainWindow.h中定义: ``` class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); private slots: void openNewWindow(); private: Ui::MainWindow *ui; AnotherWindow *anotherWindow; }; ``` MainWindow.cpp中实现: ``` MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); anotherWindow = new AnotherWindow(); connect(this, SIGNAL(close()), anotherWindow, SLOT(show())); } MainWindow::~MainWindow() { delete ui; } void MainWindow::openNewWindow() { // 打开新窗口的逻辑 } ``` AnotherWindow.h中定义: ``` class AnotherWindow : public QWidget { Q_OBJECT public: AnotherWindow(QWidget *parent = nullptr); ~AnotherWindow(); public slots: void showNewWindow(); private: Ui::AnotherWindow *ui; }; ``` AnotherWindow.cpp中实现: ``` AnotherWindow::AnotherWindow(QWidget *parent) : QWidget(parent), ui(new Ui::AnotherWindow) { ui->setupUi(this); connect(this, SIGNAL(show()), this, SLOT(showNewWindow())); } AnotherWindow::~AnotherWindow() { delete ui; } void AnotherWindow::showNewWindow() { // 显示新窗口的逻辑 } ``` 这样,当关闭窗口时,会触发主窗口的close()信号,并调用槽函数openNewWindow(),从而执行打开新窗口的逻辑。同时,新窗口中的槽函数showNewWindow()会在其信号show()被触发时调用,执行显示新窗口的逻辑。 ### 回答2: 在Qt中,要实现窗口关闭后打开另一个窗口,可以通过以下步骤来实现: 1. 创建两个窗口类,比如`MainWindow`和`SecondWindow`。在这两个类的头文件中,使用`#include`指令引入Qt相关的头文件,并继承`QMainWindow`类。 2. 在`MainWindow`类中,在构造函数中创建一个按钮,并设置按钮的文本为"打开窗口"。连接按钮的`clicked()`信号到槽函数`openSecondWindow()`。 3. 在`openSecondWindow()`槽函数中,创建一个`SecondWindow`类的对象,然后使用`show()`函数显示该窗口。 4. 在`SecondWindow`类中,可以继续添加其他窗口中需要的控件。 5. 在`MainWindow`的实现文件中,实现`openSecondWindow()`槽函数,通过`SecondWindow`类的构造函数创建一个`SecondWindow`类的对象,并显示出来。 6. 编译运行程序后,在`MainWindow`中点击"打开窗口"按钮,`SecondWindow`窗口将会显示出来。 下面是示例代码: mainwindow.h文件: ```cpp #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACE class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); private slots: void openSecondWindow(); private: Ui::MainWindow *ui; }; #endif // MAINWINDOW_H ``` mainwindow.cpp文件: ```cpp #include "mainwindow.h" #include "ui_mainwindow.h" #include "secondwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); QPushButton *button = new QPushButton("打开窗口", this); connect(button, &QPushButton::clicked, this, &MainWindow::openSecondWindow); } MainWindow::~MainWindow() { delete ui; } void MainWindow::openSecondWindow() { SecondWindow *secondWindow = new SecondWindow(this); secondWindow->show(); } ``` secondwindow.h文件: ```cpp #ifndef SECONDWINDOW_H #define SECONDWINDOW_H #include <QMainWindow> namespace Ui { class SecondWindow; } class SecondWindow : public QMainWindow { Q_OBJECT public: explicit SecondWindow(QWidget *parent = nullptr); ~SecondWindow(); private: Ui::SecondWindow *ui; }; #endif // SECONDWINDOW_H_H ``` secondwindow.cpp文件: ```cpp #include "secondwindow.h" #include "ui_secondwindow.h" SecondWindow::SecondWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::SecondWindow) { ui->setupUi(this); } SecondWindow::~SecondWindow() { delete ui; } ``` 以上就是使用Qt实现窗口关闭后打开另一个窗口的简单示例。通过点击`MainWindow`中的按钮,可以打开一个新的`SecondWindow`窗口。 ### 回答3: 在Qt中,要在关闭一个窗口后打开另一个窗口,我们可以使用信号与槽机制来实现。首先,我们需要定义两个窗口类,一个是用于关闭窗口类,另一个是要打开的窗口类。 在关闭窗口类中,我们可以重写closeEvent()函数来捕捉窗口关闭事件。在该函数中,我们可以发射一个自定义的信号,表示窗口关闭。例如: ```cpp void CloseWindow::closeEvent(QCloseEvent *event) { // 发射自定义的关闭信号 emit windowClosed(); // 执行默认的关闭操作 event->accept(); } ``` 在打开窗口类中,我们可以使用槽函数来接收关闭信号,并在槽函数中实现打开另一个窗口的操作。例如: ```cpp void OpenWindow::openNewWindow() { // 创建新的窗口对象 NewWindow *newWindow = new NewWindow(); // 显示新的窗口 newWindow->show(); } ``` 接下来,我们需要在主程序中连接信号与槽,并执行Qt的事件循环。例如: ```cpp int main(int argc, char *argv[]) { QApplication a(argc, argv); // 创建关闭窗口对象 CloseWindow *closeWindow = new CloseWindow(); // 创建打开窗口对象 OpenWindow *openWindow = new OpenWindow(); // 连接关闭信号与打开槽函数 QObject::connect(closeWindow, SIGNAL(windowClosed()), openWindow, SLOT(openNewWindow())); // 显示关闭窗口 closeWindow->show(); // 执行Qt的事件循环 return a.exec(); } ``` 这样,当关闭窗口关闭时,就会发射关闭信号,触发打开槽函数,在槽函数中实现打开另一个窗口的操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值