【Qt开发流程】之事件系统3:键盘事件

序章

以下链接是拖放事件介绍和使用示例:
【Qt开发流程】之拖放操作1:介绍链接: https://blog.csdn.net/MrHHHHHH/article/details/134626484
【Qt开发流程】之拖放操作2:使用链接: https://blog.csdn.net/MrHHHHHH/article/details/134632006
以下链接是事件系统及键盘事件描述及示例:
【Qt开发流程】之事件系统1:事件系统描述及事件发生流程链接: https://blog.csdn.net/MrHHHHHH/article/details/134722922
【Qt开发流程】之事件系统2:鼠标事件及滚轮事件链接: https://blog.csdn.net/MrHHHHHH/article/details/134756089

键盘事件

QKeyEvent类描述一个键盘事件。
当键盘有键按下或者释放时,键盘事件便会被发送给拥有输入焦点的部件。
关键事件包含一个特殊的接受标志,指示接收方是否将处理该关键事件。这个标志默认情况下是为QEvent::KeyPress和QEvent::KeyRelease设置的,所以在处理键事件时不需要调用accept()。对于QEvent::ShortcutOverride,接收者需要显式地接受事件来触发覆盖。在键事件上调用ignore()将把它传播到父小部件。事件沿着父小部件链向上传播,直到小部件接受它或事件过滤器使用它。
QWidget::setEnabled()函数可用于启用或禁用小部件的鼠标和键盘事件。
事件处理程序QWidget::keyPressEvent()QWidget::keyReleaseEvent()QGraphicsItem::keyPressEvent()QGraphicsItem::keyReleaseEvent()接收关键事件。
QKeyEventkey()函数可以获得具体的按键,按键类型在Qt::Key枚举中。
如:
在这里插入图片描述
需注意:
CtrlShift键,需要使用modifiers()函数获取。
在这里插入图片描述

示例

以下是一个使用键盘事件的示例。
实现组合键控制控件移动。
mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>namespace Ui {
class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = nullptr);~MainWindow();protected:void keyPressEvent(QKeyEvent *event);void keyReleaseEvent(QKeyEvent *event);
private:Ui::MainWindow *ui;bool bIsUp = false;bool bIsRight = false;bool bMove = false;
};#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"#include <QKeyEvent>MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);setFocus();
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::keyPressEvent(QKeyEvent *event)
{if(event->modifiers() == Qt::ControlModifier){if(event->key() == Qt::Key_M)setWindowState(Qt::WindowMaximized);if(event->key() == Qt::Key_N){setWindowState(Qt::WindowNoState);}}else if(event->type() == QEvent::KeyPress){switch (event->key()) {case Qt::Key_Up:{if(event->isAutoRepeat())return;bIsUp = true;}break;case Qt::Key_Right:{if(event->isAutoRepeat())return;bIsRight = true;}break;default:break;}}QMainWindow::keyPressEvent(event);}void MainWindow::keyReleaseEvent(QKeyEvent *event)
{switch (event->key()) {case Qt::Key_Up:{if(event->isAutoRepeat())return;bIsUp = false;if(bMove){bMove = false;return;}if(bIsRight){ui->pushButton->move(ui->pushButton->pos().x() + 10, ui->pushButton->pos().y() + 10);bMove = true;}else {ui->pushButton->move(80, 60);}}break;case Qt::Key_Right:{if(event->isAutoRepeat())return;bIsRight = false;if(bMove){bMove = false;return;}if(bIsUp){ui->pushButton->move(ui->pushButton->pos().x() + 10, ui->pushButton->pos().y() + 10);bMove = true;}else {ui->pushButton->move(80, 60);}}break;default:{}break;}QMainWindow::keyReleaseEvent(event);
}

以上代码解释:

  • keyPressEvent()重载,处理键盘按下事件,当重复按下时,返回,记录按下状态
  • keyReleaseEvent()重载,处理键盘释放事件,当按下向上的同时,按下向右键,控件会在x , y 的基础上右下偏移10个像素
  • 当只有一个按键时,控件恢复到默认坐标

效果

因为自动重复返回了,所以效果会不是那么好。

键盘事件

结论

