簡體   English   中英

什么是qobject_cast?

[英]What is qobject_cast?

有人可以用盡可能簡單的術語解釋(或者你想要的那么簡單) qobject_cast是什么,它做了什么以及為什么我們需要將一個類類型轉換為另一個?

就像,我在轉換int作為charQString可以使用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;
}

請注意, BmwCarAudiCar類繼承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您將無法確定carBmwCar還是AudiCar

dynamic_castqobject_cast什么不同?

  • qobject_cast只能與具有Q_OBJECT宏的QObject派生類一起使用。

  • qobject_cast不使用RTTI。

qobject_castdynamic_cast相同,但僅適用於QObjectQObject 它不需要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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM