什么是qobject_cast?

时间:2017-05-16 07:05:22

标签: c++ qt dynamic-cast qobject

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

就像,我将int作为charQString投射到使用QMessageBox的意义上进行类型转换,但为什么要投入不同的类?

2 个答案:

答案 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;
}

请注意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只能与QObject派生类Q_OBJECT一起使用。

  • qobject_cast没有使用RTTI。

答案 1 :(得分:15)

qobject_castdynamic_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!" );
}