为什么一看书,就困呢?因为书,是梦开始的地方

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

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

相关文章

百度智能云推出“千帆AI原生应用开发工作台” 助力开发者创新

在这个智能互联的世界&#xff0c;每一次技术的飞跃都预示着无限可能。你是否曾梦想&#xff0c;一款产品能够打破创新的边界&#xff0c;让开发不再是高门槛的技术挑战&#xff1f;12月20日&#xff0c;百度云智大会智算大会将为你揭开这幕神秘面纱——“千帆AI原生应用开发工…

orvibo旗下的VS30ZW网关分析之一

概述 从官网的APP支持的智能中枢来看,一共就两种大类: MixPad系列和网关系列 排除MixPad带屏网关外,剩余的设备如下图: 目前在市场上这四种网关已经下市,官方已经宣布停产。所以市场上流通的也几乎绝迹。 从闲鱼市场上可以淘到几个,拿来分析一下,这里我手头有如下的两…

配置typroa上传图片到gitee

在typora这个位置下载插件 在picgo.exe文件夹下输入cmd 打开命令行输入如下命令安装相关插件 .\picgo install gitee-uploader .\picgo install super-prefix 之后按照官方文档更改相关配置 官方文档参考 https://picgo.github.io/PicGo-Core-Doc 博客参考&#xff1a;…

抑郁症中西医治疗对比?

抑郁症是一种常见的心理障碍&#xff0c;治疗方法包括中医和西医两种。下面就抑郁症中西医治疗进行对比&#xff1a; 治疗方法&#xff1a;中医治疗抑郁症强调整体观念和辨证论治&#xff0c;通过调理身体各部分的功能&#xff0c;达到治疗抑郁症的目的。中医治疗抑郁症多采用天…

矩阵的条件数及病态方程组的处理

对 A x b Axb Axb,如果A或者b有轻微的变动,会使得求解出的 x x x发生巨变,这种矩阵就是病态的 A x b Axb Axb 真实情况 A ( Δ x x ) Δ b b A(\Delta xx)\Delta bb A(Δxx)Δbb 代入误差的扰动情况 Δ x A − 1 Δ b \Delta xA^{-1}\Delta b ΔxA−1Δb 取范数后有 ∣…

人体姿态估计算法

人体姿态估计算法 1 什么是人体姿态估计2 基于经典传统和基于深度学习的方法2.1 基于经典传统的人体姿态估计算法2.2 基于深度学习的人体姿态估计算法OpenPoseAlphaPose (RMPE) 3 算法应用4 Paper 人体姿态估计在现实中的应用场景很丰富&#xff0c;如下 动作捕捉&#xff1a;三…

Android String.xml 设置加粗字体/修改字体颜色/动态设置修改文案

之前经常使用Spannable 这次主要在String.xml使用&#xff1a;<![CDATA[和]]> 效果&#xff1a; <resources><string name"str_bianse"><![CDATA[变色 <font color"#ff0000">曲项向天歌</font> 白毛浮绿水]]></st…

idea新建spring boot starter

什么是spring boot starter Spring Boot Starter 是一种 Maven 或 Gradle 依赖&#xff0c;它能够轻松地将相关库和框架集成到 Spring Boot 应用程序中。Starter 是一种对常见依赖项和设置的易于复用的封装&#xff0c;它们通常被开发人员用于创建可插拔的 Spring Boot 应用程序…

信息学奥赛一本通1190:上台阶

1190&#xff1a;上台阶 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 69016 通过数: 23589 【题目描述】 楼梯有n(0<n<71)阶台阶,上楼时可以一步上1阶,也可以一步上2阶,也可以一步上3阶&#xff0c;编程计算共有多少种不同的走法。 【输入】 输入的每一行…

SCAU:各位数字

各位数字 Time Limit:1000MS Memory Limit:65535K 题型: 编程题 语言: G;GCC 描述 从键盘输入一个3位数的正整数&#xff0c;要求先后输出该数的百位数字与个位数字&#xff0c;各占一行输入格式 一个三位整数输出格式 输出该数的百位数字与个位数字输入样例 123输出…

报考公务员简历(精选8篇)

