Qt如何捕捉键盘事件?

您好,Qt键盘事件属于Qt事件系统,所以事件系统中的所有规则对于击键事件都是有效的。以下重点是特定于键的部分:

集中

只有具有焦点的QWidget可以接受键盘事件。具有输入焦点的窗口是活动窗口或活动窗口子窗口或子窗口等。

有几种方法可以移动焦点:

按Tab或Shift+Tab。

注意:文本编译器(通常需要Tab),或者WebView(需要Tab来移动超链接的焦点)等。

在Qt中,可以用CTRL+Tab或者Ctrl+Shift+Tab来代替需要输入Tab的地方。

单击QWidget。

建议:仅对接受文本输入小部件启用此功能。

按键盘快捷键。

QLabel::setBuddy()、QGroupBox和QTabBar支持。

使用鼠标滚轮

用户移动焦点

该程序将决定设置了焦点的小部件的哪个子小部件获得焦点。

注意:如果一个小部件有一个grabKeyboard,所有的键盘事件将被发送到小部件,而不是有焦点的小部件。

焦点政策

QWidget获得焦点的方式由focusPolicy控制。

Qt::TabFocus

通过Tab键获得焦点。

Qt::点击焦点

通过被点击获得焦点。

Qt::strong焦点

以上两种方式都可以获得焦点。

Qt::NoFocus

以上两种方式都不能获得焦点(默认值),但是setFocus还是可以获得焦点的。

按键和按键释放

首先,如果我们希望小部件获得焦点,我们通常设置focusPolicy。

然后为了响应这个键,我们只需要直接重载:

按键事件

keyReleaseEvent

注意:

对于我们不处理的事件,应该调用父类对应的事件处理程序。

如果小部件当前没有焦点,考虑事件转发:如果其子小部件有焦点,小部件没有处理的键盘事件将被转发。

有时输入焦点不在任何窗口中。所有程序都最小化时会出现这种情况。此时,Windows将继续向活动窗口发送键盘消息,但这些消息的形式与发送到非最小化活动窗口的不同。

QKeyEvent

在windows下,有八个与键盘事件相关的消息:

对于生成可显示字符的组合键,Windows不仅向程序发送按键消息,还发送字符消息。

有些键不生成字符,包括shift键、功能键、光标移动键和Insert、Delete等特殊字符键。对于这些键,Windows只生成击键消息。

这些消息只反映在Qt的QKeyEvent中。

对于字符,可以通过QKeyEvent::text()获取。

其他键,QKeyEvent::key()获取一个键值。

事件功能

因为Tab键是用来切换焦点的,所以不一样。

这是来自qwidget.cpp的事件函数的代码片段:

case QEvent::按键:

{

QKeyEvent *k = (QKeyEvent *)事件;

bool res = false

如果(!(k->;修饰符()& amp(Qt::control modifier | Qt::alt modifier)))

{ //###添加MetaModifier?

if(k-& gt;Key()= = Qt::Key _ Backtab | |(k-& gt;Key()= = Qt::Key _ Tab & amp;& amp(k->;修饰符()& ampQt::ShiftModifier)))

RES = focusNextPrevChild(false);

else if(k-& gt;key() == Qt::Key_Tab)

RES = focusNextPrevChild(true);

中频(分辨率)

打破;

}

keypress event(k);

}

如果我们需要处理Tab键,我们需要重载事件函数。