我在使用自定义类型创建QVariant
时遇到问题。这是一个小例子,展示了我想要实现的目标:
main.cpp中:
#include "MyClass.h"
int main() {
MyClass some_object;
QVariant variant(some_object);
return 0;
}
包括/ MyClass.h:
#pragma once
#include <QtCore>
class MyClass {
public:
MyClass() : _my_member(0.0) {}
MyClass(const MyClass &other) { _my_member = other._my_member; }
~MyClass() {}
MyClass& operator=(MyClass& other)
{
swap(*this, other);
return *this;
}
MyClass(MyClass&& other) : MyClass()
{
swap(*this, other);
}
friend void swap(MyClass& first, MyClass& second)
{
using std::swap;
swap(first._my_member, second._my_member);
}
private:
float _my_member;
};
Q_DECLARE_METATYPE(MyClass);
构建失败,并显示以下错误:
error: no matching function for call to ‘QVariant::QVariant(MyClass&)’
QVariant variant(some_object);
^
如何解决此错误?
答案 0 :(得分:7)
您正在使用QVariant
的实例调用MyClass
的构造函数:QVariant
中没有此类构造函数。您正在寻找的是QVariant::fromValue
:
#include "MyClass.h"
int main() {
MyClass some_object;
QVariant variant = QVariant::fromValue(some_object);
return 0;
}
或者,您可以使用QVariant::setValue
:
#include "MyClass.h"
int main() {
MyClass some_object;
QVariant variant;
variant.setValue(some_object);
return 0;
}
注意:强>
要从QVariant中检索值,您必须使用模板方法QVariant::value
,可选择使用QVariant::canConvert
:
if (variant.canConvert<MyClass>())
MyClass retrieve_object = variant.value<MyClass>();
<强>注2:强>
您似乎尝试实施copy-and-swap idiom。您的operator=
应为:
MyClass& operator=(MyClass other)
{
swap(*this, other);
return *this;
}
而不是:
MyClass& operator=(MyClass& other)
{
swap(*this, other);
return *this;
}
如果您使用引用执行交换,other
将被修改,我怀疑您是否需要它。
答案 1 :(得分:6)
要使用QVariant
的{{3}}方法从您的班级中制作QVariant
个对象:
QVariant variant = QVariant::fromValue(some_object);
您有错误,因为QVariant
中的参数类型MyClass&
没有此类构造函数。