什么是 qobject_cast?

What is qobject_cast?

有人可以用尽可能简单的术语(或尽可能简单)解释 qobject_cast 是什么,它有什么作用以及为什么我们需要将一种 class 类型转换为另一种类型?

就像,我在将 int 转换为 charQString 的意义上进行类型转换,也许是为了使用 QMessageBox,但为什么要转换成不同的 classes?

qobject_cast is same thing as dynamic_cast, but works only for children of QObject. It doesn't require RTTI and it works much faster, because it is not possible to use QObject in multiple inheritance.

不要犹豫,进行自我研究并阅读一些有关 OOP 和 C++ 的基础知识。特别是关于多态性。并且不要犹豫阅读 Qt 文档,它包含许多易于理解的示例。

qobject_cast 的最近用法是获取指向槽内 class 的指针:

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

在你开始学习之前qobject_cast is, you would need to know what C++'s dynamic_cast is. Dynamic cast is all about 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 class 继承了 Car class。使用此功能,我们可以仅使用一个功能来制造不同的汽车。例如:

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 derived classes having Q_OBJECT 宏一起使用。

  • qobject_cast 不使用 RTTI。