繁体   English   中英

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

[英]How to create custom basic type in QML?

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

也没有在源头上挖掘它的运气...

因此,任何信息表示赞赏。

我假设您想注册比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

祝好运。

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

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

如果您要执行的操作是重命名基本类型,则始终可以选择执行typedef “ typedef的目的是为现有类型分配替代名称,大多数情况是那些标准声明繁琐,可能造成混淆或可能因一种实现而异的类型。”

从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)
   }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM