我似乎没有找到任何有关向QML添加基本类型的资源。我不是指QObject或更高的派生元素,而是基本类型 - bool,int,real等。
在消息来源中没有任何运气挖掘......
所以感谢任何信息。
答案 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 article和this 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)
}
}