Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在QML中创建自定义基本类型?_C++_Qt_Types_Customization_Qml - Fatal编程技术网

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

C++ 如何在QML中创建自定义基本类型?,c++,qt,types,customization,qml,C++,Qt,Types,Customization,Qml,我似乎找不到任何关于向QML添加基本类型的资源。我不是指QObject或更高的派生元素,而是基本类型——bool、int、real等等 也没有在资料来源中找到它的运气 因此,欢迎提供任何信息。查看并了解如何在Qt/QML中创建自定义类型。至于创建自己的基本类型(int、bool、double等)。。。如果不深入研究Qt语言本身的源代码,我认为这是不可能的,我认为这不是一个好主意 制作自己的原始类型有什么目的?为什么不能使用语言本身已经定义的那些呢 如果您试图重命名一个基元类型,则始终可以选择执行

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

也没有在资料来源中找到它的运气

因此,欢迎提供任何信息。

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

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


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

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

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

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

您可以查看的一个示例是QtLocation模块中的QGeoCoordination、QGeoRectangle等:


祝您好运。

从Qt5.5开始,您可以使用创建基本类型。例如,您可以创建自定义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使一些乏味的事情变得简单,而使一些简单的事情变得乏味。。。我想我很清楚你为什么投了反对票——你的回答提供的信息不仅无关,而且我也很清楚。至于为什么你否决了一个好答案和问题本身。。。这很奇怪…@ddriver没有否决任何东西。我想我可能误解了你的问题,因为你在发帖的问题中提到了基本类型,这没有任何意义。如果你没有,我真的想知道是谁做的。。。几分钟后就骑上了。如果不是你,我会道歉。没问题。很高兴你找到了一个足够的答案。你想实现什么样的基本类型?我只是好奇。虽然这个答案很有价值,但它并没有真正解决创建基本QML类型的问题,因为基本QML类型没有属性、枚举或任何东西。这带来了对非QObject派生对象的元支持。有一个微妙的区别。我想,如果你试图创建像Qt.rect()或Qt.point()这样的东西,这可能是最好的方法。QML几乎支持所有的超基本类型,如int、bool、double等。。。
Item {

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