首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Qt RTTI故障

Qt RTTI故障
EN

Stack Overflow用户
提问于 2009-09-11 07:48:11
回答 4查看 2.7K关注 0票数 2

为了不通过子类化来处理事件(如鼠标移动和单击),必须使用installEventFilter并提供事件处理程序。在这样做的时候,我遇到了一个RTTI支持的问题,这意味着无论在哪个对象事件上触发,typeid().name()都会一直提供QObject *。当然,还有另一种解决方案-dynamic_cast后跟空指针检查,但我个人认为它并不干净(并希望避免多次这样的检查)。更具体地说,这是一个我没有在启用RTTI (/GR)的情况下使用Visual C++的示例:

代码语言:javascript
运行
复制
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");
*/
    }
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-09-11 08:03:10

请改用qobject_cast和/或obj->metaObject()->className()

票数 4
EN

Stack Overflow用户

发布于 2009-09-11 15:06:43

我会用

代码语言:javascript
运行
复制
if (obj->metaObject() == &ColorPicker::staticMetaObject) {
 ...
}

如果只接受ColorPicker实例(而不是ColorPicker的子类)。

如果您也接受子类,请使用

代码语言:javascript
运行
复制
if (qobject_cast<ColorPicker *>(obj)) {
  ...
}
票数 1
EN

Stack Overflow用户

发布于 2009-09-12 06:20:35

必须取消对指针的引用,才能使用它所指向的对象。在不取消引用指针的情况下,结果将是指针的type_info,而不是它指向的内容。

代码语言:javascript
运行
复制
Logger::log(QString("mouse pressed on %1").arg(typeid(*obj).name())); 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1409539

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档