2

サブクラス化によってではなく、イベント (マウスの移動やクリックなど) をinstallEventFilter処理するためには、イベント ハンドラーを使用して提供する必要があります。そうしているうちに、RTTI サポートで問題が発生しました。つまり、typeid().name()どのQObject *オブジェクト イベントがトリガーされたかに関係なく、常に問題が発生します。もちろん、別の解決策があります---dynamic_castヌルポインターチェックが続きますが、個人的にはそれがきれいだとは思いません(そのようなチェックを複数回避けたいと思います)。具体的には、RTTI が有効な (/GR) Visual C++ で動作するように作成しなかった例を次に示します。

bool
MousePressInterface::eventFilter
    (QObject *obj,
    QEvent *event)
{
    if (event->type() == QEvent::MouseButtonPress)
    {
        ColorPicker *sender;
        sender = dynamic_cast<ColorPicker *> (obj);

        if ( sender )
        {
            QColor newColor = 
                QColorDialog::getColor(sender->color());
            if ( newColor.isValid() )
                        sender->setColor( newColor );
            Logger::log("color picker clicked");
            return true;
        }
/* TODO: cleaner way, doesn't work for some reason!
        Logger::log(QString("mouse pressed on %1").arg(typeid(obj).name()));
        Logger::log(QString(" checking for %1").arg(typeid(ColorPicker *).name()));

        if ( typeid(obj) == typeid(ColorPicker * ) )
            Logger::log("color picker clicked");
*/
    }
4

4 に答える 4

4

代わりにqobject_castand/orを使用してください。obj->metaObject()->className()

于 2009-09-11T08:03:10.193 に答える
1

私は使うだろう

if (obj->metaObject() == &ColorPicker::staticMetaObject) {
 ...
}

ColorPicker インスタンス (および ColorPicker のサブクラスではない) のみが受け入れられる場合。

サブクラスも受け入れる場合は、

if (qobject_cast<ColorPicker *>(obj)) {
  ...
}
于 2009-09-11T15:06:43.163 に答える
1

ポインターが指すオブジェクトが使用されるように、ポインターを逆参照する必要があります。ポインターを逆参照しないと、結果はポインターが指すものではなく、ポインターの type_info になります。

Logger::log(QString("mouse pressed on %1").arg(typeid(*obj).name())); 
于 2009-09-12T06:20:35.380 に答える
0

typeid通常、ポインターの逆参照で使用する必要がtypeidあります。ポインターの はコンパイル時に計算され、通常は興味深いものではありません。

if ( typeid(*obj) == typeid(ColorPicker) )
  Logger::log("color picker clicked");

とは言っても、ここでやっていることとdynamic_castルートとの間に大きな違いはありません - いずれにせよdynamic_cast、ある時点でやらなければならないでしょう.

于 2009-09-11T08:00:47.890 に答える