[英]What is qobject_cast?
有人可以用盡可能簡單的術語解釋(或者你想要的那么簡單) qobject_cast
是什么,它做了什么以及為什么我們需要將一個類類型轉換為另一個?
就像,我在轉換int
作為char
或QString
可以使用QMessageBox
類型轉換,但為什么要轉換為不同的類?
在開始學習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;
}
請注意, 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
什么不同? qobject_cast
與dynamic_cast
相同,但僅適用於QObject
子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!" );
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.