• Qt5开发从入门到精通——第十一篇二节(Qt5 事件处理及实例——键盘事件及实例)


    提示:欢迎小伙伴的点评✨✨,相互学习c/c++应用开发。🍳🍳🍳
    博主🧑🧑 本着开源的精神交流Qt开发的经验、将持续更新续章,为社区贡献博主自身的开源精神👩‍🚀


    前言

    本章节会给大家带来Qt5 事件处理及实例——键盘事件及实例详解。

    一、键盘事件及实例概述

    在图像处理和游戏应用程序中,有时需要通过键盘控制某个对象的移动,此功能可以通过对键盘事件的处理来实现。键盘事件的获取是通过重定义 QWidget 类的 keyPressEvent()和keyReleaseEvent()来实现的。

    二、效果实例

    通过键盘的上(↑)、下(↓)、左(←)、右(→)方向键可以控制图标的移动,移动的步进值为网格的大小,如果同时按下 Ctrl 键,则实现细微移动;若按下 Home (←)键,则光标回到界面的左上顶点;若按下End (→)键,则光标到达界面的右下顶点。
    新建Resources 并建立image文件将tu.png图片放入其中
    图一
    在这里插入图片描述
    图二
    在这里插入图片描述

    三、原码实例

    keyevent.h

    #ifndef KEYEVENT_H
    #define KEYEVENT_H
    
    #include 
    #include 
    #include 
    
    class KeyEvent : public QWidget
    {
        Q_OBJECT
    
    public:
        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;      //网格的大小,即移动的步进值
    
    };
    
    #endif // KEYEVENT_H
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    keyevent.cpp

    #include "keyevent.h"
    #include 
    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(":/src/tu.png");
        startX=100;
        startY=100;
        step=20;
        drawPix();
        resize(512,256);
    }
    
    KeyEvent::~KeyEvent()
    {
    
    }
    /*drawPix()函数实现了在 QPixmap 对象上绘制图像*/
    void KeyEvent::drawPix()
    {
        pix->fill (Qt::white); //重新刷新 pix 对象为白色底色
        QPainter *painter = new QPainter; //创建一个 QPainter 对象
        QPen pen (Qt::DotLine); /*创建一个 QPen 对象,设置画笔的线型为 Qt::DotLine, 用千绘制网格。*/
    
        for(int i=step;i<width;i=i+step)
        {
            painter->begin(pix); //指定 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 对象中绘制可移动的小图标。
                                                          *keyPressEvent() 函数处理键盘的按下事件
                                                          */
        painter->end();
    }
    
    void KeyEvent::keyPressEvent(QKeyEvent *event)
    {
        /*判断修饰键 Ctrl 是否按下。
         * Qt::Keyboard Modifier 定义了一系列修饰键;
         *  • Qt::NoModifier: 没有修饰键按下。
            • Qt::ShiftModifier: Shift 键按下。
            • Qt::ControlModifier: Ctrl 键按下。
            • Qt::AltModifier: Alt 键按下。
            • Qt::MetaModifier: Meta 键按下。
            • Qt::KeypadModifier: 小键盘按键按下。
            • Qt::GroupSwitchModifier: Mode switch 键按下。
        */
        if(event->modifiers()==Qt::ControlModifier)
        {
            /*根据按下的左方向键调节图标的左上顶点的位置,步进值为 1, 即细微移动。*/
            if(event->key()==Qt::Key_Left)
            {
                startX= (startX-1<0) ?startX:startX-1;
            }
            /*根据按下的右方向键调节图标的左上顶点的位置,步进值为 1, 即细微移动。*/
            if (event->key ()==Qt::Key_Right)
            {
                startX= (startX+1+image.width()>width)?startX:startX+1;
            }
            /*根据按下的上方向键调节图标的左上顶点的位置,步进值为 1, 即细微移动。*/
            if (event->key()==Qt::Key_Up)
            {
                startY=(startY-1<0)?startY:startY-1;
            }
            /*根据按下的下方向键调节图标的左上顶点的位置,步进值为 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;
            }
            /*表示如果按下 Home 键,则恢复图标位置为界面的左上顶点。*/
            if (event->key() ==Qt::Key_Home)
            {
                startX=0;
                startY=0;
            }
            /*表示如果按下 End 键,则将图标位置设置为界面的右下顶点,这里注意需要考虑图标自身的大小。*/
            if (event->key()==Qt::Key_End)
            {
                startX=width-image.width();
                startY=height-image.height();
            }
        }
        drawPix(); //根据调整后的图标位置重新在 pix 中绘制图像
        update();  //触发界面重画
    }
    /*界面重绘函数 paintEvent(), 将 pix 绘制在界面上。*/
    void KeyEvent::paintEvent(QPaintEvent *)
    {
        QPainter painter;
        painter.begin(this);
        painter.drawPixmap(QPoint(0,0),*pix);
        painter.end();
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145

    main.cpp

    #include "keyevent.h"
    #include 
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        KeyEvent w;
        w.show();
    
        return a.exec();
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    四、总结

    Qt5 事件处理及实例——键盘事件及实例会在应用程序开发中经常用到的。

  • 相关阅读:
    Dynamics 365 Marketing自定义渠道的步骤
    在VS Code中进行Java的单元测试
    七周成为数据分析师 | 数据分析思维
    docker学习笔记
    JavaScript严格模式
    Mysql 45讲学习笔记(三十一)误删数据
    C#编程学习
    169-Rust和Solana环境配置
    对比分析小游戏引擎孰优孰劣
    Java经典300例-基础篇-001:Hello Kitty
  • 原文地址:https://blog.csdn.net/weixin_44759598/article/details/127941897