键盘事件的简单应用,通过键盘控制界面上图标的移动。参考的是书上的代码,主要是觉得有趣,修改了一些不足,并加入了随意拉大窗口的部分代码。
(1)本程序运行如下图1所示。
image.load(":/images/1.png"); QMatrix martix; martix.scale(0.5,0.5); image = image.transformed(martix); setMinimumSize(image.width(),image.height());通过QMatrix类缩小图标为原来的0.5。
pix = new QPixmap(width,height); pix->fill(Qt::white); void KeyEvent::paintEvent(QPaintEvent *) { QPainter painter(this); drawPix(); painter.drawPixmap(QPoint(0,0),*pix); }
void KeyEvent::drawPix() { pix->fill(Qt::white); QPainter *painter = new QPainter(pix); QPen pen(Qt::DotLine); painter->setPen(pen); for(int i=step;i<width;) { painter->drawLine(QPoint(i,0),QPoint(i,height)); i=i+step; } for(int j=step;j<height;) { painter->drawLine(QPoint(0,j),QPoint(width,j)); j=j+step; } painter->drawImage(QPoint(startX,startY),image); delete painter; }
分析:在背景图之上画虚线和小人图标,也可以在主窗口上绘制,这样背景图只是调整背景颜色值。但此时要注意:绘制顺序不能变,先背景图再虚线接着小人图标。
void KeyEvent::keyPressEvent(QKeyEvent *event) { if(event->modifiers() == Qt::ControlModifier) { if(event->key() == Qt::Key_Left) { startX=(startX-1<0)?startX:startX-1; } if(event->key() == Qt::Key_Right) { startX=(startX+1+image.width ()>width)?startX:startX+1; } if(event->key() == Qt::Key_Up) { startY=(startY-1<0)?startY:startY-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; } if(event->key() == Qt::Key_Home) { startX=0; startY=0; } if(event->key() == Qt::Key_End) { startX=width-image.width(); startY=height-image.height(); } } update(); }分析:按键事件的处理是程序的全部,CTRL+方向键是步进值+1的微形移动,不按CTRL键是加32的大步移动。Home键移动到0,0原点,End键是移动到最右下脚。注意控制图标到达边框时的坐标。
void KeyEvent::resizeEvent(QResizeEvent *event) { width=size().width(); height=size().height(); startX=(startX + image.width()>width)?width-image.width():startX; startY=(startY+image.height()>height)?height-image.height():startY; if (pix) { delete pix; pix = NULL; } pix = new QPixmap(width,height); update(); }分析:增加改变窗口的大小,重新绘画。主要考虑虚线的绘制位置的范围。
(1)代码比较简单,功能也很单一,如果有机会会进行更加全面的学习。
(2)源码已经打包上传到csdn上可登录下载(http://download.csdn.net/detail/taiyang1987912/7696511)。
(3)本人思路有限,若有更好的设计建议,可发邮件沟通,在此先感谢!邮箱地址[email protected]。