头文件
#ifndef KEYEVENT_H
#define KEYEVENT_H
#include <QWidget>
namespace Ui {
class KeyEvent;
}
class KeyEvent : public QWidget
{
Q_OBJECT
public:
explicit KeyEvent(QWidget *parent = 0);
~KeyEvent();
void drawPix();
protected:
void keyPressEvent(QKeyEvent *event) override;
void paintEvent(QPaintEvent *event) override;
private:
Ui::KeyEvent *ui;
QPixmap* m_pixmap; //绘图
QImage m_image;
int m_startX; //图标顶点位置
int m_startY;
int m_width; //界面宽度 高度
int m_height;
int m_step; //步长
};
#endif // KEYEVENT_H
.cpp
#include "keyevent.h"
#include "ui_keyevent.h"
#include <QPen> //笔
#include <QPainter> //画家
#include <QKeyEvent>
KeyEvent::KeyEvent(QWidget *parent) :
QWidget(parent),
ui(new Ui::KeyEvent)
{
ui->setupUi(this);
setWindowTitle("键盘事件");
setAutoFillBackground(true); //自动填充背景图
setFixedSize(900,900); //固定窗口固定高和宽
m_width = size().width();
m_height =size().height();
m_pixmap = new QPixmap(m_width,m_height);
m_pixmap->fill(Qt::white);
m_image.load("11.png"); //加载
m_startX = 100;
m_startY = 100;
m_step = 20;
drawPix();
}
KeyEvent::~KeyEvent()
{
delete ui;
}
void KeyEvent::drawPix()
{
m_pixmap->fill(Qt::white); //填充背景色
QPainter painter(this);
QPen pen(Qt::DotLine); //笔 虚线
painter.begin(m_pixmap); //指定m_pix为绘图设备 开始画图
painter.setPen(pen); //设置画笔
//按照布长画纵向网格线
for(int i= m_step;i<m_width;i +=m_step){
painter.begin(m_pixmap);//指定m_pix为绘图设备
painter.setPen(pen);
painter.drawLine(QPoint(i,0),QPoint(i,m_height)); //画直线
painter.end();
}
//按照步长画水平网格线
for(int j=m_step;j< m_height;j+=m_step){
painter.begin(m_pixmap);//指定m_pix为绘图设备
painter.setPen(pen);
painter.drawLine(QPoint(0,j),QPoint(m_width,j));
painter.end();
}
//画图片
painter.begin(m_pixmap); //开始画图
painter.drawImage(QPoint(m_startX,m_startY),m_image); //画图片
painter.end(); //结束画图
}
void KeyEvent::keyPressEvent(QKeyEvent *event)
{
//按下Ctel 键 每次移动1
//当我们按下修饰键 == CTRL
if(event->modifiers() == Qt::ControlModifier){
if(event->key() == Qt::Key_Left)
m_startX = (m_startX-1) < 0 ? m_startX:m_startX-1;
if(event->key() == Qt::Key_Right)
m_startX = (m_startX+1+m_image.width()) >m_width ?m_startX:m_startX+1;
if(event->key() == Qt::Key_Up)
m_startY = (m_startY-1) < 0? m_startY:m_startY-1;
if(event->key() == Qt::Key_Down)
m_startY = (m_startY+1+m_image.height()) >m_width?m_startY:m_startY+1;
}else{//没有按下
//调整图标左上角位置到网格顶点
m_startX = m_startX - m_startX % m_step;
m_startY = m_startY - m_startY % m_step;
if(event->key() == Qt::Key_Left)
m_startX = (m_startX - m_step)< 0 ? m_startX :m_startX-m_step;
if(event->key() == Qt::Key_Down)
m_startY = (m_startY+m_step) >m_image.height() ? m_startY :m_startY+m_step;
if(event->key() == Qt::Key_Up)
m_startY = (m_startY-m_step) < 0 ? m_startY:m_startY-m_step;
if(event->key() == Qt::Key_Right)
m_startX = (m_startX+m_step) > m_image.width() ? m_startX :m_startX+m_step;
}
drawPix(); //根据调整后的图标位置重新再m_pix上绘制图像
update();//触发窗口重绘
}
void KeyEvent::paintEvent(QPaintEvent *event)
{
QPainter painter; //绘图
painter.begin(this); //开始绘图
painter.drawPixmap(QPoint(0,0),*m_pixmap); //画图片
painter.end(); //结束画图
}
QPaintr 画家
QPen 画笔
begin() 开始
drawLine 画直线
drawImage(QPoint(x,y),*img) 画图片
end() 结束
drawPix(); //根据调整后的图标位置重新再m_pix上绘制图像
update();//触发窗口重绘
画虚线:
-
定义画家
-
定义画笔(设置样式) Qt::DotLine
-
画家开始
-
画家设置画笔
-
画直线
-
结束
***奇牛***