Qt扫盲-QKeyEvent 键盘事件

news2025/2/12 17:58:26

QKeyEvent 键盘事件

  • 一、概述
  • 二、事件传播
  • 三、常用属性
    • 1. key()
    • 2. modifiers()
    • 3. isAutoRepeat()
    • 4. text()
  • 四、简单组合键代码

一、概述

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/645719.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

探索Redis内部数据结构

Redis支持多种数据结构&#xff0c;每种数据结构都有其特定的用途。下面对Redis支持的主要数据结构进行详细阐述&#xff1a; 一、字符串&#xff08;String&#xff09; 字符串是Redis最基本的数据结构&#xff0c;可以存储一个字符串或者二进制数据&#xff0c;例如图片、序…

Echarts—词云库(echarts-wordcloud)配置详解和使用(可自定义形状)

词云库的详解 前言安装基本配置详解具体使用步骤&#xff08;Vue为例&#xff09;自定义展示形状 前言 我们经常会看到一些网站或者页面有一堆五颜六色的词汇的聚在一块&#xff0c;有大有小的散落着&#xff0c;看着挺好看的&#xff1b; 也许项目中也会涉及到显示一些关键词…

【Linux脚本篇】Linux循环语句-while

目录 &#x1f341;while的语法格式 &#x1f341;while循环案例 &#x1f343;案例一&#xff1a;输出10-1的降序 &#x1f343;案例二&#xff1a;输出10的升序和降序 &#x1f343;案例三&#xff1a;批量创建用户 &#x1f341;内置跳出循环 &#x1f343;案例一&#xff1…

火山引擎 DataLeap:一个易用、高效的数据目录,是如何搭建的?

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 企业如何找到数据、了解数据以及使用数据&#xff1f; 这离不开数据目录的能力。数据目录有着类似于“字典”的作用&#xff0c;能够帮助数据生产者和使用者快速定位…

ESXI 环境搭建和配置

ESXI 环境搭建和配置 ESXI简介 ESXi专为运行虚拟机、最大限度降低配置要求和简化部署而设计。只需几分钟时间&#xff0c;客户便可完成从安装到运行虚拟机的全过程&#xff0c;特别是在下载并安装预配置虚拟设备的时候。 在VMware Virtual Appliance Marketplace 上有800多款…

RabbitMQ 安装

目录 一、安装RabbitMQ1、Linux 安装⑴、官网rpm包安装①、下载rpm安装包官网下载erlangrabbitmq packagecloud下载erlangrabbitmq ②、安装 erlang③、安装rabbitmq ⑵、packagecloud快速安装⑶、添加用户账号及权限并登陆⑷、卸载erlang与rabbitmq卸载rabbitmq卸载erlang 2、…

积聚产业发展新动能|2023开放原子全球开源峰会OpenAtom OpenHarmony分论坛成功举办

6 月 12 日&#xff0c;以“OpenHarmony 共建开放&#xff0c;共享未来”为主题的 2023 开放原子全球开源峰会 OpenAtom OpenHarmony&#xff08;以下简称“OpenHarmony”&#xff09;分论坛在北京北人亦创国际会展中心第一报告厅圆满落幕。开放原子开源基金会理事长孙文龙、华…

【mongoDB数据库基本操作】

mongoDB 基本命令使用 mongoDB数据库基本操作1、连接/创建数据库3、查看数据库4、删除数据库 表的基本操作1、创建表2、删除表3、查询表4、更新表删除表中的记录 mongoDB数据库基本操作 连接mongoDb服务器 进入到mongoDb安装目录 cd /data/mongodb/bin 使用./mongo连接到本…

为什么你的领导,总是挑刺,要求你要有自己的思考?

为什么你的领导&#xff0c;总是挑刺&#xff0c;要求你要有自己的思考&#xff1f; 如何思考&#xff1f;其实有方法论和框架&#xff0c;照这做&#xff0c;也能提升自己的思考能力和维度。 尴尬的问题 在职场的给位是否遇到过这种情况。领导在开完一次沟通会&#xff0c;或…

公元前后的王莽与屋大维

公元元年前后&#xff0c;地球的两端同时产生了两个辉煌的大国&#xff0c;z国和罗马。 我国经历了漫长而又松散的分封制后&#xff0c;在秦帝国时期实现了大一统&#xff0c;在那个时代&#xff0c;因为分封制有效的管理半径最多也就是500公里左右&#xff0c;所以非常不适合…

