提示:欢迎小伙伴的点评✨✨,相互学习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 事件处理及实例——键盘事件及实例会在应用程序开发中经常用到的。