QWidget を比較するにはどうすればよいですか? リストがあり、ウィジェットのサイズを変更したいとしましょうQPushButton
。
たとえば、これを行う関数またはメソッドはありますか?
QList<QLayoutItem *> itemList;
if(itemList->Items->type() == QPushButton)
{
item.setGeometry(newRect);
}
実際には、これを行うにはいくつかの方法があります。QObject::inherits()は1つです:
for (int i = 0; i < itemList.size(); ++i) {
if (itemList[i]->inherits("QPushButton")) {
itemList[i]->setGeometry(newRect);
}
}
別の方法は、私が推奨するqobject_castを使用することです。オブジェクトがキャスト先のクラスから (直接または非) 継承しない場合は、null ポインターを返します。
for (int i = 0; i < itemList.size(); ++i) {
if (qobject_cast<QPushButton*>(itemList[i])) {
itemList[i]->setGeometry(newRect);
}
}
qobject_cast は、コンパイラで RTTI サポートを有効にする必要がないことに注意してください。
もちろん、RTTI サポートを有効にする必要がある標準の C++ dynamic_cast もあります。
for (int i = 0; i < itemList.size(); ++i) {
if (dynamic_cast<QPushButton*>(itemList[i])) {
itemList[i]->setGeometry(newRect);
}
}
一見問題ないように見えますが、この場合は最終的に使用すべきではない別のメソッドは、QMetaObject::className() です。QPushButton サブクラスで偽陰性が発生するため、これを使用しないでください。
qobject_cast をお勧めする理由は、コンパイラが型名をチェックできるようにするためです。これは、クラスの名前を変更するときに重要です。文字列ベースの QObject::inherits() 関数を使用する場合、コンパイラはそれをチェックできないため、コードは問題なくコンパイルを続行しますが、実行時には機能しません。
標準的な C++ の方法は、 を使用することdynamic_cast<QPushButton*>(widget)
です。
Qt は、そのメタオブジェクト システムを通じて代替手段を提供します。1 つはqobject_cast
で、 と同様に機能しdynamic_cast
ますが、より好ましい場合があります。
または、メタオブジェクトを介して QObject のクラス名を取得できます。例えば:
if( strcmp(widget->metaObject()->className(), "QPushButton") == 0 )
Qt メタオブジェクトの詳細については、こちらを参照してください。