QEvent
有 type()
返回事件类型作为枚举值的成员函数。如果我已经检查了 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/