C++ 我是否正确地从QtWiki重构了这个示例?
我发现了这个关于如何从以下位置捕捉按下Enter键的示例: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
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
whenevent->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);
}