我有以下常见情况:
class A : public QDialog
{
Q_OBJECT
public:
A(QWidget *parent=0);
private:
QFormLayout *m_formLayout;
QLinedEdit *m_lineEditTest;
};
A::A(QWidget *parent)
{
m_formLayout = new QFormLayout(ui.widget_Test);
m_formLayout->setMargin(0);
m_formLayout->setSpacing(0);
m_lineEditTest = new QLineEdit();
m_formLayout->addWidget(m_lineEditTest);
ui.widget_Test->setLayout(m_formLayout);
}
A::~A()
{
delete m_lineEditTest, m_formLayout;
}
这是使用Qt GUI元素的类成员变量并在销毁QDialog A后删除它们的正确方法吗?
为什么我要问:我想避免在我的应用程序中使用原始指针并用智能指针替换它,但是不建议将Qt5用于例如的std :: shared_ptr的!那么我应该使用https://wiki.qt.io/Smart_Pointers,如果是,我的情景是哪一个? THX
答案 0 :(得分:1)
以下是摘要:(来自https://forum.qt.io/topic/65443/raw-pointers-in-qt/5)
class MyObject : public QObject
{
Q_OBJECT
public:
MyObject(QObject *parent = nullptr) {
obj1 = new QObject(this); // Sets the parent using the 'parent' constructor parameter
obj2 = new QObject;
obj2->setParent(this); // Sets the parent using QObject::setParent()
obj3 = new QObject; // No parent
}
private:
QObject *obj1;
QObject *obj2;
QObject *obj3;
};
当您删除MyObject
时,由于父子关系,它会自动删除obj1
和obj2
。但是,obj3
不会被删除,因为您没有将其设置为子项,因此obj3
的内存会被泄露。
有很多方法可以处理删除:
因此,如果您不将智能指针与父子系统混合使用,那么使用智能指针是没有问题的!