Qt浅谈之十五:键盘控制移动

来源:互联网 发布:易语言端口转发源码 编辑:程序博客网 时间:2024/06/07 03:51

一、简介

       键盘事件的简单应用,通过键盘控制界面上图标的移动。参考的是书上的代码,主要是觉得有趣,修改了一些不足,并加入了随意拉大窗口的部分代码。

二、运行图

(1)本程序运行如下图1所示。


三、详解

1、缩放图标

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1.  image.load(":/images/1.png");  
  2.  QMatrix martix;  
  3.  martix.scale(0.5,0.5);  
  4.  image = image.transformed(martix);  
  5.  setMinimumSize(image.width(),image.height());  
通过QMatrix类缩小图标为原来的0.5。

2、画白色背景图

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. pix = new QPixmap(width,height);  
  2. pix->fill(Qt::white);  
  3. void KeyEvent::paintEvent(QPaintEvent *)  
  4. {  
  5.     QPainter painter(this);  
  6.     drawPix();  
  7.     painter.drawPixmap(QPoint(0,0),*pix);  
  8. }  

3、在背景图上画虚线表格

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. void KeyEvent::drawPix()  
  2. {  
  3.     pix->fill(Qt::white);  
  4.     QPainter *painter = new QPainter(pix);  
  5.     QPen pen(Qt::DotLine);  
  6.     painter->setPen(pen);  
  7.     for(int i=step;i<width;)  
  8.     {  
  9.         painter->drawLine(QPoint(i,0),QPoint(i,height));  
  10.         i=i+step;  
  11.     }  
  12.     for(int j=step;j<height;)  
  13.     {  
  14.         painter->drawLine(QPoint(0,j),QPoint(width,j));  
  15.         j=j+step;  
  16.     }  
  17.     painter->drawImage(QPoint(startX,startY),image);  
  18.     delete painter;  
  19. }         

       分析:在背景图之上画虚线和小人图标,也可以在主窗口上绘制,这样背景图只是调整背景颜色值。但此时要注意:绘制顺序不能变,先背景图再虚线接着小人图标。

4、控制移动

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. void KeyEvent::keyPressEvent(QKeyEvent *event)  
  2. {  
  3.     if(event->modifiers() == Qt::ControlModifier)  
  4.     {  
  5.         if(event->key() == Qt::Key_Left)  
  6.         {  
  7.             startX=(startX-1<0)?startX:startX-1;  
  8.               
  9.         }  
  10.         if(event->key() == Qt::Key_Right)  
  11.         {  
  12.             startX=(startX+1+image.width ()>width)?startX:startX+1;  
  13.               
  14.         }  
  15.         if(event->key() == Qt::Key_Up)  
  16.         {  
  17.             startY=(startY-1<0)?startY:startY-1;  
  18.               
  19.         }     
  20.         if(event->key() == Qt::Key_Down)  
  21.         {  
  22.             startY=(startY+1+image.height()>height)?startY:startY+1;  
  23.               
  24.         }         
  25.     }  
  26.     else  
  27.     {  
  28.         startX=startX-startX%step;  
  29.         startY=startY-startY%step;  
  30.           
  31.         if(event->key() == Qt::Key_Left)  
  32.         {  
  33.             startX=(startX-step<0)?startX:startX-step;         
  34.         }  
  35.         if(event->key() == Qt::Key_Right)  
  36.         {  
  37.             startX=(startX+step+image.width()>width)?startX:startX+step;       
  38.         }  
  39.         if(event->key() == Qt::Key_Up)  
  40.         {  
  41.             startY=(startY-step<0)?startY:startY-step;         
  42.         }     
  43.         if(event->key() == Qt::Key_Down)  
  44.         {  
  45.             startY=(startY+step+image.height()>height)?startY:startY+step;  
  46.         }         
  47.         if(event->key() == Qt::Key_Home)  
  48.         {  
  49.             startX=0;  
  50.             startY=0;  
  51.         }     
  52.         if(event->key() == Qt::Key_End)  
  53.         {  
  54.             startX=width-image.width();  
  55.             startY=height-image.height();  
  56.         }             
  57.     }  
  58.     update();  
  59. }          
      分析:按键事件的处理是程序的全部,CTRL+方向键是步进值+1的微形移动,不按CTRL键是加32的大步移动。Home键移动到0,0原点,End键是移动到最右下脚。注意控制图标到达边框时的坐标。


5、窗口大小变化

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. void KeyEvent::resizeEvent(QResizeEvent *event)  
  2. {  
  3.     width=size().width();  
  4.     height=size().height();  
  5.     startX=(startX + image.width()>width)?width-image.width():startX;  
  6.     startY=(startY+image.height()>height)?height-image.height():startY;  
  7.     if (pix) {  
  8.         delete pix;  
  9.         pix = NULL;  
  10.     }  
  11.     pix = new QPixmap(width,height);  
  12.     update();  
  13. }  
分析:增加改变窗口的大小,重新绘画。主要考虑虚线的绘制位置的范围。

0 0
原创粉丝点击