牛客网1658 页的 Java 岗面试突击手册,GitHub已下载量已过百万

不得不说程序员除了做项目之外&#xff0c;提升自己技能最快的方式就是【看书&#xff01;】和【刷题&#xff01;】&#xff0c;这里说的刷题不是无脑刷&#xff0c;而是要明白面试官为什么会问这个问题&#xff0c;以及这个问题的意义在哪里&#xff01; 今天带来的是全新升…

Beyond Compare 4 正版激活码 -变化是不可避免的,因此,请使用最好的工具对其进行管理。

Beyond Compare 是开发人员、系统管理员和其他人用来比较、合并和同步数据的软件应用程序。它可以在Windows&#xff0c;macOS和Linux上运行。 功能特点 比较文件夹、文件 一、随时随地访问数据 Beyond Compare 是敏捷的。 我们的虚拟文件系统以透明的方式将您连接到您的数据…

Stable Diffusion实操示例

一、负向提示词 解决问题&#xff1a;生成的图片存在瑕疵&#xff0c;比如多只眼睛、多只手指等情况。通过embeddings可以将避免一些常用的不好结果。 方法&#xff1a;从https://civitai.com/?utm_sourcenettsz.com 中下载负向提示词的embeddings模型&#xff0c; EasyNeg…

SOLIDWORKS 2023修复遗漏配合参考及装配体磁力配合

1、修复遗漏的配合参考 ① 为面、边线、平面、轴和点的参考修复遗漏的配合参考 ② 位于与遗漏的参考相同的位置和方向的零部件上选择参考&#xff0c;可修复零 部件遗漏的参考 ③ 包含多个遗漏的配合参考的模型&#xff0c;右键单击配合 文件夹&#xff0c;然后单击自动修复…

AI Expo 2023 | 图技术激活数据资产主题论坛线下报名限时开放!

洞察关联数据 创造无限可能 图技术激活数据资产主题论坛 将于2023年6月25日在苏州召开。 大会背景 本次图技术激活数据资产论坛&#xff0c;由苏州市大数据服务中心协会主办、浙江创邻科技有限公司承办&#xff0c;苏州市计算机学会、苏州市大数据和人工智能产业联盟协办&…

(五) ElasticSearch 数据类型和文档CRUD操作

1.ES数据类型 官方文档地址&#xff1a;https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-types.html#_complex_datatypes 核心数据类型&#xff08;Core Data Types&#xff09;&#xff1a; 核心数据类型是 Elasticsearch 最基本和常用的数据类型…

DataX 3.0 在Windows下基于MySQL做数据迁移示例

在 Windows 安装 Datax&#xff1a; Datax 官网&#xff1a;https://github.com/alibaba/DataX 环境要求&#xff1a; 1&#xff1a;JDK&#xff08;1.8以上&#xff0c;推荐1.8&#xff0c;并配置好环境变量&#xff09; 2&#xff1a;Python&#xff08;网上推荐Python2.…

Java线程的同步机制(synchronized关键字)

线程的同步机制(synchronized ) 1.背景 例子&#xff1a;创建个窗口卖票&#xff0c;总票数为100张.使用实现Runnable接口的方式 * 1.问题&#xff1a;卖票过程中&#xff0c;出现了重票、错票 -->出现了线程的安全问题2.问题出现的原因&#xff1a;当某个线程操作车票的过…

罗马不是一天建成的,那为什么建了那么多罗马?

这一个罗马&#xff0c;那一个罗马&#xff0c;东一个罗马&#xff0c;西一个罗马&#xff0c;世界历史的大半部分都在跟罗马打交道。更要命的是四大文明古国还没有古代罗马。 存在感这么强&#xff0c;还不是四大文明古国&#xff0c;名字还难记&#xff0c;公元前居然就有共…

P19[6-7]编码器接口(硬)

编码器接口自动控制定时器时基单元中的CNT计数器进行自增或自减,(初始化后CNT=0;编码器右转,产生一个脉冲,CNT++,左转,产生一个脉冲,CNT--)。相当于外部时钟,同时控制CNT计数方向和计数时钟。每隔一段时间取CNT的值,再把CNT清零,就表示编码器的速度。 编码器测速即测频法…