我在用自定义类型创建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);
^
我该如何解决这个错误?
最佳答案
您正在使用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
将被修改,我怀疑您是否想要它。关于c++ - Qt-没有匹配函数可以调用 ‘QVariant::QVariant(MyClass&)’,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39526165/