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 ));
我如何以正确的理念做到这一点?
由于
答案 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*> dataList
。 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
,因此您甚至不需要编写析构函数。利用编译器为您管理资源,它很擅长:)