C++ 我是否正确地从QtWiki重构了这个示例?

C++ 我是否正确地从QtWiki重构了这个示例?,c++,qt,c++17,C++,Qt,C++17,我发现了这个关于如何从以下位置捕捉按下Enter键的示例: bool-KeyEnterReceiver::eventFilter(QObject*obj,QEvent*event) { 如果(事件->类型()==QEvent::按键){ QKeyEvent*key=static_cast(事件); 如果((键->键()==Qt::键_回车)| |(键->键()==Qt::键_回车)){ //按回车键或回车键 }否则{ 返回QObject::eventFilter(对象,事件); } 返回true

我发现了这个关于如何从以下位置捕捉按下Enter键的示例:

bool-KeyEnterReceiver::eventFilter(QObject*obj,QEvent*event)
{
如果(事件->类型()==QEvent::按键){
QKeyEvent*key=static_cast(事件);
如果((键->键()==Qt::键_回车)| |(键->键()==Qt::键_回车)){
//按回车键或回车键
}否则{
返回QObject::eventFilter(对象,事件);
}
返回true;
}否则{
返回QObject::eventFilter(对象,事件);
}
返回false;
}
它看起来很麻烦,我注意到我可以将它重构得更简单:

bool KeyEnterReceiver::eventFilter(QObject* obj, QEvent* event)
{
    if (event->type() == QEvent::KeyPress) {
        auto* key = dynamic_cast<QKeyEvent*>(event);  // clang-tidy suggested to change static_cast to dynamic_cast
        if ((key->key() == Qt::Key_Enter) || (key->key() == Qt::Key_Return)) {
            // Enter or return was pressed
            return true;
        }
    }
    return QObject::eventFilter(obj, event);
}
bool-KeyEnterReceiver::eventFilter(QObject*obj,QEvent*event)
{
如果(事件->类型()==QEvent::按键){
auto*key=dynamic_cast(event);//建议将static_cast更改为dynamic_cast
如果((键->键()==Qt::键_回车)| |(键->键()==Qt::键_回车)){
//按回车键或回车键
返回true;
}
}
返回QObject::eventFilter(对象,事件);
}

我是否遗漏了什么,或者我的重构是否正确且功能相同


这能被重构得更简单吗?

是的,您的代码是等效的。事实上,它比原始示例要好,因为原始示例中包含无法访问的死代码。
返回false无法访问。没有任何分支路径可以通向它。你在你的版本中删除了这个。您还消除了对重写的
eventFilter()
的重复调用

不需要动态强制转换,因为静态强制转换保证有效,因为
event->type()==QEvent::KeyPress


不管怎样,原来的代码实际上相当糟糕。您的版本更好。

是的,您的代码是等效的。事实上,它比原始示例要好,因为原始示例中包含无法访问的死代码。
返回false无法访问。没有任何分支路径可以通向它。你在你的版本中删除了这个。您还消除了对重写的
eventFilter()
的重复调用

不需要动态强制转换,因为静态强制转换保证有效,因为
event->type()==QEvent::KeyPress


不管怎样,原来的代码实际上相当糟糕。您的版本更好。

我不知道Qt,但考虑到代码,我看到了一个变化:您现在正在调用
eventFilter
when
event->type()!=QEvent::按键
。另外,这个问题听起来更像是SE:@R2RT,它也发生在原始代码中。@R2RT但是原始代码在
event->type()时不也调用
eventFilter
QEvent::KeyPress
?我不知道Qt,但给定代码我看到了一个变化:您现在调用
eventFilter
event->type()QEvent::按键
。另外,这个问题听起来更像是SE:@R2RT,它也发生在原始代码中。@R2RT但是原始代码在
event->type()时不也调用
eventFilter
QEvent::按键
bool KeyEnterReceiver::eventFilter(QObject* obj, QEvent* event)
{
    if (event->type() == QEvent::KeyPress) {
        auto* key = dynamic_cast<QKeyEvent*>(event);  // clang-tidy suggested to change static_cast to dynamic_cast
        if ((key->key() == Qt::Key_Enter) || (key->key() == Qt::Key_Return)) {
            // Enter or return was pressed
            return true;
        }
    }
    return QObject::eventFilter(obj, event);
}