2016-09-16 18 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のメタタイプの1つとして登録されていないということは、もっと問題に思えます。 – 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

あなたのクラスの使用からQVariantfromValue方法QVariantオブジェクトを作成するには、次のタイプMyClass&のパラメータを持つQVariantには、このようなコンストラクタが存在しないため

QVariant variant = QVariant::fromValue(some_object); 

あなたは、エラーを持っているが。

+0

ありがとうございました。今私はこれを試していないために馬鹿だと感じる。 – user2925177

+0

QVariant :: QVariant(MyClass&)を使うのは根本的に間違っています。まず、QVariant :: QVariant(const MyClass&)を使用しようとする必要があります。 – user2672165

関連する問題