• The Meta-Object System


    The Meta-Object System

    Qt元对象系统为对象之间的交互提供了信号与槽机制,运行时信息和动态属性系统。

    元对象系统基于三件事:

    1.      Qobject类作为所有要利用元对象系统的基类。

    2.       在类的private段声明Q_OBJECT 宏,以可以使用元对象特性,例如动态属性,信号与槽。

    3.       元对象编译器为Qobject子类提供了必要的代码以实现元对象特性。

    Moc工具读取C++源文件。如果找到一个或多个类声明包含Q_OBJECT宏。它为每个类生成另外的一个包含元对象代码C++源文件。这些生成的源文件不仅仅包含到类的源文件中,而且类在编译和链接都用到。

    另外为对象之间通信提供信号与槽机制,元对象代码提供了以下特性:

    1.      QObject::metaObject()返回类相关联的元对象。

    2.      QMetaObject::className()返回运行时类名,不需要用C++编译器的RTTI。

    3.       QObject::inherits() 返回一个对象是否是Qobject继承树的一个类的实例。

    4.       QObject::tr() 和 QObject::trUtf8() 转换一个字符串实现国际化。

    5.      QObject::setProperty() 和 QObject::property()通过名称动态设置和获取属性。

    6.       QMetaObject::newInstance() 创建类的一个实例。

    在Qobject上使用动态类型转换qobject_cast()也是可以的。qobject_cast()与C++的dynamic_cast()相似,它的优势就是不需要C++的RTTI支持和可以跨越动态库边界。它尝试把参数转换为尖括号中指定的指针类型,如果对象是个正确的类型则返回非0的指针,否则返回0.

    例如:我们假设MyWidget继承了QWidget,而且类中声明了 Q_OBJECT宏。

    QObject*obj =newMyWidget;

    obj变量,是QObject类型的指针。指向一个MyWidget 对象,所以我们可以进行转换:

    QWidget*widget = qobject_cast<QWidget*>(obj);

    从 QObject 转为 QWidget是成功的,因为对象本质就是一个MyWidget,它是QWidget的一个子类。所以我们知道obj是一个MyWidget,我们也可以把它转换为MyWidget *。

        MyWidget *myWidget = qobject_cast<MyWidget *>(obj);

    可以成功的进行转换,因为qobject_cast()不区分Qt内置类型和自定义类型。

    QLabel*label = qobject_cast<QLabel*>(obj);
        // label is 0

    转换为QLabel是失败的。指针被设置为0.这使得我们根据类型,处理对象运行时的不同类型。

      if (QLabel *label = qobject_cast<QLabel*>(obj)) 
    {
            label->setText(tr("Ping"));
        } elseif (QPushButton *button = qobject_cast<QPushButton*>(obj)) {
            button->setText(tr("Pong!"));
        }

    也可以用QObject作为基类但是不包含Q_OBJECT 宏和元对象代码。如果不用Q_OBJECT 宏,信号与槽和这里描述的其他特性都不可用。从元对象系统的角度来看,不包含元代码的QObject子类等价于它最近的祖先类的元对象代码。比如,QMetaObject::className()将不会返回你实际的类名,而是该类的祖先类的名字。

    所以,我们强烈建议在QObject所有子类中使用Q_OBJECT 宏,不管是否使用信号与槽机制和属性。

    http://blog.csdn.net/hai200501019/article/details/9155987

  • 相关阅读:
    OpenCV 图像二值化 threshold
    C++ pow()函数
    Marr-Hildreth 边缘检测 OpenCV C++实现
    OpenCV 边缘检测 Canny
    OpenCV Canny()函数
    OpenCV Sobel()函数
    OpenCV 边缘检测 Sobel
    OpenCV 边缘检测 Laplacian
    OpenCV 边缘检测 Scharr
    OpenCV 形态学变换 morphologyEx函数
  • 原文地址:https://www.cnblogs.com/findumars/p/5176165.html
Copyright © 2020-2023  润新知