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

一、简介

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

二、运行图

(1)本程序运行如下图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。

2、画白色背景图

pix = new QPixmap(width,height);
pix->fill(Qt::white);
void KeyEvent::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    drawPix();
    painter.drawPixmap(QPoint(0,0),*pix);
}

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

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;
}       

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

4、控制移动

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键是移动到最右下脚。注意控制图标到达边框时的坐标。


5、窗口大小变化

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)本人思路有限,若有更好的设计建议,可发邮件沟通,在此先感谢!邮箱地址yang.ao@i-soft.com.cn。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乌托邦2号

博文不易,支持的请给予小小打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值