Что такое 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
- это то же самое как 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!" );
}