2

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

也没有任何运气在来源中挖掘它......

因此,任何信息都值得赞赏。

4

3 回答 3

6

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

祝你好运。

于 2013-03-20T23:16:14.957 回答
0

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

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

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

于 2013-03-20T23:09:29.060 回答
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)
   }
}
于 2015-09-30T22:16:39.760 回答