我在创建QVariant自定义类型时遇到问题.这是一个小例子,展示了我想要实现的目标:
main.cpp中:
#include "MyClass.h"
int main() {
MyClass some_object;
QVariant variant(some_object);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
包括/ 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);
Run Code Online (Sandbox Code Playgroud)
构建失败,并出现以下错误:
error: no matching function for call to ‘QVariant::QVariant(MyClass&)’
QVariant variant(some_object);
^
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个错误?
你正在QVariant使用以下实例调用构造函数MyClass:没有这样的构造函数QVariant.你在寻找的是QVariant::fromValue:
#include "MyClass.h"
int main() {
MyClass some_object;
QVariant variant = QVariant::fromValue(some_object);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
或者,您可以使用QVariant::setValue:
#include "MyClass.h"
int main() {
MyClass some_object;
QVariant variant;
variant.setValue(some_object);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
注意:
要从QVariant中检索值,您必须使用模板方法QVariant::value,可选择QVariant::canConvert:
if (variant.canConvert<MyClass>())
MyClass retrieve_object = variant.value<MyClass>();
Run Code Online (Sandbox Code Playgroud)
笔记2:
看起来你试图实现复制和交换习惯用法.你的operator=应该是:
MyClass& operator=(MyClass other)
{
swap(*this, other);
return *this;
}
Run Code Online (Sandbox Code Playgroud)
代替:
MyClass& operator=(MyClass& other)
{
swap(*this, other);
return *this;
}
Run Code Online (Sandbox Code Playgroud)
如果你用引用执行交换,other将被修改,我怀疑你想要它.
要从QVariant您的类中创建对象,请使用fromValue方法QVariant:
QVariant variant = QVariant::fromValue(some_object);
Run Code Online (Sandbox Code Playgroud)
你有错误,因为QVariant类型参数中没有这样的构造函数MyClass&.
| 归档时间: |
|
| 查看次数: |
1142 次 |
| 最近记录: |