QKeyEvent 是Qt 里面描述键盘事件的一个属性类,所有的事件本质上来说其实就是一个信息包,而这个包里面就是有这个事件的一些属性信息,我们再处理这个事件的事件处理函数里面就可以把这个 信息包,也就是事件的信息拿到,然后对这些信息进行自己的处理。
以 QWidget 为例子,QKeyEvent 当按键被按下或释放时,按键事件将以键盘输入焦点的形式发送给widget。然后继承了QWidget基类的widget 的就可以重写 QWidget::keyPressEvent()、QWidget::keyReleaseEvent() 这两个函数函数。
你看我们就可以看到这个 keyPressEvent 或者 keyReleaseEvent 都是接收的一个 QKeyEvent类,这个类就是包含了键盘按下释放的信息。
key 按键 事件包含一个特殊的accept标志,表示接收方是否会处理key事件。QEvent::KeyPress和QEvent::KeyRelease默认设置了这个标志,因此在处理按键事件时不需要调用accept()方法。 不用手动去调了
对于QEvent:: shortoverride事件,接收器需要显式接受事件来触发覆盖。在一个key事件上调用 ignore() 将把它传播到父窗体类。事件在父窗体类链上传播,直到窗体类接受它或在事件过滤器使用它。其实就像在一个窗口里面一个输入框的快捷键是 ctrl + c 粘贴功能,但在父窗口的时候 ctrl + c 功能是关闭窗口,这就需要我们自己去 使用 ignore() 或者 accept() 去决定这个处理逻辑的情况。
函数QWidget::setEnabled()可用于启用或禁用窗体类的鼠标和键盘事件。
事件处理程序QWidget::keyPressEvent()、QWidget::keyReleaseEvent()、QGraphicsItem::keyPressEvent()和QGraphicsItem::keyReleaseEvent()接收按键事件。
对了,每次键盘时间发送的时候在同一个时刻只有一个键盘事件发生,像组合键的话,得自己去在 keyPressEvent() 和 keyReleaseEvent() 去拦截获取到。
这个函数是最常用的
值为 0 或 Qt::Key_unknown意味着事件不是已知键的结果; 例如,它可能是组合序列、键盘宏或按键事件压缩的结果。
这个码表要自己查
返回事件发生后立即存在的键盘修饰符标志。
警告:这个函数不能总是可信的。例如,用户可能会同时按下两个Shift键,然后松开其中一个。
参数 | 含义 |
---|---|
Qt::NoModifier | 没有按下修改键。 |
Qt::ShiftModifier | 按下键盘上的Shift键。 |
Qt::ControlModifier | 按下键盘上的“Ctrl”键。 |
Qt::AltModifier | 按下键盘上的Alt键。 |
Qt::MetaModifier | 按下键盘上的Meta键。 |
Qt::KeypadModifier | 按下键盘按钮。 |
Qt::GroupSwitchModifier | 只能使用X11(除非在Windows上通过命令行参数激活)。按下键盘上的Mode_switch键。 |
注意:在macOS上,ControlModifier值对应于键盘上的命令键,MetaModifier 值对应于 ctrl 键。当按下箭头键时,也将设置 KeypadModifier 值,因为箭头键被认为是小键盘的一部分。
注意:在Windows键盘上,Qt::MetaModifier 和 Qt::Key_Meta 被映射到 Windows 键。
KeyboardModifiers类型是QFlags
这个常常用在组合键上面的 就是上面的 键 + 其他键
bool EventUse::eventFilter(QObject *obj, QEvent *event)
{
if (event->type() == QEvent::KeyPress)
{
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
// shift + s
if(keyEvent->modifiers() == Qt::ShiftModifier && keyEvent->key() == Qt::Key_S)
{
qDebug()<<"\n组和键完成!";
}
return QObject::eventFilter(obj, event);
}
}
这个就用在多个组合键的时候使用,如果此事件来自自动重复键,则返回true;如果来自于初始按键,则返回false;
这个就是判断某一个键是否重复按下。
请注意,如果事件是一个多键压缩事件,并且部分原因是自动重复,则此函数可能返回true或false。
返回此键生成的Unicode文本。
当按下诸如Shift、Control、Alt和 Meta 等修改键时,不同平台的返回值不同,可能返回空字符串。
这个要注意使用的。
//只按下了 s
key: QFlags<Qt::KeyboardModifier>(NoModifier) "s"
//按了 shift + s 就先打印的 shift值,后打印的 shift + s 大写值 S
key: QFlags<Qt::KeyboardModifier>(AltModifier) ""
key: QFlags<Qt::KeyboardModifier>(ShiftModifier) "S"
//MainWindow.h
QVector m_keycommand;
void keyPressEvent(QKeyEvent *event) override;
void keyReleaseEvent(QKeyEvent *event) override;
//MainWindow.cpp
void MainWindow::keyPressEvent(QKeyEvent *event)
{
if(event->isAutoRepeat())//如果是一直按下按钮触发直接返回
return;
QString command= getKeyText(event->key());
if(!m_keycommand.contains(command))
m_keycommand.push_back(command);
qDebug()<<m_keycommand;
}
void MainWindow::keyReleaseEvent(QKeyEvent *event)
{
if(event->isAutoRepeat())//如果是一直按下按钮触发直接返回
return;
QString command=getKeyText(event->key());
m_keycommand.removeOne(command);
qDebug()<<m_keycommand;
}