有人可以用尽可能简单的术语(或者你想要的那么简单)解释qobject_cast
是什么,它做了什么以及为什么我们需要将一个类类型转换为另一个类?
就像,我将int
作为char
或QString
投射到使用QMessageBox
的意义上进行类型转换,但为什么要投入不同的类?
答案 0 :(得分:16)
在开始学习qobject_cast
之前,您需要知道C ++的dynamic_cast
是什么。动态广告素材大约是polymorphism。
C ++的动态强制转换使用RTTI(运行时类型信息)来强制转换对象。但qobject_cast
在没有RTTI的情况下执行此操作。
例如,假设我们有汽车工厂的功能。像这样:
Car* make_car(string brand){
if(brand == "BMW"){
return new BmwCar;
}
if(brand == "Audi"){
return new AudiCar;
}
return nullptr;
}
请注意BmwCar
和AudiCar
类继承Car
类。使用此功能,我们可以使用一个功能制作不同的汽车。例如:
string brand;
cin >> brand;
Car *car = make_car(brand);
BmwCar *bmw = dynamic_cast<BmwCar*>(car);
if (bmw != nullptr) {
cout << "You've got a BMW!";
}
AudiCar *audi = dynamic_cast<AudiCar*>(car);
if (audi != nullptr) {
cout << "You've got a Audi!";
}
如果没有dynamic_cast
,您就无法确定car
是BmwCar
还是AudiCar
。
dynamic_cast
和qobject_cast
之间的区别是什么?答案 1 :(得分:15)
qobject_cast
与dynamic_cast
相同,但仅适用于QObject
的孩子。它不需要RTTI,而且效果要快得多,因为multiple inheritance无法使用QObject
。
不要犹豫做自我研究并阅读有关OOP和C ++的一些基本知识。特别是关于多态性。并且没有兴趣阅读Qt文档,它包含许多易于理解的示例。
重新使用qobject_cast
正在获取指向插槽内类的指针:
QObject::connect( btn, &QPushButton::clicked, this, &MyClass::onClicked );
void MyClass::onClicked()
{
// How to get pointer to a button:
QObject *p = sender();
// It's QObject. Now we need to cast it to button:
QPushButton *btn = qobject_cast<QPushButon *>( p );
Q_ASSERT( btn != nullptr ); // Check that a cast was successfull
// Now we can use a QObject as a button:
btn->setText( "We just clicked on a button!" );
}