QT学习:键盘事件

这篇博客介绍了一个使用Qt实现的示例,通过键盘事件控制图像在窗口中的移动。程序包括了图像的加载、网格绘制以及根据键盘输入(如方向键、Ctrl键)调整图像位置的功能。代码中详细展示了关键函数如`keyPressEvent`、`paintEvent`和`drawPix`的实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通过键盘控制图标的移动例子具体代码如下:
(1)头文件“keyevent.h”的具体内容如下:

#include <QWidget> 
#include <QKeyEvent> 
#include <QPaintEvent> 
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; //网格的大小,即移动的步进值 
}; 

(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("../image/image.png"); 
startX=100; 
startY=100; 
step=20; 
drawPix(); 
resize(512,256); 
} 

(3)在项目工程所在目录下新建一个文件夹并命名为image,
在文件夹内保存一个名为“image.png”的图片;在项目中按照以下步骤添加资源文件。
① 在项目名“KeyEvent”上单击鼠标右键→“添加新文件…”菜单项,在如下图所示的对话框中单击
“Qt”(模板)→“Qt Resource File”→“Choose…”按钮。。
在这里插入图片描述
② 在弹出的对话框中选择资源要存放的路径,如下图所示:
在这里插入图片描述

在“名称”栏中填写资源名称 “keyevent”。 单击“下一步”按钮,单击“完成”按钮。此时,项目下自动添加了一个“keyevent.qrc”资源文件。如下图所示:
在这里插入图片描述
③ 鼠标右击资源文件,选择“Add Prefix…”菜单项,在弹出的“Add Prefix”对话框的“Prefix:”栏中填写“/new/prefix1”,单击“OK”按钮,此时项目目录树右区资源文件下新增了一个“/new/prefix1”子目录 项,单击该区下方“添加”按钮上的 ,选择“添加文件”,按照如下图所示的步骤操作,在弹出的对话框中选择“image/image.png”文件,单击“打开”按钮,将该图片添加到项目中。
在这里插入图片描述
(4)drawPix()函数实现了在QPixmap对象上绘制图像,其具体代码如下:

void KeyEvent::drawPix() 
{ 
pix->fill(Qt::white); //重新刷新pix对象为白色底色 
QPainter *painter = new QPainter; //创建一个QPainter对象 
QPen pen(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); //(b) 
painter->end(); 
} 

keyPressEvent()函数处理键盘的按下事件,具体代码如下:

void KeyEvent::keyPressEvent(QKeyEvent *event)
{
    if(event->modifiers()==Qt::ControlModifier)		//判断修饰键Ctrl是否按下。Qt:: KeyboardModifier定义了 一系列修饰键
    {
        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();		//触发界面重画
}

界面重画函数paintEvent(),将pix绘制在界面上。其具体代码如下:

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

(5)运行结果如下图所示:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值