我似乎沒有找到任何將基本類型添加到QML的資源。我不是指QObject或更高派生的元素,而是基本類型 - 布爾,int,實數等等。如何在QML中創建自定義基本類型?
沒有任何運氣的來源以及挖掘它...
因此,任何信息表示讚賞。
我似乎沒有找到任何將基本類型添加到QML的資源。我不是指QObject或更高派生的元素,而是基本類型 - 布爾,int,實數等等。如何在QML中創建自定義基本類型?
沒有任何運氣的來源以及挖掘它...
因此,任何信息表示讚賞。
我假設你想註冊比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
好運。
有趣的QML如何使一些繁瑣的事情容易和一些簡單的事情乏味......要去試試看。 – dtech 2013-03-20 23:30:57
檢查出this article和this article關於如何在Qt/QML中創建自定義類型。至於創建你自己的原始類型(int,bool,double等)...我不認爲這是一個可能性,而不深入到Qt語言本身的源代碼,我不認爲這是一個好主意。
製作自己的原始類型有什麼用途?爲什麼你不能使用已經由語言本身定義的那些?
如果您要做的是重命名原始類型,總是有一個選項可以執行typedef。 「typedef的目的是爲現有類型指定替代名稱,通常那些標準聲明很繁瑣,可能會令人困惑,或者可能因實現而異的其他類型。」
我認爲這很清楚爲什麼你得到了一個downvote - 你的答案提供的信息不僅是不相關的,但也是我所知道的。至於你爲什麼低估了一個好的答案和問題本身......現在好奇...... – dtech 2013-03-20 23:41:48
@ddriver沒有downvote任何東西。我想我可能誤解了你的問題,因爲你在發佈的問題中提到了基本類型,這沒有任何意義。 – stackunderflow 2013-03-20 23:45:57
好吧,如果你沒有,我真的很想知道誰做了......並在幾分鐘內退出。如果不是你,請道歉。 – dtech 2013-03-20 23:47:14
從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)
}
}
哪些基本類型是你想實現?我只是好奇。 – 2013-08-29 20:33:45