Mic*_*mas 10 c++ qt dynamic-cast qobject
有人可以用尽可能简单的术语(或者你想要的那么简单)qobject_cast
解释它是什么,它做了什么以及为什么我们需要将一个类类型转换为另一个类?
就像,我在转换int
为char
或QString
可能使用的意义上进行类型转换QMessageBox
,但为什么要投入不同的类?
fro*_*tto 19
在开始学习之前qobject_cast
,你需要知道C++ dynamic_cast
是什么.动态演员是关于多态的.
C++的动态转换使用RTTI(运行时类型信息)来转换对象.但这qobject_cast
没有RTTI.
例如,假设我们有汽车工厂的功能.像这样:
Car* make_car(string brand){
if(brand == "BMW"){
return new BmwCar;
}
if(brand == "Audi"){
return new AudiCar;
}
return nullptr;
}
Run Code Online (Sandbox Code Playgroud)
需要注意的是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!";
}
Run Code Online (Sandbox Code Playgroud)
没有dynamic_cast
你将无法确定是否car
是一个BmwCar
或一个AudiCar
.
dynamic_cast
和之间有什么不同qobject_cast
?Dmi*_*nov 17
qobject_cast
是一样的dynamic_cast
,但只适用于儿童QObject
.它不需要RTTI,并且它的工作速度要快得多,因为它不可能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!" );
}
Run Code Online (Sandbox Code Playgroud)