想要成功进入公务员队伍&#xff0c;一份出色的个人简历是必不可少的。本文为大家精选了8篇报考公务员的个人简历案例&#xff0c;无论是应届毕业生还是有工作经验的求职者&#xff0c;都能从中汲取灵感&#xff0c;提升简历质量。找到心仪的公务员岗位。 报考公务员简历模板下…

迭代器模式-C++实现

题外话&#xff1a; 设计模式是在1994年提出的&#xff0c;当时还没有C的STL库和泛型编程&#xff0c;所以人们为了提供一种有效的方法来访问一个聚合对象&#xff08;例如列表、集合、数组等&#xff09;中的元素&#xff0c;而又不暴露该对象的内部表示&#xff0c;于是想到了…

Pandas在Excel同一个sheet里插入多个Dataframe和行

Pandas默认的to_excel是直接把完成的Datafrme写入一个sheet里,这并不能满足我们在一个sheet里插入多个Dataframe或多行的需求。为了实现插入多行或多Dataframe的目的,我们需要新建一个ExcelWriter对象,然后依次插入数据。 这里我们以插入2个Dataframe和三行单元格为例。 新…

大华技术GIS开发工程师24届秋招三场面试Offer面经

本文介绍2024届秋招中&#xff0c;大华技术股份有限公司的GIS开发工程师岗位的3场面试基本情况、提问问题等。 10月投递了大华技术股份有限公司的GIS开发工程师岗位&#xff0c;所在部门为研发中心。目前完成了一面、二面与三面等全部流程&#xff0c;并有幸获得Offer&#xff…

vite脚手架,手写实现配置动态生成路由

参考文档 vite的glob-import vue路由配置基本都是重复的代码&#xff0c;每次都写一遍挺难受&#xff0c;加个页面就带配置下路由 那就利用 vite 的 文件系统处理啊 先看实现效果 1. 考虑怎么约定路由&#xff0c;即一个文件夹下&#xff0c;又有组件&#xff0c;又有页面&am…

[数据结构]HashSet与LinkedHashSet的底层原理学习心得

我们区分list和set集合的标准是三个&#xff1a;有无顺序&#xff0c;可否重复&#xff0c;有无索引。 list的答案是&#xff1a;有顺序&#xff0c;可重复&#xff0c;有索引。这也就是ArrayList和LinkedList的共性 set的答案是&#xff1a;顺序内部再区分,不可以重复&#xf…

【数电笔记】11-最小项(逻辑函数的表示方法及其转换)

目录 说明&#xff1a; 逻辑函数的建立 1. 分析逻辑问题&#xff0c;建立逻辑函数的真值表 2. 根据真值表写出逻辑式 3. 画逻辑图 逻辑函数的表示 1. 逻辑表达式的常见表示形式与转换 2. 逻辑函数的标准表达式 &#xff08;1&#xff09;最小项的定义 &#xff08;2&am…

python-迭代器与生成器

迭代器&#xff08;Iterators&#xff09;和生成器&#xff08;Generators&#xff09;是 Python 中用于处理可迭代对象的重要工具。它们在处理大型数据集或需要逐个产生元素的情况下非常有用。下面是关于这两个概念的中文介绍&#xff1a; 迭代器&#xff08;Iterators&#…

【JavaEE】多线程(3) -- 线程等待 wait 和 notify

目录 1. wait()⽅法 2. notify()⽅法 3. notifyAll()⽅法 4. wait 和 sleep 的对⽐&#xff08;⾯试题&#xff09; 由于线程之间是抢占式执⾏的, 因此线程之间执⾏的先后顺序难以预知. 但是实际开发中有时候我们希望合理的协调多个线程之间的执⾏先后顺序. 完成这个协调⼯…

洛谷 P1450 [HAOI2008] 硬币购物

思路 完全背包&#xff1a;预处理出不限制硬币数量的方案数。 dp[0]1; dfor(i,1,4) dfor(j,c[i],(int)1e5) dp[j]dp[j-c[i]];容斥 不限制数量的方案数 − - − 超出限制的方案数 符合限制的方案数 。考虑第 i i i 种硬币超出数量限制的方案数。强制支付 d i 1 d_i1 di​…