C++ Qt:在析构函数中删除QMainWindow的中心小部件时,程序崩溃

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

我正在学习Qt。目前我一直在做
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的所有权机制完成它的事情。