Qt5开发从入门到精通——第十一篇二节(Qt5 事件处理及实例——键盘事件及实例)

news2025/7/14 21:33:45

提示:欢迎小伙伴的点评✨✨,相互学习c/c++应用开发。🍳🍳🍳
博主🧑🧑 本着开源的精神交流Qt开发的经验、将持续更新续章,为社区贡献博主自身的开源精神👩‍🚀


文章目录

  • 前言
  • 一、键盘事件及实例概述
  • 二、效果实例
  • 三、原码实例
    • keyevent.h
    • keyevent.cpp
    • main.cpp
  • 四、总结

前言

本章节会给大家带来Qt5 事件处理及实例——键盘事件及实例详解。

一、键盘事件及实例概述

在图像处理和游戏应用程序中,有时需要通过键盘控制某个对象的移动,此功能可以通过对键盘事件的处理来实现。键盘事件的获取是通过重定义 QWidget 类的 keyPressEvent()和keyReleaseEvent()来实现的。

二、效果实例

通过键盘的上(↑)、下(↓)、左(←)、右(→)方向键可以控制图标的移动,移动的步进值为网格的大小,如果同时按下 Ctrl 键,则实现细微移动;若按下 Home (←)键,则光标回到界面的左上顶点;若按下End (→)键,则光标到达界面的右下顶点。
新建Resources 并建立image文件将tu.png图片放入其中
图一
在这里插入图片描述
图二
在这里插入图片描述

三、原码实例

keyevent.h

#ifndef KEYEVENT_H
#define KEYEVENT_H

#include <QWidget>
#include <QKeyEvent>
#include <QPaintEvent>

class KeyEvent : public QWidget
{
    Q_OBJECT

public:
    KeyEvent(QWidget *parent = 0);
    ~KeyEvent();
    void drawPix();
    void keyPressEvent(QKeyEvent *);
    void paintEvent(QPaintEvent *);

private:
    QPixmap *pix; //作为一个绘图设备,使用双缓冲机制实现图形的绘制
    QImage image; //界面中间的小图标

    /*图标的左上顶点位置*/
    int startX;
    int startY;
    /*界面的宽度和高度*/

    int width;
    int height;
    int step;      //网格的大小,即移动的步进值

};

#endif // KEYEVENT_H

keyevent.cpp

#include "keyevent.h"
#include <QPainter>
KeyEvent::KeyEvent(QWidget *parent)
    : QWidget(parent)
{
    setWindowTitle( tr ("键盘事件 ")) ;
    setAutoFillBackground(true);
    QPalette palette = this->palette ();

    palette.setColor(QPalette::Window,Qt::white);
    setPalette(palette);
    setMinimumSize(512,256);
    setMaximumSize(512,256);
    width=size() .width();
    height=size () . height();
    pix= new QPixmap(width,height);
    pix->fill (Qt::white);
    image.load(":/src/tu.png");
    startX=100;
    startY=100;
    step=20;
    drawPix();
    resize(512,256);
}

KeyEvent::~KeyEvent()
{

}
/*drawPix()函数实现了在 QPixmap 对象上绘制图像*/
void KeyEvent::drawPix()
{
    pix->fill (Qt::white); //重新刷新 pix 对象为白色底色
    QPainter *painter = new QPainter; //创建一个 QPainter 对象
    QPen pen (Qt::DotLine); /*创建一个 QPen 对象,设置画笔的线型为 Qt::DotLine, 用千绘制网格。*/

    for(int i=step;i<width;i=i+step)
    {
        painter->begin(pix); //指定 pix 为绘图设备
        painter->setPen (pen);
        painter->drawLine(QPoint(i,0),QPoint(i,height));
        painter->end();
    }

    for(int j=step; j<height; j=j+step)   //按照步进值的间隔绘制横向的网格线
    {
        painter->begin(pix);
        painter->setPen(pen);
        painter->drawLine(QPoint(0,j),QPoint(width,j));
        painter->end ();
    }

    painter->begin(pix);
    painter->drawImage(QPoint(startX,startY),image); /*在 pix 对象中绘制可移动的小图标。
                                                      *keyPressEvent() 函数处理键盘的按下事件
                                                      */
    painter->end();
}

