Chinaunix首页 | 论坛 | 博客
  • 博客访问: 494258
  • 博文数量: 144
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1190
  • 用 户 组: 普通用户
  • 注册时间: 2013-10-08 20:16
文章分类

全部博文(144)

文章存档

2017年(1)

2015年(5)

2014年(108)

2013年(30)

我的朋友

分类: C/C++

2014-09-29 20:24:25

http://blog.csdn.net/luckywang1103/article/details/8294994
qt学习也快一个月了,最近想做一个有趣的程序。效果是这样的:通过定时器连续显示几幅图片,串联起来看像是动的一样,我在网上找了几幅关于小鸡破壳而出那个有趣的场景,然后通过程序实现效果就是小鸡破壳而出。

五张图片如下:

程序主要代码如下:

#include "shapewidget.h"
#include 
#include 
#include 
#include 
ShapeWidget::ShapeWidget(QWidget *parent) : QWidget(parent)//构造函数的时候显示第一幅图片,并打开定时器
{
 pix=new QPixmap();
 pix->load(":/images/p1.png",0,Qt::AvoidDither|Qt::ThresholdDither|Qt::ThresholdAlphaDither);
 resize(pix->size());
 setMask(QBitmap(pix->mask()));
 count=1;
 timer=new QTimer(this);
 timer->start(500);
 connect(timer,SIGNAL(timeout()),this,SLOT(changePicture()));//定时器溢出关联changePicture()函数
}
ShapeWidget::~ShapeWidget()
{
}
void ShapeWidget::changePicture()//使用switch语句根据情况选择不同的图片
{
 QString picName;
 count=count+1;
 if(count>5) count=1;
 switch(count)
 {
 case 1:picName=":/images/p1.png";break;
 case 2:picName=":/images/p2.png";break;
 case 3:picName=":/images/p3.png";break;
 case 4:picName=":/images/p4.png";break;
 case 5:picName=":/images/p5.png";break;
 default:break;
 }
 pix->load(picName,0,Qt::AvoidDither|Qt::ThresholdDither|Qt::ThresholdAlphaDither);
 resize(pix->size());
 setMask(QBitmap(pix->mask()));//setMask()函数,图片之外透明部分都不显示
 update(); //这句话还是挺重要的,不加和加有很大的区别
}
void ShapeWidget::mousePressEvent(QMouseEvent *event)
{
 if(event->button()==Qt::LeftButton)
 {
 dragPosition =event->globalPos()-frameGeometry().topLeft();
 event->accept();
 }
 if(event->button()==Qt::RightButton)
 {
 close();
 }
}
void ShapeWidget::mouseMoveEvent(QMouseEvent *event)
{
 if(event->buttons()&Qt::LeftButton)
 {
 move(event->globalPos()-dragPosition);
 event->accept();
 }
}
void ShapeWidget::paintEvent(QPaintEvent *event)
{
 QPainter painter(this);
 painter.drawPixmap(0,0,*pix);
}

遇到的问题:

1、图片背景改为透明:

从网上 下载的图片背景是白色的,于是用setMask()函数也没用,结果还是会将白色的背景显示出来,于是我用了可牛软件抠图的方法将图片中的对象截取出来 了,保存一下为png结尾的文件,呵呵,小鸡的背景终于是透明的了,这下在程序里面可以用setMask()函数了,除了小鸡显示之外,其他窗体、背景什 么都不会显示。

2、资源文件的添加:

文件-->新建文件或工程-->左下边选择Qt,右边选择Qt资源文件-->取名res,生成一个.qrc文件

在当前工程文件夹下添加图片资源/images/*.png之类的

然后你在这个资源文件里面添加前缀,之后添加文件。(前缀改为/,表示.qrc文件的当前目录,如需要引用images/p1.png采用":/images/p1.png")

资源文件的好处是你编译生成的可执行程序运行时不再需要那些图片资源文件。因为已经被编译成二进制编进可执行程序里面了

3、生成.exe文件更换图标

首先当然要准备一个.ico图标文件(假定为desktopIcon.ico,像素16*16,最好本身就是.icon结尾的文件,若不是,编译会提示找不到文件的错误),将其复制到工程目录当中(.pro文件所在的目录)。
然后在QT Creator中Ctrl+N或 File - New File or Project,选择General中的Text File,名称填写为.rc文件(如deskicon.rc),在里面只用写一行:

IDI_ICON1ICONDISCARDABLE"desktopIcon.ico"

编辑.pro文件,里面应该有:OTHER_FILES+= \ qtdemo.rc在其下再添加一行(如果没有上面的内容也没事):
 RC_FILE = deskicon.rc
最后编译一下就好了,新生成的exe文件的图标就会变成desktopIcon.ico的样子

4、Qt应用程序发布

首先需要以release方式编译应用程序,将编译好的程序文件复制到发布文件夹。 
其次将以下动态链接库复制到发布文件夹中:mingwm10.dll、QtCore4.dll、QtGui4.dll。可以从“Qt安装目录\qt\bin”下面找到它们。 
如果用到了其他功能,如OpenGL,则需要将QtOpenGL4.dll也复制到发布文件夹中。 
如 果应用程序有访问数据库的功能,则不仅要将QtSql4.dll复制到发布文件夹,而且还需要将对应的数据库驱动程序(同样也是dll)复制过来,放到 “发布文件夹\sqldrivers”目录下面。可以从可以从“Qt安装目录\qt\plugins\sqldrivers”下面找到它们,如 qsqlite4.dll。 
如果应用程序含有中文,还需要在发布文件夹下面建立codecs目录,并将“Qt安装目录\qt\plugins\codecs”目录下面的qcncodecs4.dll复制过来。 
对于其他以插件方式提供的功能,如imageformats,也需要像上面的方式将所有需要的dll复制过来。 

我这里引用了C:\Qt\4.7.4\bin文件夹下的mingwm10.dll、QtCore4.dll、QtGui4.dll,后来发现还是缺少libgcc_s_dw2-1.dll,于是再到C:\Qt\4.7.4\bin下将这个链接库复制出来。最后发布程序,OK!

程序下载地址:


阅读(3860) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~