建湖做网站哪家好,电商网站建设与运营方向,免费源码资源站,一级直播Qt的元对象系统基于如下三件事情#xff1a; 1.类#xff1a;QObject#xff0c;为所有需要利用原对象系统的对象提供了一个基类。 2.宏#xff1a;Q_OBJECT#xff0c;通常可以声明在类的私有段中#xff0c;让该类可以使用元对象的特性#xff0c;比如动态属性#x…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说明对象类型不兼容。 当某一个Object emit一个signal的时候它就是一个sender,系统会记录下当前是谁emit出这个signal的所以你在对应的slot里就可以通过sender()得到当前是谁invoke了你的slot对应的是QObject-d-sender。 有可能多个Object的signal会连接到同一个signal(例如多个Button可能会connect到一个slot函数onClick()),因此这是就需要判断到底是哪个Object emit了这个signal根据sender的不同来进行不同的处理。这时就要用到qobject_cast()。 例如假设MyWidget继承自QWidget同时也声明了Q_OBJECT宏 QObject *obj new MyWidget; QObject类型的变量obj实际上指向一个MyWidget对象因此我们可以这样进行类型转换 QWidget *widget qobject_castQWidget *(obj); 到MyWidget的转型可以成功是因为qobject_cast()并没有对Qt内建对象和定制的扩展对象分别对待。 QLabel *label qobject_castQLabel *(obj); // label is 0 另一方面到QLabel的转型则会失败指针会被设置为0。这样使得我们可以在运行时根据对象类型对不同类型的对象进行不同的处理 if (QLabel *label qobject_castQLabel *(obj)) { label-setText(tr(Ping)); } else if (QPushButton *button qobject_castQPushButton *(obj)) { button-setText(tr(Pong!)); } 尽管我们可以在不用Q_OBJECT宏和原对象信息的情况下仍旧使用QObject作为基类但是像信号和槽以及其他这里描述的特性将无法使用。从元对象系统的观点来看一个没有元对象代码的QObject子类和其最接近的有元对象代码的祖先是等同的。这也就意味着QMetaObject::className()将不会返回你的类的真实的名字而是该类某一个祖先的名字。 因此我们强烈建议所QObject的子类都是用Q_OBJECT宏不管你实际上是否使用信号和槽以及属性。 例子 connect(pushButton_2,SIGNAL(clicked()),this,SLOT(on_pushButton_clicked())); connect(pushButton,SIGNAL(clicked()),this,SLOT(on_pushButton_clicked())); void MainWindow::on_pushButton_clicked() { QPushButton*ptqobject_cast QPushButton*(sender()); if(!pt) return; QString str; if (pt pushButton) str1; else if (pt pushButton_2) str2; } 转载于:https://www.cnblogs.com/qq78292959/archive/2012/08/20/2648099.html