Qt - 没有匹配函数调用‘QVariant::QVariant(MyClass&)’
Posted
技术标签:
【中文标题】Qt - 没有匹配函数调用‘QVariant::QVariant(MyClass&)’【英文标题】:Qt - No matching function for call to ‘QVariant::QVariant(MyClass&)’ 【发布时间】:2016-09-16 07:39:23 【问题描述】:我无法使用自定义类型创建 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);
^
我该如何解决这个错误?
【问题讨论】:
你读过这个吗? doc.qt.io/qt-5/custom-types.html 你的类型并没有真正注册为 qt 的元类型之一,这似乎是一个问题 与 CMake 无关。请编辑掉标签。 @Hayt 是的,我已阅读此网站并按照其说明进行操作。 @usr1234567 抱歉,我看不出这与 CMake 无关。编辑:你是对的。它确实与 CMake 无关。 @user2925177 这是一个编译问题。这更像是一个 Qt 使用问题,而不是 cmake。在文章中链接的示例中,Variant 值设置为QVariant stored; stored.setValue(message);
你试过了吗?
【参考方案1】:
您正在使用MyClass
的实例调用QVariant
的构造函数: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
将被修改,我怀疑您是否想要它。
【讨论】:
【参考方案2】:要让你的班级中的QVariant
对象使用QVariant
的fromValue 方法:
QVariant variant = QVariant::fromValue(some_object);
您有错误,因为QVariant
中没有这样的构造函数,其参数类型为MyClass&
。
【讨论】:
非常感谢。现在我因为没有尝试过而感到愚蠢。 尝试使用 QVariant::QVariant(MyClass&) 是根本错误的。应该首先尝试使用 QVariant::QVariant(const MyClass&)。以上是关于Qt - 没有匹配函数调用‘QVariant::QVariant(MyClass&)’的主要内容,如果未能解决你的问题,请参考以下文章
Qt - 没有匹配函数调用‘QVariant::QVariant(MyClass&)’
QT-osgQOpenGL.lib: error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MTd_StaticDebug”不匹配值“MDd_DynamicDebug”