user2925177 user2925177 - 1 year ago 171
C++ Question

Qt - No matching function for call to ‘QVariant::QVariant(MyClass&)’

I'm having trouble creating a

QVariant
with a custom type. Here is a small example that shows what I want to achieve:

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);


The build fails with the following error:

error: no matching function for call to ‘QVariant::QVariant(MyClass&)’
QVariant variant(some_object);
^


How can I solve this error?

Answer Source

You're calling QVariant's constructor with an instance of MyClass: there is no such constructor in QVariant. What you're looking for is QVariant::fromValue:

#include "MyClass.h"

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

Alternatively, you can use QVariant::setValue:

#include "MyClass.h"

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

Note:

To retrieve the value from QVariant, you will have to use the template method QVariant::setValue, optionally with QVariant::canConvert:

if (variant.canConvert<MyClass>())
    MyClass retrieve_object = variant.value<MyClass>();

Note2:

Looks like you tried to implement copy-and-swap idiom. Your operator= should be:

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

Instead of:

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

If you perform a swap with a reference, other will be modified, and I doubt you want it.

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download