誰かができるだけ簡単な言葉で(またはあなたが望む限り簡単に)説明することができますqobject_cast
は、それが何をするのか、なぜあるクラス型を別のクラス型にキャストする必要があるのか?
たとえば、int
をchar
またはQString
としてキャストするという意味で型キャストを取得しますが、QMessageBox
を使用することもできますが、なぜ異なるクラスにキャストするのでしょうか。
qobject_cast
とは何かを学習する前に、C++の dynamic_cast
が何であるかを知る必要があります。ダイナミックキャストは、すべて ポリモーフィズム です。
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
クラスはCar
クラスを継承することに注意してください。この機能を使用すると、1つの機能のみを使用して異なる車を作成できます。例えば:
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
in 多重継承 。
自己研究をすることを=しないで、OOPとC++についての基本的なことを読んでください。特に多態性について。そしてQtのドキュメントを読むことをheしないでください。例を理解する。
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!" );
}