void KeyEvent::keyPressEvent(QKeyEvent *event)
{
    /*判断修饰键 Ctrl 是否按下。
     * Qt::Keyboard Modifier 定义了一系列修饰键;
     *  • Qt::NoModifier: 没有修饰键按下。
        • Qt::ShiftModifier: Shift 键按下。
        • Qt::ControlModifier: Ctrl 键按下。
        • Qt::AltModifier: Alt 键按下。
        • Qt::MetaModifier: Meta 键按下。
        • Qt::KeypadModifier: 小键盘按键按下。
        • Qt::GroupSwitchModifier: Mode switch 键按下。
    */
    if(event->modifiers()==Qt::ControlModifier)
    {
        /*根据按下的左方向键调节图标的左上顶点的位置,步进值为 1, 即细微移动。*/
        if(event->key()==Qt::Key_Left)
        {
            startX= (startX-1<0) ?startX:startX-1;
        }
        /*根据按下的右方向键调节图标的左上顶点的位置,步进值为 1, 即细微移动。*/
        if (event->key ()==Qt::Key_Right)
        {
            startX= (startX+1+image.width()>width)?startX:startX+1;
        }
        /*根据按下的上方向键调节图标的左上顶点的位置,步进值为 1, 即细微移动。*/
        if (event->key()==Qt::Key_Up)
        {
            startY=(startY-1<0)?startY:startY-1;
        }
        /*根据按下的下方向键调节图标的左上顶点的位置,步进值为 1, 即细微移动 。*/
        if(event->key()==Qt::Key_Down)
        {
            startY= (startY+1+image. height() >height)?startY:startY+1;
        }

    }else
    {
        /*首先调节图标左上顶点的位置至网格的顶点上*/
        startX=startX-startX%step;
        startY=startY-startY%step;

        /*根据按下的左方向键调节图标的左上顶点的位置,步进值为网格的大小。*/
        if (event->key()==Qt::Key_Left)
        {
            startX=(startX-step<0)?startX:startX-step;
        }
        /*根据按下的右方向键调节图标的左上顶点的位置,步进值为网格的大小。*/
        if (event->key()==Qt::Key_Right)
        {
            startX=(startX+step+image.width()>width)?startX:startX+step;
        }
        /*根据按下的上方向键调节图标的左上顶点的位置,步进值为网格的大小。*/
        if(event->key()==Qt::Key_Up)
        {
            startY=(startY-step<0)?startY:startY-step;
        }
        /*根据按下的下方向键调节图标的左上顶点的位置,步进值为网格的大小。*/
        if (event->key()==Qt::Key_Down)
        {
            startY= (startY+step+image. height() >height)?startY:startY+step;
        }
        /*表示如果按下 Home 键,则恢复图标位置为界面的左上顶点。*/
        if (event->key() ==Qt::Key_Home)
        {
            startX=0;
            startY=0;
        }
        /*表示如果按下 End 键,则将图标位置设置为界面的右下顶点,这里注意需要考虑图标自身的大小。*/
        if (event->key()==Qt::Key_End)
        {
            startX=width-image.width();
            startY=height-image.height();
        }
    }
    drawPix(); //根据调整后的图标位置重新在 pix 中绘制图像
    update();  //触发界面重画
}
/*界面重绘函数 paintEvent(), 将 pix 绘制在界面上。*/
void KeyEvent::paintEvent(QPaintEvent *)
{
    QPainter painter;
    painter.begin(this);
    painter.drawPixmap(QPoint(0,0),*pix);
    painter.end();
}

main.cpp

#include "keyevent.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    KeyEvent w;
    w.show();

    return a.exec();
}

四、总结

Qt5 事件处理及实例——键盘事件及实例会在应用程序开发中经常用到的。

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

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

相关文章

基于DJYOS的UART驱动编写指导手册

