go top

元对象系统

网络释义

  Meta-Object System

...能够跨越库边界的动态转换机制。 通过继承 QObject 类,我们可以很方便地获得这些特性。当然,这些特性都是由 moc 帮助我们实现的。moc 其实实现的是一个叫做元对象系统meta-object system)的机制。正如上面所说,这是一个标准 C++ 的扩展.

基于28个网页-相关网页

  meta object system

... QObject  QApplication  QWidget Qt对象模型  元对象系统  信号和槽 元对象系统 Qt中的元对象系统(meta object system)是用来处理对象间通信的信号 //槽机制、运行时的类型信息和动态属性系统。

基于8个网页-相关网页

有道翻译

元对象系统

Meta-object system

以上为机器翻译结果,长、整句建议使用 人工翻译

双语例句

  • 在Groovy中一个特殊运行时系统叫做MOP(元对象协议Meta - Object Protocol),负责方法分派逻辑

    There is a specific runtime system, called the MOP (stands for Meta-Object Protocol) that is responsible for the dispatching logic.

    youdao

  • 从概念上讲对象存储系统可以视作对象平面名称空间它们的关联数据

    Conceptually, an object storage system can be viewed as a flat namespace of objects and their associated metadata.

    youdao

  • 对象存储系统提供查询可用数据能力

    Object storage systems also provide the ability to query the available metadata.

    youdao

更多双语例句

百科

元对象系统

Qt 元对象系统(Meta-Object System) Qt的元对象系统基于如下三件事情: 1. 类:QObject,为所有需要利用元对象系统的对象提供了一个基类。 2. 宏:Q_OBJECT,通常可以声明在类的私有段中,让该类可以使用元对象的特性,比如动态属性,信号和槽。 3. 编译器:元对象编译器(moc)为每个QObject子对象自动生成必要的代码来实现元对象特性。 moc工具会读入C++的源文件,如果它发现了一个或者多个声明了Q_OBJECT宏的类,它就创建另一个C++源文件,为每个类生成包含元对象实现的代码。这些编译生成的源文件通常都已经被包含到类的源文件中或者和类的实现同时被编译和链接。 除了为对象间的通信提供信号和槽(signals and slots)机制之外,元对象的代码还提供下列特性: · QObject::metaObject()返回与该类绑定的meta-object对象。 · QMetaObject::className()可以在运行时以字符串的形式返回类的名字,不需要C++编译器原生的运行时类型信息(RTTI)的支持。 · QObject::inherits()函数返回继承信息:对象是否是QObject继承树上一个类的实例。 · QObject::tr()和QObject::trUtf8()提供国际化支持,将字符串翻译成指定的语言。 · QObject::setProperty()和QObject::property()通过名字动态设置和获取对象属性。 · QMetaObject::newInstance()构造该类的一个新实例。 除此之外你还可以用qobject_cast()动态转换QObject类的类型。qobject_cast()函数和标准C++的dynamic_cast()功能类似,只是其不需要RTTI的支持,而且可以跨越动态连接库的边界。它尝试将它的参数cast成尖括号内的对象类型,如果对象是正确的类型(运行时决定)则返回非零,否则返回0,说明对象类型不兼容。 例如,假设MyWidget继承自QWidget,同时也声明了Q_OBJECT宏, QObject *obj = new MyWidget;QObject类型的变量obj实际上指向一个MyWidget对象,因此我们可以这样进行类型转换: QWidget *widget = qobject_cast(obj);到MyWidget的转型可以成功是因为qobject_cast()并没有对Qt内建对象和定制的扩展对象分别对待。 QLabel *label = qobject_cast(obj); // label is 0另一方面到QLabel的转型则会失败,指针会被设置为0。这样使得我们可以在运行时根据对象类型,对不同类型的对象进行不同的处理: if (QLabel *label = qobject_cast(obj)) { label->setText(tr("Ping")); } else if (QPushButton *button = qobject_cast(obj)) { button->setText(tr("Pong!")); }尽管我们可以在不用Q_OBJECT宏和原对象信息的情况下仍旧使用QObject作为基类,但是像信号和槽以及其他这里描述的特性将无法使用。从元对象系统的观点来看,一个没有元对象代码的QObject子类和其最接近的有元对象代码的祖先是等同的。这也就意味着,QMetaObject::className()将不会返回你的类的真实的名字,而是该类某一个祖先的名字。 因此,我们强烈建议所有QObject的子类都是用Q_OBJECT宏,不管你实际上是否使用信号和槽,以及属性

详细内容

以上来源于: 百度百科
$firstVoiceSent
- 来自原声例句
小调查
请问您想要如何调整此模块?

感谢您的反馈,我们会尽快进行适当修改!
进来说说原因吧 确定
小调查
请问您想要如何调整此模块?

感谢您的反馈,我们会尽快进行适当修改!
进来说说原因吧 确定