什么是qobject_cast?

Mic*_*mas 10 c++ qt dynamic-cast qobject

有人可以用尽可能简单的术语(或者你想要的那么简单)qobject_cast解释它是什么,它做了什么以及为什么我们需要将一个类类型转换为另一个类?

就像,我在转换intcharQString可能使用的意义上进行类型转换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)

需要注意的是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!";
}
Run Code Online (Sandbox Code Playgroud)

没有dynamic_cast你将无法确定是否car是一个BmwCar或一个AudiCar.

dynamic_cast和之间有什么不同qobject_cast

  • qobject_cast只能与QObject具有Q_OBJECT宏的派生类一起使用.

  • qobject_cast 不使用RTTI.


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)

  • @MichaelThomas TL; DR:你知道什么时候需要它.在许多情况下,正确解耦的代码将不再需要它.我认为这是代码气味,并试图避免无偿使用它.你没有需要它通常是一个好兆头!保持这种方式. (3认同)