2016-09-16 64 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的構造函數,其實例爲MyClassQVariant中沒有這樣的構造函數。什麼你要找的是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對象從你的類使用QVariantfromValue方法:

QVariant variant = QVariant::fromValue(some_object); 

你有錯誤,因爲在QVariant沒有這樣的構造與MyClass&類型的參數。

+0

非常感謝。現在我感到很蠢,因爲沒有嘗試過。 – user2925177

+0

嘗試使用QVariant :: QVariant(MyClass&)是根本錯誤的。應該首先嚐試使用QVariant :: QVariant(const MyClass&)。 – user2672165

相關問題