gpt4 book ai didi

c++ - 不捕获 QT 事件过滤器中的键盘快捷键(强制文本为大写)

转载 作者:太空狗 更新时间:2023-10-29 22:59:23 24 4
gpt4 key购买 nike

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

似乎我还捕获了控制移位字母(ctrl-C、ctrl-V 等)。

我没有做什么来排除 control-shifted 键以便它们得到正常处理?

下面的代码片段。

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;
}

最佳答案

My code makes the UI program not not capturing keyboard shortcut keys because of QT event filter (that forces text to upper case). Why?

注意有 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'
}

不是您问题的答案,但可以完成类似的解决方案:Can I simplify the following code for qt?我认为后者更好,因为不通过涉及的事件循环发送 key 。 也许使用文本编辑验证器是更好的解决方案,但我对此表示怀疑。没有什么是新的:这样solution但也针对不同的问题提出。

关于c++ - 不捕获 QT 事件过滤器中的键盘快捷键(强制文本为大写),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36971819/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com