键盘事件处理

本文档详细介绍了使用Qt框架实现的一个键盘事件处理程序,通过监听特定键的按下,控制图像在窗口中的位置变化。它展示了如何利用QKeyEvent和图形绘制来实时响应用户的输入,实现了图形的动态移动和界面布局的灵活性。
摘要由CSDN通过智能技术生成

键盘事件

keyevent.h

#ifndef KEYEVENT_H
#define KEYEVENT_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class KeyEvent; }
QT_END_NAMESPACE

class KeyEvent : public QWidget
{
    Q_OBJECT

public:
    KeyEvent(QWidget *parent = nullptr);
    ~KeyEvent();
    void drawPix();

protected:
    void keyPressEvent(QKeyEvent *event) override;
    void paintEvent(QPaintEvent *event) override;

private:
    Ui::KeyEvent *ui;
    QPixmap *m_pix;
    QImage m_image;
    int m_startX;   //图标顶点位置
    int m_startY;
    int m_width;    //界面的宽度,高度
    int m_height;
    int m_step;     //步长
};
#endif // KEYEVENT_H

keyevent.cpp

#include "keyevent.h"
#include "ui_keyevent.h"
#include <QPainter>
#include <QPen>
#include <QKeyEvent>

KeyEvent::KeyEvent(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::KeyEvent)
{
    ui->setupUi(this);
    setWindowTitle(QString("键盘事件"));
    setAutoFillBackground(true);
    setFixedSize(512,256);
    m_width = size().width();
    m_height = size().height();

    m_pix = new QPixmap(m_width,m_height);
    m_pix->fill(Qt::white);

    m_image.load("tiger.png");

    m_startX = 100;
    m_startY = 100;
    m_step = 20;
    drawPix();
}

KeyEvent::~KeyEvent()
{
    delete ui;
}

void KeyEvent::drawPix()
{
    m_pix->fill(Qt::white);

    QPainter painter(this);
    QPen pen(Qt::DotLine);

    painter.begin(m_pix);//指定m_pix为绘图设备
    painter.setPen(pen);

    //按照步长画纵向网格线
    for(int i = m_step; i < m_width; i += m_step)
    {
        painter.drawLine(QPoint(i,0),QPoint(i,m_height));
    }

    //按照步长画水平网格线
    for(int j = m_step; j < m_height; j += m_step)
    {
        painter.drawLine(QPoint(0,j),QPoint(m_width,j));
    }
    painter.end();

    //画图片
    painter.begin(m_pix);
    painter.drawImage(QPoint(m_startX,m_startY),m_image);
    painter.end();
}

void KeyEvent::keyPressEvent(QKeyEvent *event)
{
    //按下Ctrl键,每次移动为1个像素
    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_height ? m_startY : m_startY + 1;
    }
    else//没有按下Ctrl键,每次移动为一个步长
    {
        //调整图标左上角位置到网格顶点上
        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_Right)
            m_startX = (m_startX + m_step + m_image.width()) > m_width ? m_startX : m_startX + 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_Down)
            m_startY = (m_startY + m_step + m_image.height()) > m_height ? m_startY : m_startY + m_step;
    }

    drawPix();//根据调整后的图标位置重新在m_pix上绘制图像
    update();//触发窗口重绘
}

void KeyEvent::paintEvent(QPaintEvent *event)
{
    QPainter painter;
    painter.begin(this);
    painter.drawPixmap(QPoint(0,0),*m_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();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Respect@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值