我在Qt中做一个简单的项目来旋转一个立方体,我有键盘和按钮上的箭头问题。
我有两个按钮,当我点击第一个按钮时,立方体向右旋转,第二个按钮用于向左旋转。
我在键盘上也有两个箭头键,向上和向下,它们的功能与按钮相同。当我按向上箭头时,立方体向右旋转,以此类推。
问题是当我启动应用程序时,箭头而不是控制旋转,选择按钮。所以我需要知道在哪里我可以改变这个选项,即关闭按钮的方向键的导航动作。
项目是通过继承QMainWindow创建的。
默认情况下,QPushButton
(像QWidget
的许多其他子类一样)将有默认的处理键盘焦点的方式。在按钮的情况下,箭头键将键盘焦点从一个按钮移动到下一个按钮,以便在没有鼠标的情况下方便地在窗口中导航和与小部件交互。
正如hank在评论中建议的那样,您可以通过调用其setFocusPolicy(Qt::NoFocus)
来强制QPushButton
不接受键盘焦点,但这只会在特定情况下工作,其中按钮是QMainWindow
中唯一可以窃取焦点的按钮。如果你在那里有其他小部件(例如QLineEdit
),当焦点结束时,方向键仍然不能正常工作,因为QLineEdit
会抓取那些键,什么也不做。
解决问题的更灵活的方法是在每个QMainWindow
的子部件上安装一个事件过滤器,并让该事件过滤器将箭头键事件转发给旋转立方体的函数(同时让其他所有内容通过,以允许任何其他事件由适当的小部件处理)。
另一个解决方案是让您的多维数据集小部件使用QWidget::grabKeyboard()
抓取所有键盘事件。这将确保每个键盘事件都被发送到那个小部件,无论键盘焦点在哪里。当您想让其他小部件接收键盘事件时,您需要调用QWidget::releaseKeyboard()
来取消抓取。