如何禁止在Qt中使用带有按钮的键盘上的箭头键

Posted

技术标签:

【中文标题】如何禁止在Qt中使用带有按钮的键盘上的箭头键【英文标题】:How to forbid the use of arrow keys on the keyboard with pushbuttons in Qt 【发布时间】:2013-01-09 13:27:36 【问题描述】:

我在 Qt 中做一个简单的项目来旋转一个立方体,我遇到了键盘和按钮上的箭头问题。

我有两个按钮,当我点击第一个按钮时,立方体向右旋转,第二个按钮用于向左旋转。

我在键盘上也有两个方向键,向上和向下,它们的功能和按钮一样。当我按下向上箭头时,立方体向右旋转等等。

问题是当我启动应用程序时,箭头而不是控制旋转,选择按钮。所以我需要知道在哪里可以更改此选项,即关闭按钮中箭头键的导航操作。

Projet是继承QMainWindow制作的。

【问题讨论】:

试试这个:pushButton->setFocusPolicy(Qt::NoFocus) 【参考方案1】:

默认情况下,QPushButton(与QWidget 的许多其他子类一样)将具有处理键盘焦点的默认方式。在按钮的情况下,箭头键将键盘焦点从一个按钮移动到下一个按钮,以方便在窗口中导航并在没有鼠标的情况下与小部件进行交互。

正如 hank 在评论中建议的那样,您可以通过调用 setFocusPolicy(Qt::NoFocus) 来强制 QPushButton 不接受键盘焦点,但这仅适用于按钮是您的 @987654325 中唯一按钮的特定情况@ 可能会窃取焦点。如果您有其他小部件(例如QLineEdit),当焦点结束时,箭头键仍然无法正常工作,因为QLineEdit 将抓住这些键,并且什么也不做。

解决问题的更灵活的方法是在 QMainWindow 的每个子小部件上安装一个事件过滤器,并让该事件过滤器将箭头键事件转发到旋转立方体的函数(同时让其他一切都通过以允许适当的小部件处理任何其他事件)。

另一个解决方案是让您的立方体小部件使用QWidget::grabKeyboard() 抓取所有键盘事件。这将确保每个键盘事件都被发送到该小部件,无论键盘焦点在哪里。当您想让其他小部件接收键盘事件时,您需要调用QWidget::releaseKeyboard() 来取消它。

【讨论】:

以上是关于如何禁止在Qt中使用带有按钮的键盘上的箭头键的主要内容,如果未能解决你的问题,请参考以下文章

如何在 FLTK 中对两个不同的小部件同时使用键盘箭头和鼠标单击?

如何使用箭头在 QtVirtualKeyboard 中导航

林间空地键盘(转义,箭头)加速器

如何在 Linux 中获取箭头键并在键盘上输入键以表现得像 Windows 7

在 C 中模拟键盘事件箭头键

检测浏览器是不是在网页中有键盘/箭头键