Что такое QObject cast?

может ли кто-нибудь объяснить в максимально простых терминах (или так просто, как вам хотелось бы), что qobject_cast есть, что он делает и почему нам нужно было бы привести один тип класса к другому?

как, я получаю typecasting в смысле кастинга int как char или QString возможно использовать QMessageBox, но зачем бросать в разные классы?

2 ответов


прежде чем вы начнете изучать то, что qobject_cast есть, вам нужно знать, что c++'s dynamic_cast есть. Динамический бросок все о полиморфизм.

динамический бросок C++использует RTTI (сведения о типе времени выполнения) для приведения объекта. Но!--2--> делает это без 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 может использоваться только с QObject производные классы, имеющие Q_OBJECT макрос.

  • qobject_cast не использует RTTI.


qobject_cast - это то же самое как dynamic_cast, но работает только для детей QObject. Это не требует RTTI и он работает намного быстрее, потому что его невозможно использовать QObject на множественное наследование.

не стесняйтесь делать самостоятельные исследования и читать некоторые основные вещи об ООП и 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!" );
}