2012-09-23 60 views
2

我有一個自定義類型的屬性。重載qt屬性

class foo : public QObject { 
    Q_OBJECT 
    Q_PROPERTY(Custom x READ x WRITE set_x) 

public: 
    void set_x(Custom &x) { /*whatnot*/} 
} 

QJson有效地調用下面的動態分配:

((QObject*)&foo_instance)->setProperty("x", QVariant(QString("something-from-json"))) 

返回false,如文檔講解:

如果該值不符合屬性的類型兼容的,財產沒有改變,並返回false。

我該如何將它填充到我的自定義值中?清楚地定義一個側面功能void set_x(QString)void set_x(QVariant)不可能工作,因爲屬性系統將不知道這個訪問器。

此外,檢查類型兼容性在哪裏? - 程序控制從未達到

int foo::qt_metacall(QMetaObject::Call _c, int _id, void **_a)

由元對象編譯器生成的函數..

我怎樣才能讓這些類型Custom兼容嗎?

+0

對接受的答案的評論實際上爲我指出了。 – qdot

回答

2

它可以讀取The Property System

特別是屬性和自定義類型部分非常有用。

如果要簡要說明,所有屬性另存爲QVariant。
您需要使用Q_DECLARE_METATYPE宏才能使您的自定義類型與Qt屬性兼容。
之後,你必須撥打電話qRegisterMetaType函數來註冊你的類型。

+1

是的,我讀過這部分的文檔 - 問題始於定義WRITE訪問器 - 它需要是Custom(或Custom或Custom *,IIRC)類型 - 但我得到setProperty動態調用者來推動QVariant(QString).value()到那裏。有一個Custom(QString)創建器,但我無法靜態或動態地調用setProperty。並且聲明WRITE訪問器類型的set_x(QVariant&v)也沒有幫助 - 它沒有被調用。 – qdot

+2

如果我沒有弄錯,你只有一種方法 - 使用QString屬性。如果你需要,你可以將QString轉換爲Custom類型爲setter。 –