如何在QML中创建自定义基本类型?

时间:2013-03-20 22:06:14

标签: c++ qt types customization qml

我似乎没有找到任何有关向QML添加基本类型的资源。我不是指QObject或更高的派生元素,而是基本类型 - bool,int,real等。

在消息来源中没有任何运气挖掘......

所以感谢任何信息。

3 个答案:

答案 0 :(得分:5)

我假设您想要注册比int,bool,real更复杂的类型,因为它们已经存在。

你不能在Qt 4.x中这样做。在Qt 5(QML 2)中是可能的,但是没有公共API。如果你仍然想要这样做,你需要深入研究一些代码,看看它是如何完成的,因为没有文档。

您需要实现QQmlValueTypeProvider(qqmlglobal_p.h)并创建QQmlValueTypeBase<>每个类型的子类(qqmlvaluetype_p.h)。然后在插件的registerTypes()中使用QQml_addValueTypeProvider()注册您的值类型提供程序。

您可以看到的一个例子是来自QtLocation模块的QGeoCoordinate,QGeoRectangle等:http://qt.gitorious.org/qt/qtlocation/trees/master/src/imports/location

祝你好运。

答案 1 :(得分:1)

查看this articlethis article,了解如何在Qt / QML中创建自定义类型。至于创建自己的原始类型(int,bool,double等)...我不认为这是一种可能性,如果不深入研究Qt语言本身的源代码,我认为这不是一个好主意。

制作自己的原始类型有什么目的?为什么你不能使用已经由语言本身定义的那些?

如果您要尝试重命名基本类型,则始终可以选择执行 typedef 。 “typedef的目的是为现有类型指定替代名称,通常是那些标准声明繁琐,可能令人困惑,或者可能因实现而异。”

答案 2 :(得分: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

您需要使用qmlRegisterUncreatableType向qml注册类型。这允许您在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)
   }
}