2016-09-16 3 views
3

У меня возникли проблемы с созданием QVariant с настраиваемым типом. Вот небольшой пример, который показывает, что я хочу добиться:Qt - Нет подходящей функции для вызова «QVariant :: QVariant (MyClass &)»

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

Вы прочитали это? http://doc.qt.io/qt-5/custom-types.html кажется более проблемой, что ваш тип на самом деле не зарегистрирован как один из мета-типов qt. – Hayt

+0

Несвязанный с CMake. Измените тег. – usr1234567

+0

@Hayt Да, я прочитал этот сайт и выполнил его инструкции. – user2925177

ответ

4

Вы вызываете конструктор 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::setValue, необязательно с 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 будет изменен, и я сомневаюсь, что вы хотите.

6

Чтобы QVariant объекта из использования класса fromValue метода QVariant:

QVariant variant = QVariant::fromValue(some_object); 

У вас есть ошибка, потому что нет такого конструктора в QVariant с параметром типа MyClass&.

+0

Большое спасибо. Теперь я чувствую себя глупо, что не пробовал это. – user2925177

+0

Это принципиально неправильно, пытаясь использовать QVariant :: QVariant (MyClass &). Следует сначала попытаться использовать QVariant :: QVariant (const MyClass &). – user2672165

Смежные вопросы