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

won*_*key 5 c++ qt c++11

我在创建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)

我该如何解决这个错误?

was*_*ful 7

你正在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将被修改,我怀疑你想要它.


Kir*_*kov 6

要从QVariant您的类中创建对象,请使用fromValue方法QVariant:

QVariant variant = QVariant::fromValue(some_object);
Run Code Online (Sandbox Code Playgroud)

你有错误,因为QVariant类型参数中没有这样的构造函数MyClass&.