1.概述 DJYOS设计通用的串口驱动模型&#xff0c;在此模型的基础上&#xff0c;移植到不同硬件平台时&#xff0c;只需提供若干硬件操作函数&#xff0c;即可完成串口驱动开发&#xff0c;使开发工作变得简单而快速执行效率高。 DJYOS源代码都有特定的存放位置&#xff0c; 建…

记录为小电机安装一个5012编码器(多摩川协议)的过程

目录 1. 编码器接口板介绍 2. 编码器接口板安装 3. 角度读取软件实现 4.总结 为了能得到更精确的角度&#xff0c;于是想要通过在测试电机上安装一个编码器来获取更精确的角度&#xff0c;方便日后调试或者校验使用&#xff0c;这里记录下操作的步骤。 1. 编码器接口板介绍…

Github Actions 自动同步到 Gitee

目录引言具体方案引言 平时开源代码一般已Github为主&#xff0c;但是会遇到网不好的情况&#xff0c;于是考虑将Github仓库自动同步到Gitee上&#xff0c;作为备份。考虑不能手动做这个事情&#xff0c;于是想到了Github Actions 自动化同步到Gitee中 具体方案 假设Github已…

Mybatis Plus一对多联表查询及分页解决方案

文章目录需求需求分析分页问题说明分页问题原因一对多场景一一对多场景二性能优化优化解决方案需求 查询用户信息列表&#xff0c;其中包含用户对应角色信息&#xff0c;页面检索条件有根据角色名称查询用户列表&#xff1b; 需求分析 一个用户对应多个角色&#xff0c;用户…

java计算机毕业设计ssm党支部在线学习

项目介绍 本党支部在线学习是针对目前学习的实际需求,从实际工作出发,对过去的学习系统存在的问题进行分析,完善用户的使用体会。采用计算机系统来管理信息,取代人工管理模式,查询便利,信息准确率高,节省了开支,提高了工作的效率。 本系统结合计算机系统的结构、概念、模型、原…

【深度学习】torch.utils.data.DataLoader相关用法 | dataloader数据加载器 | pytorch

文章目录前言一、DataLoader介绍二、DataLoader的子方法&#xff08;可调用方法&#xff09;前言 dataloader数据加载器属于是深度学习里面非常基础的一个概念了&#xff0c;基本所有的图像项目都会用上&#xff0c;这篇博客就把它的相关用法总结一下。 之所以要写这篇&#x…

1-1 开源许可证GPL, BSD, MIT, Mozilla, Apache, LGPL的介绍

文章目录前言开源许可证由来开源许可证类型开源许可证介绍GPL协议BSD协议MIT协议Mozilla许可Apache协议LGPL开源协议前言 开源许可证&#xff08;Open source licenses&#xff09;&#xff0c;广义来讲是指一种被用于计算机软件或其他产品的&#xff0c;允许在指定的条款内使…

zMemif: go语言高性能网络库

简介 开发zMemif的主要动机是go有很高的处理能力&#xff0c;但是内置的udp库的确有些寒酸&#xff0c; 纯c开发效率又有些低&#xff0c;虽然可以用nff-go来实现go和dpdk的融合&#xff0c;但是cgo编译的确有点烦人&#xff0c;而且这个项目似乎也死了。然后考虑到容器的场景…

单点登录以及实现(前后端分离和前后端不分离方式)

本文主要使用springSecurity来实现&#xff0c;其他实现请参照其原理自行研究。 一&#xff0c;单系统登录机制 1、http无状态协议 web应用采用browser/server架构&#xff0c;http作为通信协议。http是无状态协议&#xff0c;浏览器的每一次请求&#xff0c;服务器会独立处…

谷粒学院(三) 项目前端知识

一、VS Code 1、插件安装 为方便后续开发&#xff0c;建议安装如下插件&#xff08;红色矩形框标记的插件&#xff09;2、创建项目 vscode本身没有新建项目的选项&#xff0c;所以要先创建一个空的文件夹&#xff0c;如project_xxxx。 然后打开vscode&#xff0c;再在vscode里面…

二维随机向量的数学期望E与协方差σ

