web-dev-qa-db-ja.com

qobject_castとは何ですか?

誰かができるだけ簡単な言葉で(またはあなたが望む限り簡単に)説明することができますqobject_castは、それが何をするのか、なぜあるクラス型を別のクラス型にキャストする必要があるのか​​?

たとえば、intcharまたはQStringとしてキャストするという意味で型キャストを取得しますが、QMessageBoxを使用することもできますが、なぜ異なるクラスにキャストするのでしょうか。

10
Michael Thomas

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がないと、carBmwCarであるかAudiCarであるかを判別できません。

dynamic_castqobject_castの違いは何ですか?

  • qobject_castは、 QObject 派生クラス Q_OBJECT マクロでのみ使用できます。

  • qobject_castはRTTIを使用しません。

18
frogatto

qobject_castdynamic_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!" );
}
16
Dmitry Sazonov