当您以编程方式添加 QWidget 时,初始化 QWidget 的最佳方式(位置)是什么?
我能想到的方法是:
1) 在定义文件中创建实例,然后在初始化列表中初始化它们。这似乎是正确的方法,但是您需要添加到 Window 中的 QWidget 越多,它就会变得有点草率。
class SomeWindow : QDialog{
...
private:
QLabel label1;
QLabel label2;
...
}
SomeWindow::SomeWindow(...) : QDialog(...),
label('label1 text'), label('label2 text')
{
...
layout.addWidget(&label1);
layout.addWidget(&label2);
...
}
2) 来自 C# 我倾向于喜欢这个,但它似乎会产生内存泄漏......
SomeWindow::SomeWindow(...) : QDialog(...)
{
QLabel* label1 = new QLabel('label1 text');
QLabel* label2 = new QLabel('label2 text');
...
layout.addWidget(label1);
layout.addWidget(label2);
...
}
有没有更好的方法来做到这一点,我错过了?
我为新手问题道歉。
最佳答案
Qt使用自己的系统删除父子QObject派生类。删除对象时,所有子项也将被删除。
使用第一个代码,您有 2 次销毁(在 SomeWindow 的析构函数和 QObject 系统中),然后这段代码是非法的(仅使用 Qt ;使用 C++ 标准代码,很好)
使用第二个代码,标签由 QObject 系统删除,您没有内存泄漏。无需在对象上保留指针。
@Jairo
在构造函数中设置父级并不是将子级添加到对象的唯一方法。特别是,在这里, QLayout::addWidget 重新父对象(如果布局是对象的正确子级)
@msgmaxim
小心,布局不能是构造函数中的局部变量
关于qt - 初始化 QWidgets 的合适位置是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18996230/