QML   QQmlEngine 宏

QML   QQmlEngine 宏

QML_ADDED_IN_MINOR_VERSION(VERSION)
  • 声明封闭类型或命名空间是相对于模块的主版本添加到指定的次要版本中。
    • 小版本被假定与Q_REVISION()宏对方法、插槽或信号给出的任何修订,以及Q_PROPERTY()声明的属性上的任何REVISION标记一致。
    • QML_ADDED_IN_MINOR_VERSION()仅在 QML_ELEMENTQML_NAMED_ELEMENT(), QML_ANONYMOUS, 或QML_INTERFACE宏时生效。
  • 如果类型所属的QML模块的导入版本低于以这种方式确定的版本,那么QML类型是不可见的。
  • 参考:QML_ELEMENT 和 QML_NAMED_ELEMENT().

 

QML_ANONYMOUS

 

QML_ATTACHED(ATTACHED_TYPE)

 

QML_DECLARE_TYPE
  • 等价于Q_DECLARE_METATYPE(TYPE *)和Q_DECLARE_METATYPE(QQmlListProperty<TYPE>)

 

QML_DECLARE_TYPEINFO(Type, Flags)
  • 按照指定的标志声明给定类型的其他属性。
  • 当前唯一支持的类型信息是QML_HAS_ATTACHED_PROPERTIES,它声明类型支持附加属性。
    • 如果Type包含QML_ATTACHED宏,QML_DECLARE_TYPEINFO()是不必要的。

 

QML_ELEMENT
  • 声明QML中可用的封闭类型或命名空间,将其类名或命名空间名作为QML元素名。
  • 例如,这使得c++类Slider可以作为QML类型Slider使用。
class Slider : public QObject
{
    Q_OBJECT
    QML_ELEMENT
    ...
}
  • 你可以使用构建系统在类型命名空间com.mycompany.qmlcomponents中注册类型,在你的项目文件中指定以下内容:
CONFIG += qmltypes
QML_IMPORT_NAME = com.mycompany.qmlcomponents
QML_IMPORT_MAJOR_VERSION = 1
  • 一旦注册,该类型可以通过导入相同的类型名称空间和版本号在QML中使用:
import com.mycompany.qmlcomponents 1.0

Slider {
    // ...
}

 

QML_EXTENDED(EXTENDED_TYPE)

 

QML_FOREIGN(FOREIGN_TYPE)

 

QML_INTERFACE
  • 这个宏在QML系统中将封闭的c++类型注册为接口。
  • 在QML中注册为接口的类型也应该将自己声明为元对象系统(meta object system)的接口。例如:
struct FooInterface
{
    QML_INTERFACE
public:
    virtual ~FooInterface();
    virtual void doSomething() = 0;
};

Q_DECLARE_INTERFACE(FooInterface, "org.foo.FooInterface")
  • 当以这种方式注册到QML时,它们可以作为属性类型使用:
Q_PROPERTY(FooInterface *foo READ foo WRITE setFoo)

 

QML_NAMED_ELEMENT(name)
  • 声明QML中可用的封闭类型或名称空间,使用name作为元素名。否则行为与 QML_ELEMENT 相同。
class SqlEventDatabase : public QObject
{
    Q_OBJECT
    QML_NAMED_ELEMENT(EventDatabase)

    // ...
};

 

QML_REMOVED_IN_MINOR_VERSION(VERSION)
  • 声明封闭类型或命名空间在指定的小版本中被删除,相对于模块的主版本。
    • 这在替换QML类型的实现时非常有用。
    • 如果相应的 QML_ADDED_IN_MINOR_VERSION() 存在不同类型或命名空间相同的QML名字,然后删除类型时使用导入模块的版本低于版本,和添加类型时使用进口大于或等于版本版本的模块。
  • QML_REMOVED_IN_MINOR_VERSION()只有当类型或名称空间在QML中可用时才会生效,方法是使用QML_ELEMENTQML_NAMED_ELEMENT(), QML_ANONYMOUS, 或 QML_INTERFACE 宏。
  • 参考:QML_ELEMENT 和 QML_NAMED_ELEMENT()。

 

QML_SINGLETON
  • 在QML中声明封闭类型为单例。
    • 只有当类型是Q_OBJECT并且在QML中可用(通过使用QML_ELEMENT或QML_NAMED_ELEMENT()宏)时才会生效。
    • 默认情况下,当类型第一次被访问时,每个QQmlEngine将尝试使用该类型的默认构造函数创建一个单例实例。
    • 如果没有默认构造函数,单例对象最初是不可访问的。
    • 可以通过使用特定的工厂函数调用qmlRegisterSingletonType()或使用相同类、相同类型名称空间和版本的特定实例调用qmlRegisterSingletonInstance()来覆盖此行为。
  • 参考:QML_ELEMENTQML_NAMED_ELEMENT(), 和qmlRegisterSingletonInstance().

 

QML_UNAVAILABLE
  • 这个宏声明封闭类型在QML中不可用。
    • 它使用您指定的任何进一步的QML宏,将一个名为QQmlTypeNotAvailable的内部虚拟类型注册为QML_FOREIGN()类型。
  • 通常,模块导出的类型应该是固定的。但是,如果c++类型不可用,您至少应该“reserve”QML类型名,并为不可用类型的用户提供有意义的错误消息。
  • 例子:
#ifdef NO_GAMES_ALLOWED
struct MinehuntGame
{
    Q_GADGET
    QML_NAMED_ELEMENT(Game)
    QML_UNAVAILABLE
    QML_UNCREATABLE("Get back to work, slacker!");
};
#else
class MinehuntGame : public QObject
{
    Q_OBJECT
    QML_NAMED_ELEMENT(Game)
    // ...
};
#endif
  • 这将导致任何试图使用“Game”类型的QML产生错误消息:
fun.qml: Get back to work, slacker!
   Game {
   ^
  • 用这种技术,您只需要一个Q_GADGET结构体来定制错误消息,而不需要一个完整的QObject。
  • 如果没有QML_UNCREATABLE(), QML_UNAVAILABLE仍然会导致比完全未知类型通常的“is not a type”更具体的错误消息。
  • 参考:QML_ELEMENTQML_NAMED_ELEMENT(), QML_UNCREATABLE(), 和QML_FOREIGN().

 

QML_UNCREATABLE(reason)
  • 声明不能从QML中创建封闭类型。
    • 如果该类型在QML中可用,则通过使用QML_ELEMENT或QML_NAMED_ELEMENT()宏来生效。
    • 如果检测到试图从QML创建类型,则将其原因作为错误消息发出。
  • 有些QML类型是隐式不可创建的,特别是使用QML_ANONYMOUS公开的类型,或者使用QML_ELEMENT或QML_NAMED_ELEMENT()公开的名称空间。
    • 对于这类类型,QML_UNCREATABLE()可用于提供自定义错误消息。
  • 参考: QML_ELEMENTQML_NAMED_ELEMENT(), and QML_ANONYMOUS.
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值