我在创建一个具有自定义类型的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);
^如何解决这个错误?
发布于 2016-09-16 08:04:50
您正在用MyClass实例调用MyClass的构造函数:QVariant中没有这样的构造函数。
#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>();Note2:
看来您试图实现copy-and-swap idiom。您的operator=应该是:
MyClass& operator=(MyClass other)
{
swap(*this, other);
return *this;
}而不是:
MyClass& operator=(MyClass& other)
{
swap(*this, other);
return *this;
}如果您使用引用执行交换,other将被修改,我怀疑您是否想要它。
发布于 2016-09-16 08:03:34
要使类中的QVariant对象使用QVariant的fromValue方法
QVariant variant = QVariant::fromValue(some_object);您有错误,因为在QVariant中没有MyClass&类型参数的此类构造函数。
https://stackoverflow.com/questions/39526165
复制相似问题