我正在学习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();
}
,那么它将起作用。
我在这里做错了什么?
答案 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;
}