目录 1. 二维随机向量(X,Y)的数学期望EX, EY 2. 二维随机向量函数zg(X,Y)的数学期望EZ 3. 二维随机向量(X,Y)的方差DX, DY 4. 二维随机向量的性质&#xff08;和、积的数学期望E与方差D&#xff09; 5. 二维随机向量的协方差COV和相关系数ρ 5.1 协方差COV定义 5.2 协方…

私有数据传参

在串口工具进行输入&#xff1a; echo 1 > /dev/myled0 ---->led1灯点亮 echo 0 > /dev/myled0 ---->led1灯熄灭 echo 1 > /dev/myled1 ---->led1灯点亮 echo 0 > /dev/myled1 ---->led1灯熄灭 echo 1 > /dev/myled2 ---->led1灯点亮 echo 0 >…

java计算机毕业设计springboot+vue员工管理系统

项目介绍 本员工管理系统是针对目前村委会管理的实际需求,从实际工作出发,对过去的员工管理系统存在的问题进行分析,完善用户的使用体会。采用计算机系统来管理信息,取代人工管理模式,查询便利,信息准确率高,节省了开支,提高了工作的效率。 本系统结合计算机系统的结构、概念、…

无线蓝牙耳机什么牌子好一点?2022年蓝牙耳机推荐

喜欢听音乐&#xff0c;自然离不开耳机的支持&#xff0c;一款优质且时尚的耳机&#xff0c;能够带来极致的音效&#xff0c;可是该如何选择合适的耳机&#xff0c;成为了摆在眼前一个很重要问题如果这个问题一直萦绕在你的脑海中&#xff0c;那么下面的选择相信定不会错。 TO…

多线程异步方法Spring Security框架的SecurityContext无法获取认证信息的原因及解决方案

Spring Security是Spring生态提供的用户应用安全保护的一个安全框架&#xff0c;其提供了一种高度可定制的实现身份认证(Authentication)&#xff0c;授权&#xff08;Authorization&#xff09;以及对常见的web攻击手段做防护的方法。 之前我的博客Oauth2与Spring Security框架…

章鱼网络 Community Call #4|推进章鱼社区治理

全长5922字&#xff0c;预计阅读 15 分钟 撰文&#xff1a;MiX 微信交流&#xff1a;MixMetaverse 北京时间2022年11月8日21点&#xff0c;章鱼网络举行第4期 Community Call&#xff0c;10月8日是章鱼一周年庆典&#xff0c;所以本次 Community Call 我们讨论了最近2个月内很…

git可视化工具-sourceTree

1. 下载 官网的下载地址&#xff0c;可以根据自己的电脑操作系统选择合适的版本下载&#xff0c;我下载的是windows版本 Sourcetree | Free Git GUI for Mac and Windows A Git GUI that offers a visual representation of your repositories. Sourcetree is a free Git clie…

ArcGIS提取图斑四至点,可不再是四至范围哦

上一期我们向大家介绍了 ArcGIS计算图斑四至坐标原来这么简单&#xff01;可不要在走弯路哦_GIS思维的博客-CSDN博客​​ArcGIS计算图斑四至坐标原来这么简单&#xff01;可不要在走弯路哦https://blog.csdn.net/kinghxj/article/details/127941005 今天我们要向大家介绍一下 …

Gem5 for Ubuntu20.04

一、安装Ubuntu 参考教程&#xff1a;史上最全最新Ubuntu20.04安装教程&#xff08;图文&#xff09; - 知乎 (zhihu.com) 1. 查看Ubuntu版本号命令&#xff1a; lsb_release -a 显示如下&#xff1a; Distributor ID: Ubuntu //类别是ubuntu Description: Ubuntu 2…

LeetCode力扣刷题——指针三剑客之二:树

树 一、数据结构介绍 作为&#xff08;单&#xff09;链表的升级版&#xff0c;我们通常接触的树都是二叉树&#xff08;binary tree&#xff09;&#xff0c;即每个节点最多有 两个子节点&#xff1b;且除非题目说明&#xff0c;默认树中不存在循环结构。LeetCode 默认的树表示…