我在用自定义类型创建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/

10-11 16:11