QT5.7 实战项目 键盘事件的触发

1.keyevent.h

#ifndef KEYEVENT_H
#define KEYEVENT_H

#include <QWidget>
#include <QKeyEvent>
#include <QPaintEvent>

class KeyEvent : public QWidget
{
    Q_OBJECT
public:
    explicit 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;       //网格的大小,即移动的步进值
signals:

public slots:
};

#endif // KEYEVENT_H

2.keyevent.cpp

#include "keyevent.h"
#include <QPainter>
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("C:/Qt/qt_salman/keyEvent/image/image.png");
    startX=100;
    startY=100;

    step=20;
    drawPix();

    resize(512,256);
}

KeyEvent::~KeyEvent()
{

}

void KeyEvent::drawPix()
{
    pix->fill(Qt::white);   //重新刷新pix对象为白色底色
    QPainter *painter=new QPainter; //创建一个QPainter对象,并指定pix为绘图设备
    QPen pen(Qt::DotLine);     //创建一个QPen对象,设置画笔的线型为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=j+step)       //按照步进值的间隔绘制横向的网格线
    {
        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);  //在pix对象中绘制可移动的小图标
    painter->end();
}
//处理键盘的按下事件
/*if(event->modifiers()==Qt::ControlModifier):判断修饰键【ctrl】是否按下
 * Qt::KeyboardModifier:定义了一系列修饰键
 * Qt::NoModifier:没有修饰键按下
 * Qt::shiftModifier:【shift】键按下
 * Qt::ControModifier:【Ctrl】键按下
 * Qt::AltModifer:【Alt】键按下
 * Qt::MetadModifer::Meta键按下
 * Qt::KeypadModifiter:小键盘按键按下
 * Qt::GroupSwitchModifer:Mode switch键按下
 */
//
void KeyEvent::keyPressEvent(QKeyEvent *event)
{
    if(event->modifiers()==Qt::ControlModifier)   //判断修饰键【ctrl】是否按下
    {
        if(event->key()==Qt::Key_Left)  //根据按下的左方向键调节图标的左上顶点的位置,步进值为1,即细微移动
        {
            startX=(startX-1<0)?startX:startX-1;
        }
        if(event->key()==Qt::Key_Right) //根据按下的右方向键调节图标的左上顶点的位置,步进值为1,即细微移动
        {
            startX=(startX+1+image.width()>width)?startX:startX+1;
        }
        if(event->key()==Qt::Key_Up)    //根据按下的上方向键调节图标的左上顶点的位置,步进值为1,即细微移动
        {
            startY=(startY-1<0)?startY:startY-1;
        }
        if(event->key()==Qt::Key_Down)  //根据按下的下方向键调节图标的左上顶点的位置,步进值为1,即细微移动
        {
            startY=(startY+1+image.height()>height)?startY:startY+1;
        }
    }
    else        //对【ctrl】键没有按下的处理
    {
        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) //表示如下按下【home】键则重新复位图标位置为界面的左上顶点
        {
            startX=0;
            startY=0;
        }
        if(event->key()==Qt::Key_End)   //表示如果按下【end】键则将图标位置置为界面的右下顶点,这里需要考虑图标自身的大小
        {
            startX=width-image.width();
            startY=height-image.height();
        }
    }
    drawPix();  //根据调整后的图标位置重新在pix中绘制图像
    update();   //触发界面重画
}

void KeyEvent::paintEvent(QPaintEvent *)
{
    QPainter painter;
    painter.begin(this);
    painter.drawPixmap(QPoint(0,0),*pix);
    painter.end();
}





3.main.cpp

#include "keyevent.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    KeyEvent w;
    w.show();

    return a.exec();
}
发布了177 篇原创文章 · 获赞 5 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/aa804738534/article/details/104730224
今日推荐