c++ - Qt RTTI 麻烦

标签 c++ qt events visual-c++ rtti

为了不通过子类化来处理事件(例如鼠标移动和单击),必须使用 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");
*/
    }

最佳答案

使用qobject_cast和/或 obj->metaObject()->className() 代替。

关于c++ - Qt RTTI 麻烦,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1409539/

相关文章:

c++ - 面对非阻塞I/O,如何设计状态机?

c++ - 地址已在使用中。

c++ - 推荐的旋转组合方式

php - 使用 C++ 和 Qt 下载二进制文件

javascript - javascript 中有没有一种方法可以检测卸载事件是通过刷新、后退按钮还是关闭浏览器引起的?

c# - 防止 WPF 控件在 MouseMove 事件上重叠

c++ - 变量自身初始化

.net - 命名管道 : C++ vs . NET 4.0

c++ - Qt : AddressBook tutorial 中的内存管理

c++ - QStandardItemModel:添加行的任何有效方法?