如何在 key_up、key_down 的 KeyPressEvent 中为按钮设置焦点。 QT
How to set focus for button in KeyPressEvent for key_up, key_down. QT
我有一个带有名为 "Up"
、"Down"
等按钮的表单
我需要处理键盘按钮(arrow_up
、arrow_down
等)。同时我想为相关按钮设置焦点。
例如: 如果我按下键盘上的 arrow_down
按钮,那么 "Down"
按钮将成为我的表单的焦点。
我的变体如何做到这一点:
bool ClientWindow::eventFilter(QObject *obj, QEvent *e)
{
if (event->type() == QEvent::KeyPress) {
QKeyEvent *event= dynamic_cast<QKeyEvent*>(e);
switch(event->key()) {
case Qt::Key_Up: ui->up->setFocus(); ;break;
case Qt::Key_Down: ui->down->setFocus(); break;
case Qt::Key_Left: ui->left->setFocus(); break;
case Qt::Key_Right: ui->right->setFocus(); break;
}
}
return QObject::eventFilter(obj, event);
}
但是,没有设置焦点,并且
1) 如果我从 eventFilter
return true 则不会设置焦点。
2) 如果我 return QObject::eventFilter(obj, event) 那么焦点将转移到下一个对象。
如何为相关按钮设置焦点?
由于您正在尝试更改 Qt 的标准功能(箭头键移动焦点就像 TAB 键一样),您可能想尝试一个极端的解决方案。
重点是:您的箭头键按下事件是否被过滤了?我的猜测是没有。 above(或 before)小部件正在使用它们并保持标准行为不变(焦点根据标签索引从一个按钮移动到另一个按钮像往常一样)。
我会尝试将您的过滤器安装到 QApplication
对象上,在小部件构造函数中是这样的:
qApp->installEventFilter(this);
过滤器应如下所示:
bool Widget::eventFilter(QObject *obj, QEvent *e)
{
if (e->type() == QEvent::KeyPress)
{
if(qApp->activeWindow() == this)
{
QKeyEvent *event= dynamic_cast<QKeyEvent*>(e);
switch(event->key()) {
case Qt::Key_Up: ui->up->setFocus(); break;
case Qt::Key_Down: ui->down->setFocus(); break;
case Qt::Key_Left: ui->left->setFocus(); break;
case Qt::Key_Right: ui->right->setFocus(); break;
default:
return qApp->eventFilter(obj, e);
}
return true;
}
}
return qApp->eventFilter(obj, e);
}
请注意这一行:
if(qApp->activeWindow() == this)
这应该阻止应用过滤器中的规则每当按下箭头键时(即当小部件不是最上面的小部件时)。如果您的应用程序没有除此之外的其他小部件,您可以忽略它。
最后的建议:尽量不要改变标准的 UI 行为。用户确实希望事情像往常一样工作,而对开发人员来说看起来绝对 酷 的解决方案有时(经常)根本没有带来任何改进,只会让用户感到困惑。
我有一个带有名为 "Up"
、"Down"
等按钮的表单
我需要处理键盘按钮(arrow_up
、arrow_down
等)。同时我想为相关按钮设置焦点。
例如: 如果我按下键盘上的 arrow_down
按钮,那么 "Down"
按钮将成为我的表单的焦点。
我的变体如何做到这一点:
bool ClientWindow::eventFilter(QObject *obj, QEvent *e)
{
if (event->type() == QEvent::KeyPress) {
QKeyEvent *event= dynamic_cast<QKeyEvent*>(e);
switch(event->key()) {
case Qt::Key_Up: ui->up->setFocus(); ;break;
case Qt::Key_Down: ui->down->setFocus(); break;
case Qt::Key_Left: ui->left->setFocus(); break;
case Qt::Key_Right: ui->right->setFocus(); break;
}
}
return QObject::eventFilter(obj, event);
}
但是,没有设置焦点,并且
1) 如果我从 eventFilter
return true 则不会设置焦点。
2) 如果我 return QObject::eventFilter(obj, event) 那么焦点将转移到下一个对象。
如何为相关按钮设置焦点?
由于您正在尝试更改 Qt 的标准功能(箭头键移动焦点就像 TAB 键一样),您可能想尝试一个极端的解决方案。
重点是:您的箭头键按下事件是否被过滤了?我的猜测是没有。 above(或 before)小部件正在使用它们并保持标准行为不变(焦点根据标签索引从一个按钮移动到另一个按钮像往常一样)。
我会尝试将您的过滤器安装到 QApplication
对象上,在小部件构造函数中是这样的:
qApp->installEventFilter(this);
过滤器应如下所示:
bool Widget::eventFilter(QObject *obj, QEvent *e)
{
if (e->type() == QEvent::KeyPress)
{
if(qApp->activeWindow() == this)
{
QKeyEvent *event= dynamic_cast<QKeyEvent*>(e);
switch(event->key()) {
case Qt::Key_Up: ui->up->setFocus(); break;
case Qt::Key_Down: ui->down->setFocus(); break;
case Qt::Key_Left: ui->left->setFocus(); break;
case Qt::Key_Right: ui->right->setFocus(); break;
default:
return qApp->eventFilter(obj, e);
}
return true;
}
}
return qApp->eventFilter(obj, e);
}
请注意这一行:
if(qApp->activeWindow() == this)
这应该阻止应用过滤器中的规则每当按下箭头键时(即当小部件不是最上面的小部件时)。如果您的应用程序没有除此之外的其他小部件,您可以忽略它。
最后的建议:尽量不要改变标准的 UI 行为。用户确实希望事情像往常一样工作,而对开发人员来说看起来绝对 酷 的解决方案有时(经常)根本没有带来任何改进,只会让用户感到困惑。