当前位置: 首页 > news >正文

QT:键盘事件(添加资源图片)

键盘事件:

在图像处理和游戏应用程序中,有时需要通过键盘控制某个对象的移动,此功能可以 通过

对键盘事件的处理来实现。键盘事件的获取是通过重定义QWIDGET类的KEYPressEvent()

和KEYRELEASEEVENT()来实现的。

通过键盘的上、下、左、右方向键可以控制图标的移动,移动的步进值 为风格的大小,如果

同时按下CTRL键,则实现细微移动;若按下HOME键,则光标回到界面的左上顶点;若按下

END键,则光标到达界面的右下顶点。

image

 

image

 具体实现步骤如下

(1)头文件keyevent.h 的具体内容如下:

#ifndef KEYEVENT_H
#define KEYEVENT_H#include <QWidget>
#include <QKeyEvent>
#include <QPaintEvent>class KeyEvent : public QWidget
{Q_OBJECTpublic:KeyEvent(QWidget *parent = nullptr);~KeyEvent();void drawPix();void keyPressEvent(QKeyEvent *event) ;void paintEvent(QPaintEvent *event)  ;
private:QPixmap *pix;QImage image;int startX;int startY;int width;int height;int step;
};
#endif // KEYEVENT_H

  

(2)源文件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("../image/image.png"); // ../ :表示EXE程序的上级目录。 ./:表示exe程序的同级目录startX=100;startY=100;step = 20;drawPix();resize(512,256);
}KeyEvent::~KeyEvent()
{
}void KeyEvent::drawPix()
{pix->fill(Qt::white);QPainter *painter = new QPainter;QPen pen(Qt::DotLine);for(int i=step; i<width;i=i+step)// 按照步进值的间隔绘制纵向的网格线{painter->begin(pix);painter->setPen(pen);painter->drawLine(QPoint(i,0),QPoint(i,height));painter->end();}for(int j=step; j<width;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);painter->end();
}void KeyEvent::keyPressEvent(QKeyEvent *event)
{  // 按钮 : CTRL + 方向键  的事件if(event->modifiers()==Qt::ControlModifier){if(event->key()==Qt::Key_Left){startX=(startX-1<0)?startX:startX-1;}if(event->key()==Qt::Key_Right){startX=(startX+1+image.width()>width)?startX:startX+1;}if(event->key()==Qt::Key_Up){startY=(startY-1<0)?startY:startY-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;}if(event->key()==Qt::Key_Home){startX = 0;startY = 0;}if(event->key()==Qt::Key_End){startX= width-image.width();startY= height-image.height();}}drawPix();//根据调整后的图标位置重新在PIX中绘制图像update(); // 触发界面重画
}void KeyEvent::paintEvent(QPaintEvent *)
{QPainter painter;painter.begin(this);painter.drawPixmap(QPoint(0,0),*pix);painter.end();
}

  

(3)在项目工程所在目录(D:\QT\CH11\CH1102\KeyEvent)下新建一个文件夹并命名为image,在文件夹内保存一个名为“image.png”的图片;在项目中按照以下步骤添加资源文件。

(A)在项目名“KeyEvent”上单击鼠标右键->"添加新文件..."菜单项,在如图11.3所示的对话框中单击“Qt”模板->"Qt Resource File" ->"Choose..."按钮。

image

 (B)在弹出的对话框中选择资源要存放的路径,如图11.4所示在“名称” 栏中填写资源名称“keyevent”。单击“下一步”按钮,单击“完成”按钮。此时,项目下自动添加一个"keyevent.qrc "资源文件,如图11.5所示。

image

 

image

 图11.5 添加后的项目目录树

(C)、鼠标右击资源文件,选择“add Prefix...”菜单项,在弹出的“Add Prefix”对话框的“Prefix:”

栏中填写“/new/prifix1”,单击"oK"按钮,此时项目目录树右区资源文件下新增了一个“/new/prefix1”子目录项,单击该区下方“添加”按钮上的 "添加文件',按照如图11.6所示的步骤操作,在弹出的对话框中选项“image/image.png”文件,单击“提示”按钮,将该图片添加到项目中。

image

image

 

image

 

 

(4)drawPix()函数实现了在QPixmap对象上绘制图像,其具体代码如下:

void KeyEvent::drawPix()
{pix->fill(Qt::white);QPainter *painter = new QPainter;QPen pen(Qt::DotLine);for(int i=step; i<width;i=i+step)// 按照步进值的间隔绘制纵向的网格线{painter->begin(pix);painter->setPen(pen);painter->drawLine(QPoint(i,0),QPoint(i,height));painter->end();}for(int j=step; j<width;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);painter->end();
}

  

(5)keyPressEvent()函数处理键盘的按下事件,具体代码如下:

void KeyEvent::keyPressEvent(QKeyEvent *event)
{  // 按钮 : CTRL + 方向键  的事件if(event->modifiers()==Qt::ControlModifier){if(event->key()==Qt::Key_Left){startX=(startX-1<0)?startX:startX-1;}if(event->key()==Qt::Key_Right){startX=(startX+1+image.width()>width)?startX:startX+1;}if(event->key()==Qt::Key_Up){startY=(startY-1<0)?startY:startY-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;}if(event->key()==Qt::Key_Home){startX = 0;startY = 0;}if(event->key()==Qt::Key_End){startX= width-image.width();startY= height-image.height();}}drawPix();//根据调整后的图标位置重新在PIX中绘制图像update(); // 触发界面重画
}

  

(6)界面重绘函数paintEvent(),将pix绘制在界面上。其具体代码如下:

void KeyEvent::paintEvent(QPaintEvent *)
{QPainter painter;painter.begin(this);painter.drawPixmap(QPoint(0,0),*pix);painter.end();
} 

(7)项目KEYEVENT.PRO 详细代码

QT       += core guigreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsCONFIG += c++11# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0SOURCES += \main.cpp \keyevent.cppHEADERS += \keyevent.hTRANSLATIONS += \KeyEvent_zh_CN.ts# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += targetRESOURCES += \keyevent.qrc

  

(8)运行结果如图11.2所示。

 

http://www.jsqmd.com/news/24984/

相关文章:

  • 2025.10.28
  • docker desktop:更新WSL2+安装nginx
  • # 学代码--看懂了但是不会写
  • 2025-10-28 aoao Round 比赛总结
  • P11307 [COTS 2016] 建造费 Pristojba 分析
  • 程序员如何打破职业瓶颈?先搬开这3块绊脚石。
  • 乱学点东西#2 :菠萝/蓝莓/Boruvka算法
  • 文件清理,推荐几款常用软件
  • AI时代的设计师:从工具到“超人”的进化之路
  • MyBatis 动态 SQL 实现原理 - Higurashi
  • bililun
  • 《程序员修炼之道:从小工到专家》观后感第二篇
  • 【学习笔记】数据结构全家桶
  • 社区
  • 「Gym 102759I」Query On A Tree 17
  • Mybatis使用简述
  • C++里的代码命名规范
  • 最小二乘问题详解6:梯度下降法
  • JavaWeb01
  • 现代C++编程初体验
  • Delphi 利用接口实现frame窗体间的通讯(互动)
  • NRF54LM20A 芯片的优点
  • 零散点小总结(25.10.28)
  • Top Tree大学习
  • 乱学点东西目录
  • CFS任务的负载均衡(load balance)
  • EVE-NG导入华为等镜像的方法
  • (简记)一类支配点对解决区间查询问题
  • 2025 云斗
  • c++ ranges随笔