c++ - 如果我已经检查了 event->type(),我应该检查 QEventdynamic_cast 结果吗?

标签 c++ qt qevent

QEventtype()返回事件类型作为枚举值的成员函数。如果我已经检查了 event->type(),我是否应该检查 QEvent*dynamic_cast 结果。例如

bool ClassName::eventFilter(QObject* obj, QEvent* event)
{
    if (event->type() == QEvent::KeyPress) 
    {
        auto ke = dynamic_cast<QKeyEvent*>(event);
        if (ke)                                     // <----------- needed?
        {
            // ...
        }
    }
    // ...
}

这里需要if (ke)条件吗?

最佳答案

正如评论者建议的那样,查看 Qt docs regarding this有以下示例:

bool FilterObject::eventFilter(QObject *object, QEvent *event)
{
    if (object == target && event->type() == QEvent::KeyPress) {
        QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
        if (keyEvent->key() == Qt::Key_Tab) {
            // Special tab handling
            return true;
        } else
            return false;
    }
    return false;
}

由于特定事件始终保证返回相同类型,因此检查 QEvent::type() 足以允许安全地 static_cast 转换为目标类型。这将避免 dynamic_cast 带来的 RTTI 成本。

关于c++ - 如果我已经检查了 event->type(),我应该检查 QEventdynamic_cast 结果吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53413913/

相关文章:

C++ 中的 Java 反序列化

c++ - 使用共享库引用全局指针的 Qt/C++ 单例静态方法

c++ - QTabWidget 选项卡在其中一个选项卡中不显示任何内容

python - PyQt - 更新模型时自动刷新自定义 View ?

c++ - eventFilter(QObject *obj, QEvent *e) 没有检测到正确的对象

c++ - 如何显示循环控制变量在 C++ for 循环体内没有改变?

c++ - 处理从十六进制到十六进制的转换

c++ - 使用 boost::tokenizer 标记包装的字符串

QListWidget 上带有 MouseButtonRelease 的 QT eventFilter 未检测到鼠标按下/释放

c++ - 获取QPainter的可见区域