提示:欢迎小伙伴的点评✨✨,相互学习c/c++应用开发。🍳🍳🍳
博主🧑🧑 本着开源的精神交流Qt开发的经验、将持续更新续章,为社区贡献博主自身的开源精神👩🚀
本章节会给大家带来Qt5 事件处理及实例——键盘事件及实例详解。
在图像处理和游戏应用程序中,有时需要通过键盘控制某个对象的移动,此功能可以通过对键盘事件的处理来实现。键盘事件的获取是通过重定义 QWidget 类的 keyPressEvent()和keyReleaseEvent()来实现的。
通过键盘的上(↑)、下(↓)、左(←)、右(→)方向键可以控制图标的移动,移动的步进值为网格的大小,如果同时按下 Ctrl 键,则实现细微移动;若按下 Home (←)键,则光标回到界面的左上顶点;若按下End (→)键,则光标到达界面的右下顶点。
新建Resources 并建立image文件将tu.png图片放入其中
图一
图二
#ifndef KEYEVENT_H
#define KEYEVENT_H#include
#include
#include class KeyEvent : public QWidget
{Q_OBJECTpublic: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
#include "keyevent.h"
#include
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;ipainter->begin(pix); //指定 pix 为绘图设备painter->setPen (pen);painter->drawLine(QPoint(i,0),QPoint(i,height));painter->end();}for(int j=step; jpainter->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();
}
#include "keyevent.h"
#include int main(int argc, char *argv[])
{QApplication a(argc, argv);KeyEvent w;w.show();return a.exec();
}
Qt5 事件处理及实例——键盘事件及实例会在应用程序开发中经常用到的。