效果图展示:
.h
#ifndef KEYEVENT_H
#define KEYEVENT_H
#include <QWidget>
#include <QPixmap>
#include <QImage>
#include <QKeyEvent>
namespace Ui {
class KeyEvent;
}
class KeyEvent : public QWidget
{
Q_OBJECT
public:
explicit KeyEvent(QWidget *parent = 0);
~KeyEvent();
void drawPix();
void keyPressEvent(QKeyEvent* e);
void paintEvent(QPaintEvent* e);
private:
QPixmap* pix;
QImage image;
int StartX;
int StartY;
int width;
int height;
int step; //网格的大小,既移动的步进数
private:
Ui::KeyEvent *ui;
};
#endif // KEYEVENT_H
.cpp
#include "keyevent.h"
#include "ui_keyevent.h"
#include <QPen>
#include <QPainter>
KeyEvent::KeyEvent(QWidget *parent) :
QWidget(parent),
ui(new Ui::KeyEvent)
{
ui->setupUi(this);
setWindowTitle("键盘事件");
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");
StartX=100;
StartY=100;
step =20;
drawPix();
resize(512,256);
}
//绘制图像
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<height;j=step+j)//按照步进值得间隔绘制横向的网格线
{
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)
{
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 *e)
{
QPainter painter;
painter.begin(this);
painter.drawPixmap(QPoint(0,0),*pix);
painter.end();
}
KeyEvent::~KeyEvent()
{
delete ui;
}
仅供个人学习记录