设置QList子对象

时间:2015-09-12 10:50:25

标签: c++ qt qml

Helo那里,

我设置了一个对象来获取QML ...在这个对象定义中我得到了

(location_in_my_computer):25: candidate constructor 
not viable: no known conversion from 'QList<QString>' to 'QList<const QString> &' 
for 10th argument GroupObject(...,
    ^

在我的代码中,我使用这个类(最小例子):

class GroupObject : public QObject
{ 

public:
    GroupObject(QObject *parent=0);
    GroupObject( 
                QList<const QString> &tags, QObject *parent=0);

    QList<const QString> tags(); 

    void setTags(QList<const QString> &tags); 

private: 
    QList<QString> m_tags; 
}; 

他的实施:

#include "groupobject.h"

GroupObject::GroupObject( QList<const QString> &tags, QObject *parent) QObject(parent),
    m_tags(tags){

    }

QList<const QString> GroupObject::tags()
{
    return m_tags;
}

void GroupObject::setTags(QList<const QString> &tags)
{
    if(tags != m_tags){
        m_tags = tags;
    }
}

我打算在下面的示例中设置一个GroupObject的QList:

QList<QString> tags;
QList<QObject*> dataList;
dataList.append( new GroupObject( tags ));

我如何以正确的理念做到这一点?

由于

2 个答案:

答案 0 :(得分:3)

tags的类型为QList<QString>,但GroupObject提交者接受QList<const QString>

实际上const的{​​{1}}修饰符在QString中没有任何意义,因为它不会保护QList修改。它只是否认QList项的修改。在这种情况下,您甚至无法在QList初始化期间复制一个此类QList项。

因此,要编译代码,您必须按QList更改QList<const QString>。在某些地方,您可能还希望避免修改实际的QList<QString>对象,例如:

QList

顺便说一句,Qt中的// do not allow GroupObject(...) to change external 'tags' instance GroupObject(const QList<QString> &tags, QObject *parent=0); // return reference to internal object field and // do not allow callers to use that reference for changing that internal field // it does not change instance of GroupObject, so // there is 'const' modifier of the member function. const QList<QString>& tags() const; // or provide full copy of returned object QList<QString> tags() const; // do not allow to change external 'tags' inside 'setTags()' void setTags(const QList<QString> &tags); 类提供了QStringList的列表,提供了额外的功能。

答案 1 :(得分:2)

如果您不需要按值传递,则不需要QList<QObject*> dataListQObject也是对象的拥有容器。因此你也可以写:

class F {
  QObject data;
  ...
  void foo() {
    QStringList tags = ...;
    new GroupObject(tags, &data);
    ...
  }
  void bar() {
    // iterate all data objects
    for (auto obj : data.children()) {
      auto group = qobject_cast<GroupObject>(obj);
      if (group) { qDebug() << group.tags(); continue; }
      ...
    }
  }
}

通过利用QObject作为其他对象的拥有容器,您不必担心资源泄漏。它将删除它拥有的所有孩子。由于您按值保存data,因此您甚至不需要编写析构函数。利用编译器为您管理资源,它很擅长:)