未捕获QT事件筛选器中的键盘快捷键(强制文本为大写)

Not capturing keyboard shortcut keys in QT event filter (that forces text to upper case)

本文关键字:文本 快捷键 QT 事件筛选器 键盘      更新时间:2023-10-16

在Qt 5.6中,我设置了一个事件过滤器,强制用户在QLineEdits和QTextEdits中输入的文本为大写
上下文菜单功能(复制、粘贴)有效,但键盘快捷键无效。

似乎我也捕捉到了控制移位的字母(ctrl-C,ctrl-V等)

我没有做什么来排除控制移位的键,以便它们得到正常处理?

下面的代码段。

bool Form::eventFilter(QObject *obj, QEvent *event)
{
    if(event->type() == QEvent::KeyPress)
    {
        QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
        if(keyEvent->key() >= Qt::Key_A && keyEvent->key() <= Qt::Key_Z &&
            ((keyEvent->modifiers() & Qt::ShiftModifier) == false))
        {
             QApplication::sendEvent(obj, new QKeyEvent(QEvent::KeyPress,
                keyEvent->key(), keyEvent->modifiers() | Qt::ShiftModifier,
                keyEvent->text().toUpper()));
            QApplication::sendEvent(obj, new QKeyEvent(QEvent::KeyRelease,
                keyEvent->key(), keyEvent->modifiers() | Qt::ShiftModifier,
                keyEvent->text().toUpper()));
            return true;
        }else return false;
    }
    return false;
}

由于QT事件筛选器,我的代码使UI程序不会捕获键盘快捷键(强制文本大写)。为什么?

请注意,有Qt::ControlModifier标志来强制过滤器:

(keyEvent->modifiers() & (Qt::ShiftModifier | Qt::ControlModifier)) == false 

此外,在您的代码示例中,我怀疑调用父类事件过滤器将通过防止其他不必要的影响来帮助解决问题:

// for all other cases, let it process then
return QWidget::eventFilter(obj, e);

但我会使用指定的keyPressEvent过载功能:

void MyWidget::keyPressEvent(QKeyEvent *e) override
{
    // filtering keypress modifiers as well
    // use your own key codes here
    if ((e->key() == Qt::Key_Z)  && 
       ! e->modifiers() & (Qt::ShiftModifier | Qt::ControlModifier))
    {
        // just an example to handle 'Z' pressed
        // with no control modifiers
        e->accept(); // set as 'handled here'
        return;
    }
    e->ignore(); // set as 'not handled here' 
}

这不是你问题的答案,但可以找到类似的解决方案:我可以简化qt的以下代码吗?我认为后者更好,因为不涉及通过事件循环发送密钥也许使用文本编辑验证器是更好的解决方案,但我有疑问。没有什么是新的:这样的解决方案,但也针对不同的问题