Qt:键盘事件

头文件

#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();//触发窗口重绘

画虚线:

  1. 定义画家

  2. 定义画笔(设置样式) Qt::DotLine

  3. 画家开始

  4. 画家设置画笔

  5. 画直线

  6. 结束

                                                                           ***奇牛***
    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值