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

时间:2018-12-16 17:03:50

标签: c++ qt

我正在学习Qt。目前,我停留在GNode *的版式方面。正如在互联网上提供的一些示例中所建议的那样,我在QMainWindow的QMainWindow方法中使用了QWidget。但是作为清理工作的一部分,当我删除中央setCentralWidget(QWidget*)时,程序崩溃了。

这是.h的代码

QWidget

.cpp

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;
};

main.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;
}

在析构函数中,如果我不删除int main(int argc, char *argv[]) { QApplication a(argc, argv); MyMainWindow w; w.show(); return a.exec(); } ,那么它将起作用。

我在这里做错了什么?

2 个答案:

答案 0 :(得分:0)

首先学习并记住此thing。如果您的对象类具有QObject作为超类,则应记住,如果要删除QObject,那么也要删除其子对象。

它是隐藏的,但是确实很酷的机制。 有关更多信息,我们始终欢迎您阅读source code。有点难以理解,但有时可以比官方文档更好地解决您的问题。

顺便说一下,准备好了解Qt中的布局work

祝您在Qt学习之旅中一切顺利;)

答案 1 :(得分:-2)

  

void QMainWindow :: setCentralWidget(QWidget * widget);

     

将给定的小部件设置为主窗口的中央小部件。

     

注意:QMainWindow拥有窗口小部件指针的所有权并将其删除   在适当的时候。


但是,如果您想手动执行操作,就可以...

if(m_central_widget != nullptr){
        m_central_widget = nullptr;
        delete m_central_widget;
    }