1、四个概念
向上转型:子类转换为父类,使用 dynamic_cast<type_id>(expression) ,这种转换相对来说比较安全不会有数据的丢失;
向下转型:父类转换为子类,可以使用强制转换,这种转换时不安全的,会导致数据的丢失,原因是父类的指针或者引用的内存中可能不包含子类的成员的内存。
动态转换:dynamic_cast<type_id>(expression),表示的是将 expression 转换为 type_id 类型数据,一般是子类的指针或者引用转换为父类的指针或者引用;
静态转换:static_cast<type_id>(expression),表示的是将 expression 转换为 type_id 类型数据,常用用于数值数据类型的转换
2、函数原型及限制
函数原型:
T qobject_cast ( QObject * object )
函数返回 object 向下的转型 T ,如果转型不成功则返回 0 ,如果传入的 object 本身就是 0 则返回 0 。
在使用时有两个限制:
T类型必须继承自 QObject 。
在声明时必须有 Q_OBJECT 宏。
3、使用场景
使用场景:
当某一个Object emit 一个 signal 的时候,它就是一个 sender , 系统会记录下当前是谁 emit 出这个 signal 的,所以在对应的 slot 里就可以通过 sender() 得到当前是谁 invoke 了该 slot 。
有可能多个 Object 的 signal 会连接到同一个 signal (例如多个Button可能会connect到一个slot函数onClick()),
因此这是就 需要判断到底是哪个 Object emit 了这个 signal ,根据 sender 的不同来进行不同的处理.
在槽函数中:
QObject* obj = sender(); // 返回发出信号的对象,用QObject类型接收 QPushButton*button_tmp = qobject_cast<QPushButton *>(obj); // 向下转型为按钮类型