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_cast和/或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 回答