2013-03-20 83 views
2

我似乎沒有找到任何將基本類型添加到QML的資源。我不是指QObject或更高派生的元素,而是基本類型 - 布爾,int,實數等等。如何在QML中創建自定義基本類型?

沒有任何運氣的來源以及挖掘它...

因此,任何信息表示讚賞。

+0

哪些基本類型是你想實現?我只是好奇。 – 2013-08-29 20:33:45

回答

5

我假設你想註冊比int,bool,real更復雜的類型,因爲它們已經存在。

你不能在Qt 4.x中做到這一點。在Qt 5(QML 2)中是可能的,但是沒有公共API。如果你仍然想這樣做,你需要深入研究一下代碼,看看它是如何完成的,因爲沒有文檔。

您需要爲每個類型實現一個QQmlValueTypeProvider(qqmlglobal_p.h)併爲其創建QQmlValueTypeBase <>子類(qqmlvaluetype_p.h)。然後在你的插件的registerTypes()中使用QQml_addValueTypeProvider()註冊你的值類型提供者。你可以看看

一個例子是QGeoCoordinate,QGeoRectangle等從QtLocation模塊:http://qt.gitorious.org/qt/qtlocation/trees/master/src/imports/location

好運。

+6

有趣的QML如何使一些繁瑣的事情容易和一些簡單的事情乏味......要去試試看。 – dtech 2013-03-20 23:30:57

1

檢查出this articlethis article關於如何在Qt/QML中創建自定義類型。至於創建你自己的原始類型(int,bool,double等)...我不認爲這是一個可能性,而不深入到Qt語言本身的源代碼,我不認爲這是一個好主意。

製作自己的原始類型有什麼用途?爲什麼你不能使用已經由語言本身定義的那些?

如果您要做的是重命名原始類型,總是有一個選項可以執行typedef。 「typedef的目的是爲現有類型指定替代名稱,通常那些標準聲明很繁瑣,可能會令人困惑,或者可能因實現而異的其他類型。」

+0

我認爲這很清楚爲什麼你得到了一個downvote - 你的答案提供的信息不僅是不相關的,但也是我所知道的。至於你爲什麼低估了一個好的答案和問題本身......現在好奇...... – dtech 2013-03-20 23:41:48

+0

@ddriver沒有downvote任何東西。我想我可能誤解了你的問題,因爲你在發佈的問題中提到了基本類型,這沒有任何意義。 – stackunderflow 2013-03-20 23:45:57

+0

好吧,如果你沒有,我真的很想知道誰做了......並在幾分鐘內退出。如果不是你,請道歉。 – dtech 2013-03-20 23:47:14

0

從Qt 5.5開始,您可以使用Q_GAGDET創建基本類型。例如,您可以創建自定義MyError類:

class MyError 
{ 
    Q_GADGET 
    Q_ENUMS(ErrorType) 

    Q_PROPERTY(bool suppressed READ suppressed WRITE setSupressed) 
    Q_PROPERTY(QString message READ message WRITE setMessage) 
    Q_PROPERTY(ErrorType type READ type WRITE setType) 

public: 
    enum ErrorType { 
     Warning, //Survex should still run 
     Fatal, //Survex will not run 
     Unknown 
    }; 

    cwSurveyChunkError(); 
    cwSurveyChunkError(const cwSurveyChunkError &); 
    cwSurveyChunkError &operator=(const cwSurveyChunkError &); 
    ~cwSurveyChunkError(); 

    ErrorType type() const; 
    void setType(ErrorType type); 

    QString message() const; 
    void setMessage(QString message); 

    bool suppressed() const; 
    void setSupressed(bool suppressed); 

private: 
    QSharedDataPointer<MyErrorData> data; 
}; 

Q_DECLARE_METATYPE(MyError) //Allows you to use this class in QVariant 

您需要QML註冊類型,使用qmlRegisterUncreatableType。這允許您在QML中使用MyError.ErrorType枚舉。由於MyError是一個Q_GADGET,你可以直接將它傳遞給QML,並使用MyError屬性,就好像它是一個QObject。 Q_GADGET對象是QObject的輕量級版本,除非它們不能在QML中創建,並且信號和插槽在其中不起作用。

QML例如:

Item { 

    Component.onCompleted: { 
     var error = model.errorAt(4); //Returns MyError 
     console.log("Error:" + error.type + " " + error.message + " " + error.suppressed) 
    } 
} 
+0

雖然這個答案有價值,但它並沒有真正解決創建基本QML類型的問題,這些類型沒有屬性,枚舉或任何其他類型。這爲非QObject派生對象帶來了元支持。有一個微妙的區別。 – dtech 2015-09-30 23:09:06

+0

我想,如果你想創建類似Qt.rect()或Qt.point()的東西,這可能是最好的方法。 QML幾乎支持所有超級基本類型,如int,bool,double等... – vpicaver 2015-09-30 23:50:33

相關問題