2015-09-12 5 views
1

Helo там,Установка QList подобъектом

Я устанавливаю один объект, чтобы получить его в 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; 
    } 
} 

И я призываю, чтобы установить один из QList GroupObject в примере наблюдения:

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

Как я могу сделать это в правильной концепции?

Благодаря

ответ

3

Тип tags является QList<QString>, однако GroupObject contrustuctor принимает QList<const QString>.

На самом деле const модификатор QString не имеет никакого смысла в QList, так как она не защищает от QList модификации. Он просто отрицает модификацию QList элементов. В этом случае вы не можете даже скопировать один такой QList элемент во время инициализации QList.

Итак, чтобы скомпилировать код, вы должны изменить QList<const QString> от QList<QString>. В некоторых местах вы можете также защитить от изменения фактического QList объекта, например:

// 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 класса в Qt для списков QString, что обеспечивает дополнительную функциональность.

2

Если вам не нужно передавать его по значению, то QList<QObject*> dataList не требуется. A QObject также является контейнером для хранения объектов. Таким образом, можно было бы написать:

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 по значению, вам даже не нужно писать деструктор. Используйте компилятор для управления ресурсами для вас, это хорошо! :)

Смежные вопросы