标签:
什么是Helloworld程序?
就是让应用程序显示“Hello World”字符串。这是最简单的应用,但却包含了一个应用程序的基本要素,所以一般使用它来演示程序的创建过程。在本节中要讲的就是在Qt Creator中创建一个图形用户界面的项目,来生成一个可以显示“Hello World”字符串的程序。
项目目录中的文件说明:
文件 说明 helloworld.pro 该文件是项目文件,其中包含了项目相关信息 helloworld.pro.user 该文件包含了与用户有关的项目信息 helloworld.h 该文件是新建的helloDialog类的头文件 helloworld.cpp 该文件是新建的helloDialog类的源文件 main.cpp 该文件包含了main()主函数 hellodialog.ui 该文件是设计师设计的界面对应的界面文件
程序运行:
可以使用快捷键Ctrl+R或者通过按下左下角的运行按钮来运行程序。
生成的文件:
现在项目目录中的文件可以发现,多了:build-helloworld-Desktop_Qt_5_5_1_MSVC2013_64bit-Debug文件夹,这是默认的构建目录。
QT Creator将项目源文件和编译生成的文件进行了分类存放。
helloworld文件夹是项目源文件。而build-helloworld-Desktop_Qt_5_5_1_MSVC2013_64bit-Debug文件夹存放的是编译后生成的文件。进入该文件夹可以看到里面有3个Makefile文件和一个ui_helloworld.h文件,还有两个目录debug和release。如下图:
现在release文件夹是空的,进入debug文件夹,这里还有3个.obj文件和一个.cpp文件,它们是编译时生成的中间文件,可以不必管它,而剩下的一个helloworld.exe文件便是生成的可执行文件。
程序的发布:
现在程序已经编译完成,那么怎么来发布它,让它在别人计算机上也能运行呢?
首先在QT Creator中对helloworld程序进行release版本的编译。在左下角的目标选择器(Target selector)中将构建目标设置为Release即可。如下图:
编译完成后,工程目录中新生成:build-helloworld-Desktop_Qt_5_5_1_MSVC2013_64bit-Release文件夹,进入release子文件夹目录中,已经生成了helloworld.exe文件。
新建一个文件夹,重命名为“我的第一个Qt程序”,然后将release文件夹中的helloworld.exe复制过来,再去Qt安装目录的bin目录(例如:C:\Qt\4.87.52\bin)中将mingwm10.dll、libgcc_s_dw2-1.dll、QtCore4.dll和QtGui4.dll这4个文件复制过来 。
现在整个文件夹一共有12MB,如果使用WinRAR等打包压缩软件对它进行压缩,就只有4MB了,已经到达了可以接受的程度,这时就可以将压缩包发布出去了。
提示:
若程序中使用了png以外格式的图片,在发布程序时就要将Qt安装目录下的plugins目录中的imageformats文件夹复制到发布程序文件夹中,其中只要保留自己用到的文件格式的dll文件即可。
例如用到了gif文件,那么只需要保留qgif4.dll。
而如果程序中使用了其他的模块,比如Phonon,那么就要将plugins目录中的phonon_backend文件夹复制过来。
静态编译:
静态编译是相对于前面讲到的动态编译而言的。因为就像前面看到的一样,在Qt Creator默认的情况下,编译的程序要想发布就需要包含dll文件,这种编译方式被称为动态编译。
而静态编译就是将Qt的库进行重新编译,用静态编译的Qt库来链接程序,这样生成的目标文件就可以直接运行,而不再需要dll文件的支持了。不过这样生成的exe文件也就很大了,有好几MB,而且静态编译缺乏灵活性,也不能够部署插件。
从前面的介绍可以看到,其实发布程序时带几个dll文件并不是很复杂的事情,而且如果要同时发布多个应用程序还可以共用dll文件,所以使用默认的方式就可以了。
想了解更多Qt发布的知识和静态编译的方法,可以在Qt Creator帮助的索引方式下查看Deploying Qt Applications关键字,Windows平台发布程序对应的关键字是Deploying an Application on Windows。
//引用头文件,头文件包含。在Qt中每一个类都有一个与其同名的头文件,因为后面用到了QApplication、QDialog和QLabel这3个类,所以这里要包含这些类的定义 #include "mainwindow.h" #include <QApplication> #include <QLabel> /*QT中头文件和类名是一致的。即如果你要使用某个类的话,它的类名就是它的头文件名*/ int main(int argc, char *argv[])//main()函数,它有两个参数,用来接收命令行参数。 { QApplication a(argc, argv);//[在QT程序中,该语句是必不可少的] //创建一个QApplication对象,这个对象用于管理应用程序级别的资源 //QApplication的构造函数要求两个参数,分别来自main的那两个参 //数,因此,Qt在一定程度上是支持命令行参数的。 QLabel *label = new QLabel("hello world!");//创建一个QLabel对象,并且能够显示hello world //字符串。和其他库的Label控件一样,这是用来显示文本的 label->show();//组件创建出来之后通常是不可见的,要求我们手动的使它们可见。在默认情况下,新建的可视部件对象都是不可见的,要使用show()函数让它们显示出来。 return a.exec();//将应用程序的控制权交还给QT.[在QT程序中,该语句是必不可少的].让QApplication对象进入事件循环,这样当Qt应用程序在运行时便可以接收产生的事件,例如单击和键盘按下等事件 } //我们并没有使用delete去删除创建的QLabel,因为在程序结束后操作系统会回 //收这个空间——这只是因为这个QLabel占用的内存比较小,但有时候这么做会引 //起麻烦的,特别是在大程序中,因此必须小心输出:
#include <QApplication> #include <QDialog> #include <QLabel> #include <QTextCodec> //QTextCodec类提供了文本编码的转换功能 int main(int argc, char *argv[]) { QApplication a(argc, argv); QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));//使用了QTextCodec类中的静态函数setCodecForTr(),用来设置QObject::tr()函 //数所要使用的字符集 QDialog w; QLabel label(&w); label.setText(QObject::tr("Hello World! 你好Qt!"));//为了能够显示中文,需要设置字符集,然后使用QObject::tr()函数将字符串进行编码转换 w.show(); return a.exec(); }
//setCodecForTr()函数最好的放置位置就是像程序中这样,放在main()函数中的QApplication对象下面。Qt程序中所有要显示到界面/ //上的字符串最好都使用tr()函数括起来,而对于不是要显示到界面上的字符串中如果包含了中文,可以使用QString()进行编码转换/ //,这需要在主函数中添加如下代码进行设置: // QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
qmake是Qt提供的一个编译工具,它可以生成与平台无关的.pro文件,然后利用该文件生成与平台相关的Makefile文件。Makefile文件中包含了要创建的目标文件或可执行文件、创建目标文件所依赖的文件和创建每个目标文件时需要运行的命令等信息。最后使用make命令来完成自动编译,make就是通过读入Makefile文件的内容来执行编译工作的。使用make命令时会为每一个源文件生成一个对应的.o目标文件,最后将这些目标文件进行链接来生成最终的可执行文件
#------------------------------------------------- # # Project created by QtCreator 2013-08-07T23:10:24 # #------------------------------------------------- QT += core gui greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = helloworld TEMPLATE = app SOURCES += main.cpp hellodialog.cpp HEADERS += hellodialog.h FORMS += hellodialog.ui RC_FILE += myico.rc
//第1~5行:注释信息,说明这个文件生成的时间。 //第6行:表明了这个项目使用的模块。core模块包含了Qt非图形用户界面的核心功能,其他所有模块都依赖于这个模块;而gui模块扩展了core模块的图形界 //面功能。也就是说,如果不需要设计图形界面的程序,那么只需要core模块就可以了,但是如果涉及图形界面,那么就必须包含gui模块。其实 //所谓的模块,就是很多相关类的集合,比如所有与图形界面有关的类都在gui模块中,读者可以在Qt帮助中查看QtCore Module和QtGui Module关 //键字。 //第7行:是为了和Qt5兼容添加的一行代码,表明如果是Qt5版本,就添加QT += widgets一行代码。 //第8行:是生成的目标文件的名称,就是生成的exe文件的名字,默认的是工程的名字,当然也可以在这里改为别的名字。 //第9行:使用app模板,表明这是个应用程序。 //第10,12和13行:分别是工程中包含的源文件、头文件和界面文件。 //第14行:就是添加的应用程序图标的文件。这里这些文件都使用了相对路径,因为都在项目目录中,所以只写了文件名。
标签:
原文地址:http://blog.csdn.net/xuyuqingfeng953/article/details/51470177