C++ Qt:在析构函数中删除QMainWindow的中心小部件时,程序崩溃
我正在学习Qt。目前我一直在做C++ Qt:在析构函数中删除QMainWindow的中心小部件时,程序崩溃,c++,qt,C++,Qt,我正在学习Qt。目前我一直在做QMainWindow的布局工作。正如在internet上的一些示例中所建议的,我使用了QWidget用于QMainWindow的setCentralWidget(QWidget*)方法。但作为清理的一部分,当我删除中央QWidget时,程序正在崩溃 这是.h的代码 class MyMainWindow : public QMainWindow { Q_OBJECT public: explicit MyMainWindow(QWidget *pa
QMainWindow
的布局工作。正如在internet上的一些示例中所建议的,我使用了QWidget
用于QMainWindow的setCentralWidget(QWidget*)
方法。但作为清理的一部分,当我删除中央QWidget
时,程序正在崩溃
这是.h的代码
class MyMainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MyMainWindow(QWidget *parent = 0);
~MyMainWindow();
private:
QVBoxLayout m_p1_level_vbox;
QHBoxLayout m_p2_level_vbox;
QHBoxLayout m_p2_level_hbox;
QWidget* m_central_widget;
QPushButton* m_increase_pressure;
QPushButton* m_decrease_pressure;
};
对于.cpp
MyMainWindow::MyMainWindow(QWidget *parent)
: QMainWindow(parent)
, m_central_widget(new QWidget(this))
, m_increase_pressure(new QPushButton("+", this))
, m_decrease_pressure(new QPushButton("-", this))
{
m_p2_level_hbox.addWidget(m_increase_pressure);
m_p2_level_hbox.addWidget(m_decrease_pressure);
m_p1_level_vbox.addLayout(&m_p2_level_hbox);
m_central_widget->setLayout(&m_p1_level_vbox);
setCentralWidget(m_central_widget);
}
MyMainWindow::~MyMainWindow()
{
delete m_central_widget; // commenting this line doesn't crash the program
delete m_increase_pressure;
delete m_decrease_pressure;
}
main.cpp
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MyMainWindow w;
w.show();
return a.exec();
}
在析构函数中,如果我不删除m_central_小部件
,它就会工作
我做错了什么?首先要学习并记住这一点。如果您的对象类有一个QObject作为超类,那么您应该记住,如果您删除QObject,那么您也将删除它的子对象 它是隐藏的,但真正酷的机制。 如需了解更多信息,欢迎阅读。这有点难理解,但有时比官方文档更能帮助解决您的问题 顺便说一下,请准备好了解如何在Qt中创建布局
祝你在Qt学习之旅中好运;) 孩子的小部件将在其父部件被删除时自动删除。所以你不会删除这个小部件或者程序崩溃。@tunglt但是我试图遵循规则,每一个新的都应该与删除平衡。由Qt自动执行?@Swapnil Qt在内部已经遵循该规则,因此您正在尝试消除一个已经被消除的指针。我认为,问题的直接原因是,
m_增加压力
和m_减少压力
最终归m_中央小部件
所有。当您delete m_central_widget
时,您也会删除这两个按钮,然后delete m_increase_pressure
会以双重销毁的方式显示未定义的行为。无论如何,前面评论中的建议是正确的——不要手动删除,允许Qt的所有权机制完成它的事情。