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&amp;

【讨论】:

非常感谢。现在我因为没有尝试过而感到愚蠢。 尝试使用 QVariant::QVariant(MyClass&) 是根本错误的。应该首先尝试使用 QVariant::QVariant(const MyClass&)。

以上是关于Qt - 没有匹配函数调用‘QVariant::QVariant(MyClass&)’的主要内容,如果未能解决你的问题,请参考以下文章

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

错误:没有匹配函数来调用...返回语句

Qt插槽和信号:MainWindow中没有匹配的功能

Qt invokeMethod 异步调用

如何在 Qt 中使用 x()、y() 函数

QT-osgQOpenGL.lib: error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MTd_StaticDebug”不匹配值“MDd_DynamicDebug”