Qt扫盲-QKeyEvent 键盘事件

一、概述

QKeyEvent 是Qt 里面描述键盘事件的一个属性类,所有的事件本质上来说其实就是一个信息包,而这个包里面就是有这个事件的一些属性信息,我们再处理这个事件的事件处理函数里面就可以把这个 信息包,也就是事件的信息拿到,然后对这些信息进行自己的处理。

以 QWidget 为例子,QKeyEvent 当按键被按下或释放时,按键事件将以键盘输入焦点的形式发送给widget。然后继承了QWidget基类的widget 的就可以重写 QWidget::keyPressEvent()、QWidget::keyReleaseEvent() 这两个函数函数。

你看我们就可以看到这个 keyPressEvent 或者 keyReleaseEvent 都是接收的一个 QKeyEvent类,这个类就是包含了键盘按下释放的信息。

  • void QWidget::keyPressEvent(QKeyEvent *event)
  • void QWidget::keyReleaseEvent(QKeyEvent *event)

二、事件传播

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() 去拦截获取到。

1. key()

这个函数是最常用的

  • 功能: 返回按下或释放的键的代码。
    (这个代码是Qt自己编写的一套码这些代码独立于底层的窗口系统。请注意,这个函数不区分大写字母和非大写字母,为此使用text()函数(返回生成的Unicode文本)。

值为 0 或 Qt::Key_unknown意味着事件不是已知键的结果; 例如,它可能是组合序列、键盘宏或按键事件压缩的结果。

这个码表要自己查

在这里插入图片描述

2. modifiers()

返回事件发生后立即存在的键盘修饰符标志。
警告:这个函数不能总是可信的。例如,用户可能会同时按下两个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<KeyboardModifier>的typedef类型。它存储 KeyboardModifier值的一个或多个组合。

这个常常用在组合键上面的 就是上面的 键 + 其他键

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);
    }
}

3. isAutoRepeat()

这个就用在多个组合键的时候使用,如果此事件来自自动重复键,则返回true;如果来自于初始按键,则返回false;
这个就是判断某一个键是否重复按下。

请注意,如果事件是一个多键压缩事件,并且部分原因是自动重复,则此函数可能返回true或false。

4. text()

返回此键生成的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;
}

猜你喜欢

转载自blog.csdn.net/qq_43680827/article/details/131206307