通过键盘控制图标的移动例子具体代码如下:
(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)运行结果如下图所示: