什么是 qobject_cast?
What is qobject_cast?
有人可以用尽可能简单的术语(或尽可能简单)解释 qobject_cast
是什么,它有什么作用以及为什么我们需要将一种 class 类型转换为另一种类型?
就像,我在将 int
转换为 char
或 QString
的意义上进行类型转换,也许是为了使用 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;
}
请注意 BmwCar
和 AudiCar
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
,您将无法确定 car
是 BmwCar
还是 AudiCar
。
dynamic_cast
和 qobject_cast
有什么区别?
有人可以用尽可能简单的术语(或尽可能简单)解释 qobject_cast
是什么,它有什么作用以及为什么我们需要将一种 class 类型转换为另一种类型?
就像,我在将 int
转换为 char
或 QString
的意义上进行类型转换,也许是为了使用 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;
}
请注意 BmwCar
和 AudiCar
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
,您将无法确定 car
是 BmwCar
还是 AudiCar
。