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键,我们需要重载事件函数。