当您以编程方式添加 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/

10-13 09:25