4

QWidget を比較するにはどうすればよいですか? リストがあり、ウィジェットのサイズを変更したいとしましょうQPushButton

たとえば、これを行う関数またはメソッドはありますか?

QList<QLayoutItem *> itemList;

if(itemList->Items->type() == QPushButton)
{
  item.setGeometry(newRect);
}
4

3 に答える 3

6

実際には、これを行うにはいくつかの方法があります。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() 関数を使用する場合、コンパイラはそれをチェックできないため、コードは問題なくコンパイルを続行しますが、実行時には機能しません。

于 2013-07-22T09:53:41.277 に答える
0

標準的な C++ の方法は、 を使用することdynamic_cast<QPushButton*>(widget)です。

Qt は、そのメタオブジェクト システムを通じて代替手段を提供します。1 つはqobject_castで、 と同様に機能しdynamic_castますが、より好ましい場合があります。

または、メタオブジェクトを介して QObject のクラス名を取得できます。例えば:

if( strcmp(widget->metaObject()->className(), "QPushButton") == 0 )

Qt メタオブジェクトの詳細については、こちらを参照してください。

于 2013-07-22T09:49:59.893 に答える