Qt - 没有用于调用'QVariant :: QVariant(MyClass&)'的匹配函数

时间:2016-09-16 07:39:24

标签: c++ qt c++11

我在使用自定义类型创建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);
                              ^

如何解决此错误?

2 个答案:

答案 0 :(得分:7)

您正在使用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将被修改,我怀疑您是否需要它。

答案 1 :(得分:6)

要使用QVariant的{​​{3}}方法从您的班级中制作QVariant个对象:

QVariant variant = QVariant::fromValue(some_object);

您有错误,因为QVariant中的参数类型MyClass&没有此类构造函数。