QObject 使用 setParent() 将 QList 设置为父级

Posted

技术标签:

【中文标题】QObject 使用 setParent() 将 QList 设置为父级【英文标题】:QObject set QList as parent using setParent() 【发布时间】:2013-04-22 09:05:27 【问题描述】:

我正在尝试使用QObject树删除机制来删除列表以及存储在列表中的所有QObjects。 Qt 仍然是我最擅长的领域...

QList<QObject*>* list = new QList<QObject*>();
QObject* obj1 = new QObject();
QObject* obj2 = new QObject();
obj1->setParent(obj2);
obj2->setParent((QObject*)list);

我在最后一行得到“分段错误”。 QList 不能用作父母吗?不是继承自QObject吗?

编辑

主要问题 - 是否可以方便地删除列表和所有列表元素而不扩展 QList 类?这需要由客户端调用,所以它必须很简单。

我想简单地打电话:

delete list;

而不是

qDeleteAll(list);
delete list;

【问题讨论】:

最大的问题是你为什么要动态分配整个列表。为什么不只是QList&lt;QObject*&gt; list 不可能使用 QList - 你可以使用 QSharedPointer。 【参考方案1】:

没有。 QList 不继承自 QObject。如果想轻松删除列表内容,可以使用qDeleteAll(list)

编辑: 这是未经测试的,基类可能存在没有虚拟析构函数的问题 - 但请先给出它。

template < class T >
class MyList : public QList< T >

    static_assert( std::is_pointer< T >::value,
                   "T must be a pointer." );
    //  Constructors...
    ...
    virtual ~MyList()  qDeleteAll( *this ); 
 

【讨论】:

这解释了很多 - 但仍然没有回答我的问题。 @Remi 实际上它回答了他们两个,但后来你将你的问题编辑成完全不同的东西。 是的 - 对不起,我在您回答后扩展了问题。【参考方案2】:

选项 1)

QList<QObject*> list;

.. somewhere in the code

QObject * obj = new QObject();
list << obj;

... 

then 


onDelete()     // variant 1
       QObject * ptr;
       foreach(ptr, list) 
          delete ptr;
       
       list(clear);


onDelete()  // variant 2
     qDeleteAll(list);

选项 2)

 QObject * parent = new QObject();

 somewhere in a code 
 ...
 QObject * child1 = new QObject(parent);
 QObject * child2 = new QObject(parent);


 onDelete() 
     delete parent;   // all children deleted automatically
 

更新:

根据您的问题更新,我可以认为您根本没有 QList,只需使用 QObject 提供的功能,如果您需要孩子,请使用适当的 childer() 方法,该方法将为您提供 QList

【讨论】:

我认为你提出的“删除列表”根本不是一个好方法,我相信如果在某个模块中分配了某些东西,它应该在那里释放。再一次,你不需要一个 QList at_all QObject 自己维护子列表 这个模型非常简化。我需要在 e 模块上创建对象,然后在完全不同的地方使用它们并删除。 再一次,这并没有改变答案,考虑一些 QObject 是你正在谈论的列表......

以上是关于QObject 使用 setParent() 将 QList 设置为父级的主要内容,如果未能解决你的问题,请参考以下文章

如何从父级中删除 QObject

PyQt5:QPushButton 上的 setParent 不会将其添加到父级

setParent 的 PyQt5 行为以显示没有布局的 QWidget

使用带有 mutythread 的 QGridLayout::addWidget

setparent new cmd windows 10中的问题

WPF 使用SetParent嵌套窗口