Qt - 没有匹配的函数调用‘QVariant::QVariant(MyClass&)’。

6

我有些困难在创建一个自定义类型的 QVariant 上。下面是一个简单的例子,展示了我的目标:

main.cpp:

#include "MyClass.h"

int main() {
  MyClass some_object;
  QVariant variant(some_object);
  return 0;
}

include/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);
                              ^

我该如何解决这个错误?

3
你读过这个吗?http://doc.qt.io/qt-5/custom-types.html 看起来更像是你的类型没有被注册为Qt元类型的问题。请注意,我将尽最大努力进行翻译,但不可避免地会有一些信息丢失或歧义,因此最好进行人工审查以确保准确性。 - Hayt
@Hayt 是的,我已经阅读了这个网站并按照它的指示操作。 - wonkydonkey
@usr1234567 抱歉,我没有看出这与CMake无关。编辑:你是对的。它确实与CMake无关。 - wonkydonkey
1
@user2925177 这是一个编译问题。这更多是一个 Qt 使用问题,而不是 CMake。在文章中链接的示例中,Variant 值是通过 QVariant stored; stored.setValue(message); 设置的。你试过这个吗? - Hayt
分配运算符应该以const MyClass&other作为参数。请首先更正此错误,因为这是一个基本错误。 - user2672165
显示剩余2条评论
2个回答

8
您正在使用MyClass的实例调用QVariant的构造函数:QVariant中没有这样的构造函数。您要找的是QVariant::fromValue。请注意,不要删除HTML标签。
#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:

看起来你尝试实现了拷贝并交换惯用法。你的operator=应该是:

MyClass& operator=(MyClass other)
{
  swap(*this, other);
  return *this;
}

改为:

MyClass& operator=(MyClass& other)
{
  swap(*this, other);
  return *this;
}

如果您使用引用执行交换操作,other将被修改,我怀疑您是否希望这样。

6
使用 QVariant 类创建对象,可以使用QVariantfromValue方法:

QVariant variant = QVariant::fromValue(some_object);

您出现了错误,因为在 QVariant 中没有使用 MyClass& 类型的参数的构造函数。

非常感谢。现在我感到很傻,因为我没有尝试过这个。 - wonkydonkey
尝试使用 QVariant::QVariant(MyClass&) 是基本错误的。应该首先尝试使用 QVariant::QVariant(const MyClass&)。 - user2672165

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接