qt - 初始化 QWidgets 的合适位置是什么?

标签 qt memory-leaks initializer-list

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

相关文章:

c++构造函数重载与initializer_list的歧义

c++ - std::initializer_list 返回成员变量返回不正确的值

qt - 寻找 QML 格式文件的解析器

memory-leaks - w3wp.exe 垃圾堆充满了可用对象空间并不断增长

c++ - map 内存泄漏

iphone - OpenAL 泄漏- OALSource :AddPlaybackMessage

c++ - 为什么 std::flat_set 和 std::flat_map 具有 std::initializer_list 的重载构造函数,而其他容器适配器则没有?

c++ - 是否可以在所有平台上使用 vs2010 c++ 并使用 Qt?

Qt 可访问小部件

c++ - 无法锁定 Qt 互斥锁 (QReadWriteLock) 访问冲突写入