Qt的初步研究
目录
一、Qt基本情况的介绍... 3
1、历史... 3
2、基本介绍... 3
二、Qt开发准备... 4
1、Qt的开发环境及搭建... 4
1.1、开发环境... 4
1.2、Qt Library + Qt Creator. 4
1.2.1、安装包... 4
1.2.2、安装... 5
1.2.3、配置... 6
1.2.4、新建项目... 13
1.2.5、编译测试... 17
1.3、VS+Qt插件(还有问题没解决)... 17
1.3.1、安装包... 17
1.3.2、安装... 18
1.3.3、配置... 18
1.3.4、新建项目... 22
1.3.5、编译测试(编译没通过,可能配置不正确)... 24
1.4、小结... 26
2、系统库的使用及程序发布... 26
2.1、系统API的使用... 26
2.2、库的添加... 27
2.2.1、只对本项目起作用的库的添加... 27
2.2.2、公共库的添加(测试没通过)... 30
2.3、静态编译与动态编译(静态编译没实践检验)... 31
3、静态库和动态库... 31
3.1、静态库的创建和使用... 32
3.1.1、静态库的创建... 32
3.1.2、静态库的使用... 36
3.2、动态库的创建和使用... 39
3.2.1、动态库的创建... 39
3.2.2、动态库的使用... 41
3.3、小结... 43
4、Qt程序的跨平台移植... 44
4.1、Qt的跨平台... 44
4.2、移植方法... 44
4.3、移植时应注意的问题... 44
5、版本不兼容常见问题... 45
三、Qt界面库基本的开发过程,基本的控件... 45
1、 helloworld例子... 46
2、可视化编程介绍... 52
3、常用控件的常见接口... 54
1.1、Layouts和spacers. 54
1.2、label ----静态文本框... 55
1.3、PushButton----按钮... 55
1.4、CheckBox----复选框... 56
1.5、listWidget----列表... 56
1.6、tableWidget----表格... 57
1.7、treeWidget----树... 57
1.8、progressBar----进度条... 58
1.9、comboBox----组合下拉框... 59
1.10 QmessageBox----消息提示盒... 59
1.11 QFileDialog----文件选择框... 61
1.12 QSystemTrayIcon----托盘类... 63
1.13 QThread----线程类... 63
1.14 线程和信号-槽用法举例... 64
四、QtWebkit的使用... 65
HaavardNord和Eirik Chambe-Eng于1991年开始开发"Qt",1994年3月4日创立公司,最早名为Quasar Technologies,然后更名为Troll Tech,然后再改为Trolltech,中文名是“奇趣科技”,2008年6月17日被NOKIA公司收购,以增强该公司在跨平台软件研发方面的实力,更名Qt Software。
该工具包名为Qt是因为字母Q在Haavard的Emacs字体特别漂亮,而“t”代表“toolkit”,灵感来自Xt,X toolkit。
2009年5月11日,诺基亚Qt Software宣布Qt源代码管理系统面向公众开放,Qt开发人员可通过为Qt以及与 Qt相关的项目贡献代码、翻译、示例以及其他内容,协助引导和塑造Qt未来的发展。为了便于这些内容的管理,Qt Software启用了基于Git和Gitorious开源项目的Web源代码管理系统。
在推出开放式Qt代码库的同时,Qt Software在其网站发布了其产品规划(Roadmap)。其中概述了研发项目中的最新功能,展现了现阶段对Qt 未来发展方向的观点,以期鼓励社区提供反馈和贡献代码,共同引导和塑造Qt的未来。 2012年8月9日,Digia宣布已完成对诺基亚Qt业务及软件技术的全面收购,并计划将Qt应用到Android、iOS及Windows 8平台上。
平台的C++应用程序开发框架。广泛用于开发GUI程序,这种情况下又被称为部件工具箱。也可用于开发非GUI程序,比如控制台工具和服务器。Qt使用于OPIE、Skype、VLC mediaplayer、Adobe Photoshop Elements、VirtualBox 与 Mathematica以及被Autodesk、欧洲空间局、梦工厂、Google、HP、KDE、卢卡斯影业、西门子公司、富豪集团, 华特迪士尼动画制作公司、三星集团、飞利浦、Panasonic所使用。
它是诺基亚(Nokia)的Qt Development Frameworks部门的产品。Qt使用标准的C++。通过语言绑定,其他的编程语言也可以使用Qt。
Qt是自由且开放源代码的软件,在GNU较宽松公共许可证条款下发布。所有版本都支持广泛的编译器,包括GCC的C++编译器和Visual Studio。
维基百科:http://zh.wikipedia.org/zh-cn/Qt
浅析 Qt 界面库:http://mobile.51cto.com/symbian-270393.htm
Qt官网:http://qt.digia.com/
http://download.qt-project.org/archive/
Qt 项目:http://qt-project.org
Qt开发者社区:http://qt.csdn.net/
本部分是基于Qt5.0,1进行研究的,期间会偶有提及Qt5.0.2的一些功能更新。
(1)各平台常用开发环境
1、windows: QtLibrary + Qt Creator
QtLibrary + VS200X(X = 5,8,10…)
2、linux: Qt Library + Qt Creator
3、mac: Qt Library + Qt Creator
(2) Qt Library是一个Qt库,包含编译器,各种链接库。
(3) Qt Creator 是一款跨平台的集成开发环境(Qt IDE),特别针对Qt开发者,是Qt SDK组成的一部分,可运行于Windows, Linux/X11 and Mac OS X等桌面操作系统,允许开发者为多桌面环境及移动设备平台创建应用程序。它包括一个可视化侦错工具和整合的 GUI 版面和外形设计师。这个编辑器的功能包括语法高亮度显示和自动完成。Qt Creator 在 Linux 上,使用 GCC 的 C++ 编译器。在 Windows,默认安装它可以使用 MinGW 或 MSVC。从源代码编译时,也可以使用 cdb。
Qt Library + VS200X对VS老用户用起来更顺手,Qt Library + Qt Creator更适合跨平台开发,因为Qt Creator就是一个跨平台的开发工具。
(1)常用系统对应的安装包
集成包:(QtLibrary + Qt Creator)
· Linux 32-bit:Qt 5.0.1 for Linux 32-bit (388 MB)
· Linux 64-bit:Qt 5.0.1 for Linux 64-bit (388 MB)
· Mac 64-bit: Qt 5.0.1 for Mac (398 MB)
· Mac 32-bit: Mac OS X 10.0以后的系统均为64bit的,Qt 5.0.1没有32bit的
· Win32:Qt 5.0.1 for Windows 32-bit (MinGW 4.7,823 MB)
· Win32:Qt 5.0.1 for Windows 32-bit (VS 2010, 481MB)
Win64:5.0.2开始发布64bit版本Qt 5.0.2 for Windows 64-bit (VS 2012, 500 MB)
以上是时至2013年4月2日最新的Qt安装包,想了解最新安装包信息请到http://qt-project.org/downloads 查看。
4月11日发布了5.0.2版本,增加了两个安装包:
· Qt5.0.2 for Windows 32-bit (VS 2010, OpenGL, 476 MB)
· Qt5.0.2 for Windows 64-bit (VS 2012, 500 MB)
(2)关于安装包的说明
1、选包建议
建议多少位的系统就安装多少位的安装包,要开发多少位的程序就在多少位的系统上开发,这也有利于程序的调试。Qt Creator的宗旨就是方便跨平台和跨系统,所以程序从32位迁移到64位也应当不会很复杂,大概是源代码的重新编译吧。(详细报告见《Qt安装及编译测试错误报告4_12.docx》)
2、win32下MinGW包和Msvc包的区别
MinGW(Minimalist GNU for Windows),又称mingw32,是将GCC编译器和GNUBinutils移植到Win32平台下的产物,包括一系列头文件(Win32API)、库和可执行文件。另有mingw64系列工具,是用于产生64位Windows可执行文件的GNU交叉编译器。对于C语言之外的语言,MinGW使用标准的GNU运行库,如C++使用GNU libstdc++。但是MinGW使用Windows中的C运行库。因此用MinGW开发的程序不需要额外的第三方DLL支持就可以直接在Windows下运行,而且也不一定必须遵从GPL许可证。这同时造成了MinGW开发的程序只能使用Win32API和跨平台的第三方库,而缺少POSIX支持,大多数GNU软件无法在不修改源代码的情况下用MinGW编译。
Msvc:Microsoft Visual C++的简称。
MinGW安装包自带MinGW 32bit编译器,对系统的依赖程度较低;Msvc包不带编译器,使用的是MSVC编译器,要求系统安装VS2010或以上版本,安装包较小。所以这两个安装包使用的编译器是不一样的,也可能导致语法等存在一定的差异,暂无优劣之分,看个人情况而定。
(1)安装步骤
1、运行安装包。直接双击安装包即可,在linux下双击安装包有时可能没响应,那是因为安装包没运行权限,可以通过下面的方法获取运行权限:
在终端输入以下命令:(假设安装包在桌面,XXX为安装包名称)
cd Desktop //进入文件目录
chmod +x XXX.run //修改权限,chmod是加权限命令,+ 表示增加权限,x 表示可执行
2、在弹出的安装引导中选择“next”,选择安装路径后选“next”。
3、在“组件选择”中可以选择性安装你需要的组件,选中组件时右边会有说明,默认选项可以满足正常开发需求,但为了不时之需,可以全选。选好后点击“next”。
4、在“许可协议”中主要说明一些协议,同意后选“next”,在新界面中选择创建快捷键的位置,然后一直选“next”,直到完成。
(2)Qt Creator各包安装情况:
32bit安装装包 |
64bit安装包 |
VS200X插件 |
||
|
MinGW |
MSVC |
|
|
windows32 |
安装成功 |
安装成功 |
新发布没尝试 |
安装成功 |
windows64 |
暂无条件测试 |
暂无条件测试 |
暂无条件测试 |
暂无条件测试 |
linux32 |
安装成功 |
没尝试 |
无 |
|
linux64 |
不成功 |
安装成功 |
无 |
|
mac |
无 |
安装成功 |
无 |
在一般情况下,Qt Creator会按默认配置好,但有时可能需要我们做一些手动配置,下面讲解一下几个常见配置(各平台上Qt Creator的界面及用法是一样的,此处以Qt Creator2.6.2(win32中文版)为例进行说明):
(1)“Qt 版本”与“编译器”的配置
两者的添加方法基本相同,不同的是“Qt版本”添加的是“qmake.exe”的路径,“编译器”添加的是编译器(gcc.exe,vcvarsall)路径。下面以添加“编译器”为例:
1、在顶部菜单栏选择“工具”->“选项”:
2、选择“构建和运行”->“编译器”,在右边的“添加”中选择要添加的编译器类型;
3、通过编译器路径后面的“浏览”按钮,找到“编译器文件(如gcc.exe)”,打开;
4、在“手动设置”下面会看到新增的编译器名称(可自己命名),在编译器路径里可以看到新增的编译器所在路径,点击“应用”完成添加。
(2)调试器的配置
在linux和mac上,Qt Creator可以自动检测到合适的调试器(应该是安装包绑定的),但在windows上,Qt Creator默认是不适用调试器的,需要手动配置,而且mingw与msvc的调试器也似乎是不匹配的(测试结果:msvc用mingw调试器时断点处没停也查看不到值的变化; mingw用msvc调试器时运行得很慢很慢很慢),手动配置如下:
1、mingw-32bit
a、在调试器后面的“管理”选择“编辑”
b、选择“GDB”,点击“浏览”
C、找到“gdb.exe”,文件路径为“…\MinQt5.0.1\Tools\MinGW\bin”
d、“确定”->“应用”。
2、msvc-32bit
a、 自身不带有调试器,需要到网上下载:(windbg)
http://download.microsoft.com/download/A/6/A/A6AC035D-DA3F-4F0C-ADA4-37C8E5D34E3D/setup/WinSDKDebuggingTools/dbg_x86.msi
b、 安装“WinDbg”后,点击“管理”->“自动检测”即可,如无法检测到,也可按mingw的步骤手动添加。
(3)“构建套件(Kit)”的配置
1、在顶部菜单栏选择“工具”->“选项”:
2、选择“构建和运行”->“构建套件(Kit)”,Qt Creator会自动检测到安装包自带的默认套件
3、可以通过右边的“添加”来创建自己想要的Kit。在“名称”项命名,命名没特殊要求,最好能体现该“kit”的属性;在“编译器”和“Qt版本”中选择自己需要的选项;在“设备类型”选择程序运行的设备,电脑上一般默认“桌面”。不匹配时会有或 错误提醒和警告,添加的“kit”会在“手动设置”显示。可以通过“设为默认”把其中某个“kit”设为默认,设为默认后,在打开工程和修改工程“kit”时会自动勾选。
4、新建项目时,根据需要选择相应的“Kit”,默认情况下为全选。
5、查看工程使用的“Kit”。把鼠标移至或点击界面左下角的电脑图标
6、修改项目的“Kit”。
A、点击左侧菜单中的“项目”,选择“构建和运行”,点击“-”减号删除当前“Kit”:
B、在弹出的窗口下选择新“kit”,点击“配置项目”即可。
(1)点击“create Project”
(2)选择项目及应用类型
(3)项目命名,指定创建路径,注意路径不要出现中文
(4)选择构建套件,可根据需要勾选,默认为全选
(5)选择基类类型,“下一步”->“完成”
QT中QWidget、QDialog及QMainWindow的区别(来源:http://www.cnblogs.com/aqxin/archive/2011/05/23/2054156.html)
QWidget类是所有用户界面对象的基类。 窗口部件是用户界面的一个基本单元:它从窗口系统接收鼠标、键盘和其它事件,并且在屏幕上绘制自己。每一个窗口部件都是矩形的,并且它们按Z轴顺序排列。一个窗口部件可以被它的父窗口部件或者它前面的窗口部件盖住一部分。
QMainWindow 类提供一个有菜单条、锚接窗口(例如工具条)和一个状态条的主应用程序窗口。主窗口通常用在提供一个大的中央窗口部件(例如文本编辑或者绘制画布)以及周围菜单、工具条和一个状态条。QMainWindow常常被继承,因为这使得封装中央部件、菜单和工具条以及窗口状态条变得更容易,当用户点击菜单项或者工具条按钮时,槽会被调用。
QDialog类是对话框窗口的基类。对话框窗口是主要用于短期任务以及和用户进行简要通讯的顶级窗口。QDialog可以是模态对话框也可以是非模态对话框。QDialog支持扩展性并且可以提供返回值。它们可以有默认按钮。QDialog也可以有一个QSizeGrip在它的右下角,使用setSizeGripEnabled()。
QDialog 是最普通的顶级窗口。一个不会被嵌入到父窗口部件的窗口部件叫做顶级窗口部件。通常情况下,顶级窗口部件是有框架和标题栏的窗口(尽管使用了一定的窗口部件标记,创建顶级窗口部件时也可能没有这些装饰。)在Qt中,QMainWindow和不同的QDialog的子类是最普通的顶级窗口。
如果是顶级对话框,那就基于QDialog创建,如果是主窗体,那就基于QMainWindow,如果不确定,或者有可能作为顶级窗体,或有可能嵌入到其他窗体中,则基于QWidget创建。
当然了,实际中,你还可以基于任何其他部件类来派生。看实际需求了,比如QFrame、QStackedWidget等等。
(6)点击“锤子”图标编译,点击“绿色箭头”运行
(1)选择默认“kit”编译(编译器、Qt版本的位数与系统位数相同)
1、mac和windows上,编译通过,程序运行正常;
2、linux下初次编译可能会报错:cannot find –lGL;
解决办法:在终端输入sudo apt-getinstall libgl1-mesa-dev下载相应的文件。
(2)同一系统下是否同时支持编译32bit和64bit的程序
经测试,初步得出结论:32bit系统下不支持编译64bit程序;mac-64bit系统下可以编译32bit程序;linux-64bit系统下编译不了32bit程序,猜测是系统缺少32位库文件。(详细情况请查看《Qt安装及编译测试错误报告》):
插件包:Qt Library + VS200X(X = 5,8,10…本文以VS2010为例进行说明)
Qt Library在官网上没有Qt5SDK单独的包,均捆包在Qt Creator集成包里,可通过安装Qt Creator集成包获取。
· Visual Studio Add-in 1.2.0 for Qt5 (VS插件)
(1)安装步骤
1、安装VS2005或以上版本。安装比较简单,基本是“安装”->“完成”的自动模式。
2、安装Qt的SDK。双击即可安装,官网上暂无发现单独的Qt5 SDK,都集成到了Qt Creator安装包里面了,可以通过安装Qt Creator安装包获取其SDK(但需手动设置路径,下面会说)。
3、安装Visual Studio Add-in。双击即可安装,安装完成后,VS菜单上会多出一个“Qt”选项。
参考网址:
http://www.cnblogs.com/qq78292959/archive/2012/05/03/2481971.html
(1)配置步骤
1、启动VS,点击“Qt”->“Options”进行路径设置。
2、VS可以自动检测到并添加单独安装的Qt SDK路径,如下所示:
3、但使用集成到QtCreator的SDK则需要手动添加路径,如下所示:
4、找到bin路径,“确定”->“ok”:
5、路径设置不正确时,有红字提醒并且“ok”按钮无效:
6、点击“OK”完成设置。
(2)配置问题导致的常见错误
1、Visual Studio Add-in与Qt SDK版本要匹配,不能添加比自身对应版本高的SDK。否则会报错:
(1)“文件”->“新建”->“项目”
(2)选择项目种类,命名项目并指定路径
(3)在弹出的界面中直接点击“下一步”,选择需要的模块
(4)设置基类等,完成
(5)生成解决方案,启动
(1)win32编译,报错:
1>------ 已启动生成: 项目: VSQt5, 配置: Debug Win32 ------
1>Rcc'ing vsqt5.qrc...
1>RCC Parse Error: 'd:\Qt+Creator\VSQt5\VSQt5\vsqt5.qrc'Line: 1 Column: 1 [Encountered incorrectly encoded content.]
1>Project : error PRJ0019: 某个工具从以下位置返回了错误代码: "Rcc'ingvsqt5.qrc..."
1>生成日志保存在“file://D:\Qt+Creator\VSQt5\Win32\Debug\BuildLog.htm”
1>VSQt5 - 1 个错误,个警告
========== 生成: 成功0 个,失败1 个,最新0 个,跳过0 个==========
解决办法:尚未解决,根据报错是在RCC解析vsqt5.qrc文件时,遇到不正确的编码内容。对此做了进一步测试:
1、VS无.qrc文件的项目测试
建Qt Console Application(Qt5)项目,源码,文件,结果如下:
编译通过,运行正常,所以验证了的确跟.qrc文件有关。
2、在VS与Qt Creator里建同样的工程,尝试通过对比.qrc文件发现错误的编码内容,但Qt Creator建的项目没有.qrc文件
A、有.qrc文件的项目测试:
建Qt Application(Qt5)项目,其中基类为:QMainWindow;源码,文件,结果如下:
曾怀疑跟下面文件的红色提示有关,但网上的例子也是一样的截图。
B、 建同样的工程,Qt Creator目录没有.qrc文件
3、网上下载别人VS开发的Qt程序源码,看看重新编译后是否能通过,对比.qrc文件是否不一样。(该部分暂时还没做)
(2)x64b编译,报错:
原因猜测:没有64位的库文件和连接器等,插件不支持64位编译。
在Qt Creator上的搭建是成功的,在VS上插件的安装配置遇到了问题,但可以知道的是VS上用目前的32bit的SDK也同样无法编译64位程序的,而且VS仅限于windows系统。综上,我们可以选择Qt Creator进行Qt的开发。
可以通过包含相应头文件来直接使用API函数,如:
此外,外部的文件通过“添加现有文件”,再#include即可使用,跟在MFC上使用没多大区别。
Qt Creator可以把库添加到具体项目的属性,添加后只对本项目起作用,不影响其他项目,下面以Qt Creator-msvc添加“外部库”为例讲解如何添加库文件:
(1)右键要添加库的目标项目->“添加库”
(2)选择要添加库的类型,此处会有各类型库的说明
(3)勾选对应的“平台”和“链接”,通过“浏览”获取“库文件”路径以及“包含文件”路径,注意的是选“库文件”时自动添加的“包含路径”不一定是正确的,应填写该库头文件的实际路径。
值得注意的是:在windows下以这种方式导入的库文件必须是.lib后缀,因为在文件选择对话框里已经把文件类型限制为(*.lib),而QtCreator-mingw生成的静态库是.a后缀的。
(4)在完成前会有汇总显示
(5)在导入完成后,会根据汇总做相应的修改,一般为在.pro添加相应的路径信息,此时可以通过#include相应的头文件来使用库函数
参考网址:http://qt.csdn.net/articles.aspx?pointid=264&pointid2=
点击主界面左边菜单的“项目”->“构建和运行”,打开下方的“构建环境”->“详情”,可以看到QtCreator对环境变量的使用情况:
从红色框里的INCLUDE,LIB和LIBPATH,我们可以看出,Qt Creator是通过这三个环境变量的路径找到相应的系统库文件的,所以理论上我们可以通过在这三个环境变量里添加相应的文件路径来达到添加“公共库”的目的。但在尝试中发现,如果在这里修改这三个环境变量,新增的路径只对本项目有用,并不影响到其他项目。要实现真正意义上的“公共库”,需要到“我的电脑”->“属性”里修改这三个环境变量。
在实际操作中遇到下面的问题没解决:
设置环境变量后,包含头文件,使用Lib里面的函数时报错:
QtCreator开发的程序可以通过以下两种方法发布到没Qt库的电脑:
1、静态编译
可参考:
http://blog.csdn.net/c154387417/article/details/6330245
官网发布的安装包在默认情况下是动态编译的,而且没有静态编译所需的Qt库,据网上所说要静态编译需先自己编译出静态编译所需的Qt库,然后在project.pro添加QMAKE_LFLAGS=-static指定为静态编译即可。由于编译所需时间太长(据说好几小时),暂时尚未尝试。
2、复制运行时提示缺少的dll文件到当前目录,可参考:(win32下测试通过)
http://hi.baidu.com/dbzhang800/item/5c92691dc965017a7a5f2542
有一个dll(debug模式下为:libEGLd.dll;release模式下位:libEGL.dll)需特别注意的,缺少时并不会提示,debug编译的exe运行时直接报错:
release编译的exe缺少时点击没反应。
参考: QT 静态库和动态库http://mobile.51cto.com/symbian-267846.htm
在各平台上用Qt Creator创建、使用Qt静态库和动态库的方法是一样的,这里选择Qt 5.0.1for Windows 32-bit (MinGW 4.7) 测试。
(1)新建项目,选择“库”->“C++库”
(2)选择库的类型为“静态链接库”,命名项目名称,这里命名为“staticlib”
(3)选择构建套件
(4)选择模块
(5)类信息一般不用修改,直接“下一步”->“完成”
(6)项目的文件架构如下
(7)添加测试代码
1、.h头文件添加函数声明:voidtest();
2、.cpp文件添加函数体
3、.pro文件添加:QT+=widgets;这主要是因为Qt5用widgets组件代替了QtGui,而在创建库项目过程中的模块选择时并没有Q widgets选项,所以要使用界面组件时只能通过勾选QtGui并在.pro文件中加上QT+=widgets来达到使用目的;Qt5.0.2已解决这个问题,在创建库时已经有Q widgets选项,但如果你勾选的依然是QtGui,在.pro文件中除了要加上QT+=widgets外,还要加上QT-=gui。
另外,在已经构建好(即已编译生成Makefile)的项目里,手动修改.pro文件后要点击“构建”->“执行make”,否则,尽管是“重新构建项目”,所做的修改还是不起作用的。
(8)编译
(1)新建测试工程
(2)命名项目,指定工程路径,这里命名为“staticlibtest”
(3)选择构建套件
(4)选择“基类”,“下一步”->“完成”
(5)工程文件结构
(6)在.pro添加静态库路径,其中“INCLUDEPATH +=”用于指定头文件路径,“LIBS +=”用于指定库文件路径
(7)在main.cpp调用静态库函数
(8)编译运行,其中“静态库测试”为调用静态库生成的
(1)动态库的创建方法与静态库创建相同,只是在第二步时选择“库的类型”时选择“共享库”,这里命名为“libdll”
(2)头文件结构,比静态库多了一个“libdll_global.h”头文件
(3)添加测试代码
1、.pro文件添加:QT += widgets
2、libdll.h添加函数声明:voidtest();
3、.cpp文件添加函数体
(4)编译
(1)新建测试项目的方法与静态库测试项目的新建一样,这里命名为“libdlltest”
(2)把.dll文件拷贝到执行文件的目录
(3)在.pro文件添加路径
(4)在main.cpp里调用.dll里的函数
(5)编译,运行;下面的“这是动态库测试”是由.dll生成的。
在各平台上用Qt Creator创建、使用Qt静态库和动态库的方法是差不多是一样的,只是生成的库文件后缀不一样而已,除了以上方法使用库文件外,还可以通过添加“外部库”的方法添加到目标项目里使用;但是在windows下,导入的库文件格式限定为(*lib),而Qt Creator-mingw生成的是.a后缀的静态库文件,不能以此方法,同样也不能用此方法添加动态库。其实这里通过写代码使用库文件的使用方法跟MFC库的“隐式调用”是类似的,而上面的“添加库”通过设置使用库文件则可以类比为MFC里库的“显式调用”。另外,创建和使用过程中还应注意以下两点:
(1)在linux下编译库文件时,系统时间不正确时会出现以下类型的错误:error: Warning: File `../LIB/LIB.pro' has modification time 4e+05 sin…,改正系统时间即可。
(2)使用库时应特别注意INCLUDEPATH +=和LIBS +=的正确写法,尤其是在跨平台移植时,应注意路径格式的转变,很多notfound错误都是由于这两个路径不正确引起的。
Qt的可移植性,指的是代码不用修改,就可以在多个平台编译通过并运行。针对每一种OS平台,Qt都有一套对应的底层类库,而接口是完全一致的。因此只要是在Qt库上开发的程序,放在任何一种所支持的平台下都可以编译运行(前提条件是:程序中没有使用某OS特有的机能)。也就是说在OS和应用层之间,增加了一个平台层来保证可移植性。
1、源代码里只使用Qt库,没有与平台相关的代码时,一般只需在目标平台的Qt(版本要一样,新版本对上一版本不完全兼容)上重新编译即可,但要注意源码里是否包含绝对路径,Qt的跨平台性是一次编写多次编译,不同于java的一次编译多次执行。
2、如果程序中使用某些平台相关的库函数,那么在移植时就需要针对不同平台作一些改动。
3、64位下开发的QT程序, 在32位电脑上重新编译一下就可以在32位机上运行了, 前提是不要用到64位下才支持的函数和功能,但要注意某些数据类型所占字节数的不同。
1、字符的编码问题。Windows下是ANCII编码的,Linux下是Unicode编码的,源程序注意转化编码。关于编码的设置可参考:
windows下默认是GBK的编码格式,如果想使用UTF8就要先修改Qt Creator的编码格式,方法如下 Tools->Options->Environment->General->Default file encoding 修改好UTF8格式之后,再创建工程,就可以显示UTF8格式的汉字了 代码如下: QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF8")); QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF8")); QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF8")); qDebug()<<"不怕神一样的对手,就怕猪一样的队友"; 或者使用这样输出 QTextCodec* codec = QTextCodec::codecForName("UTF8") QString str = codec->toUnicode("不怕神一样的对手,就怕猪一样的队友"); qDebug()<
来自网站:http://zhidao.baidu.com/question/186780737.html
2、Linux下的文件名连后缀都是区分大小写的,所以一些涉及到文件读写的程序,后缀名也要注意一下。另外,在包含动态库或静态库的程序在移植到另一个平台时,相应的库文件也要注意后缀,不同时应当重新编译。
3、尽量不要在程序里写绝对路径,要用相对路径;路径不要含中文,注意‘/’和‘\’的转换。
在初学Qt,我们难免要参考网上例子,但网上的例子大多是在Qt4上开发的,所以会出现一些不兼容的问题。
(1)、QtGui模块的问题。用Qt5编译Qt4的工程出现最多的就是下面类型的问题:
错误:C1083: 无法打开包括文件:“QApplication”: No such file or directory
错误:C1083: 无法打开包括文件:“QMainWindow”: No such file or directory
出现原因:Qt5里不再用QtGui模块,而是使用QtWidgets模块。
解决方法:在.pro里加上QT += widgets
(2)其他常见问题集锦:
http://hi.baidu.com/xchinux/item/9044d8ce986accbb0d0a7b87
本部分是基于Qt5.0.1 + Qt Creator2.6.2进行开发的,目前还没发现网上有Qt5的教程,鉴于与Qt4的使用大同小异,所以可以参考Qt4教程,推荐教程如下:
QtCreator教程:
《qt+creator系列教程》或《Qt_CreatoR_入门》,这两本书内容基本一样:http://wenku.baidu.com/view/eac2b64133687e21af45a996.html
文档集: http://www.open-open.com/doc/list/185
《C++ GUI Qt4 编程》或《精通QT4编程》,这两本书内容基本一样:
http://ishare.iask.sina.com.cn/f/9045395.html
Qt各控件详细说明:
http://wenku.baidu.com/view/d64a7863af1ffc4ffe47ac7f.html
(1) 启动Qt Creator,点击“Create Project”创建新项目;
(2) 指定项目名
(3) 选择构建套件,一般默认即可;
(4) 指定基类
(5) 直接点击“完成”;
(6) 点击“mainwindow.ui”文件,进入“设计器”;
(7) 从控件库拉一个静态文本框“Label”到主界面;
(8) 右击控件->“改变普通文本”,写入“helloworld”;也可以在“属性栏”编辑;
(9) 保存,编译;
(10) 运行;
(11) 效果如下:
进一步修改:(信号-槽的使用)
1往主界面添加一个按钮“pushButton”;
2点击“信号槽编辑器”->绿色“+”,新建信号-槽;(此方法适合绑定控件自带的信号和槽)
3右击“pushButton”按钮,在弹出的菜单选择“转到槽”,在弹出的窗口选择clicked信号;
4在转到的槽函数里编辑自定义槽函数
voidMainWindow::on_pushButton_clicked()
{
ui->label->setText("signal-slot!");
}
5保存,编辑,运行。
点击按钮前:
点击按钮后:
在修改后的程序里主要演示了两种使用信号-槽的方法,另外还可以用connect(*p, SIGNAL(f()), this, SLOT(f1()));使用信号槽,在后面会讲到,此处暂不演示。
Qt Gui初始界面我们可以在“设计模式”使用可视化编程来设计界面,这样比写代码更简单快捷。
(1) 双击“界面文件”下的.ui文件转到“设计模式”
(2) 从控件库往主界面拉控件构造自己界面,选中控件可以在属性栏编辑控件属性;
(3) 在行为编辑器里可以为控件添加行为和“信号-槽”
本部分只简单列举常用的函数、信号和槽,详细的介绍可以查看帮助文档。
两者都主要是在布局中用到,通过各种嵌套可以构造出复杂的界面布局,一般不会用到接口。
1、常用函数
QString selectedText() const //选中的内容
void setSelection(int start, int length) //设置选中
void setTextFormat(Qt::TextFormat) //设置字体格式
QString text() const //获取控件文本
2、常用信号
void linkActivated(constQString & link) //点击链接
void linkHovered(constQString & link) //鼠标移到链接
要使label能发送这两个信号,必须先设置超链接,设置示例如下:
QLabel*openfilelabel=newQLabel(this);
openfilelabel->setOpenExternalLinks(true);/*这句很关键啊,否则就只能通过linkActivated信号,连接到自定义槽函数中打开了*/
openfilelabel->setText(tr("
openfilelabel.show();
3、常用槽
void clear() //清空
void setPicture(const QPicture &picture) //显示图片
void setText(const QString &) //设置显示文字
1、常用函数
QPushButton(QWidget* parent = 0) //构造函数
QPushButton(constQString & text, QWidget * parent = 0)
QPushButton(constQIcon & icon, const QString & text, QWidget * parent = 0)
void QButton::setText ( const QString &) // 设置这个按钮上显示的文本
QString text() const //返回这个按钮上显示的文本
2、常用信号
Clicked() //被点击
3、常用槽
setEnabled(bool) //设置按钮有效
setDisabled(bool) //设置按钮失效
1、常用函数
Bool isChecked() const //检查是否被勾选
2、常用信号
stateChanged(int) //状态改变
3、常用槽
setChecked(bool) //设置选中状态
setEnabled(bool) //设置按钮有效
setDisabled(bool) //设置按钮失效
1、常用函数
void addItem(constQString & label) //加入项(参数为字符串)
void addItem(QListWidgetItem* item) //加入项(参数为字符串)
void addItems(constQStringList & labels) //加入多项(参数为列表)
void insertItem(int row, QListWidgetItem *item) //插入项
void insertItem(int row, const QString &label)
void insertItems(int row, const QStringList& labels)
QListWidgetItem * currentItem() const //获取当前项
void removeItemWidget(QListWidgetItem *item) //删除项,但在实际应用中调用该函数后,并没有删除项,需要再调用delete才能删除,其实直接调用delete也可以删除,但不知道会不会有什么不良后果。使用举例如下:
listWidget->removeItemWidget(listWidget->currentItem());
delete listWidget->currentItem();
参考网址:http://sweetdum.com/wordpress/?p=290
2、常用信号
void currentItemChanged(QListWidgetItem *current, QListWidgetItem * previous)
void currentRowChanged(int currentRow)
void currentTextChanged(const QString ¤tText)
void itemChanged(QListWidgetItem * item)
void itemClicked(QListWidgetItem * item)
void itemDoubleClicked(QListWidgetItem *item)
void itemSelectionChanged()
3、常用槽
Clear() //清空
ScrollToItem(QListWidgetItem * item) //转到项,可用于查找
推荐网址:http://music.573114.com/Blog/Html/6016/203347.html
1、常用函数
QTableWidget(int rows, int columns, QWidget * parent = 0) //构造表格
void setColumnCount(int columns) //设置表格列数
void setRowCount(int rows) //设置表格行数
void setHorizontalHeaderItem(int column,QTableWidgetItem * item) //设置列名
void setHorizontalHeaderLabels(constQStringList & labels) //设置表头
void setItem(int row, int column,QTableWidgetItem * item) //设置单元表格内容
2、常用信号
//此处cell和item是差不多的,只是cell用行和列定位,item用指针定位。
void cellChanged(int row, int column)
void cellClicked(int row, int column)
void cellDoubleClicked(int row, int column)
void currentCellChanged(int currentRow, intcurrentColumn, int previousRow, int previousColumn)
void currentItemChanged(QTableWidgetItem *current, QTableWidgetItem * previous)
void itemChanged(QTableWidgetItem * item)
void itemClicked(QTableWidgetItem * item)
void itemDoubleClicked(QTableWidgetItem *item)
void itemSelectionChanged()
3、常用槽
void clear() //清空表格
void clearContents() //清空表格内容
void insertColumn(int column) //插入列
void insertRow(int row) //插入行
void removeColumn(int column) //删除列
void removeRow(int row) //删除行
void scrollToItem( const QTableWidgetItem * item, QAbstractItemView::ScrollHint hint =EnsureVisible ) //滚动到项,常用于查找
setSortingEnabled(true); // 设置点击表头自动排序
setSelectionBehavior(QAbstractItemView::SelectRows); //整行选中的方式
setEditTriggers(QAbstractItemView::NoEditTriggers); //设置单元表格不可编辑
1、常用函数
void addTopLevelItem(QTreeWidgetItem * item) //插入一个顶级项
void addTopLevelItems(constQList
QTreeWidgetItem * currentItem() const //获取当项
void setHeaderLabel(const QString &label) //加入树的属性列名
void setHeaderLabels(const QStringList &labels) //加入树的多个属性列名
2、常用信号
void currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem * previous)
void itemChanged(QTreeWidgetItem * item, intcolumn)
void itemClicked(QTreeWidgetItem * item, intcolumn)
void itemDoubleClicked(QTreeWidgetItem *item, int column)
void itemSelectionChanged()
3、常用槽
void clear() //清空
void collapseItem(const QTreeWidgetItem *item) //收起
void expandItem(const QTreeWidgetItem *item) //展开
void scrollToItem(const QTreeWidgetItem *item, QAbstractItemView::ScrollHint hint = EnsureVisible) //滚动到项,常用于查找
1、常用函数
QProgressDialog( const QString & labelText, const QString& cancelButtonText, int minimum, int maximum, QWidget * parent = 0,Qt::WindowFlags f = 0 ) //构造函数
int maximum() const //获取最大值
int minimum() const //获取最小值
int value() const //获取当前值
2、常用信号
void valueChanged(int value)
3、常用槽
void reset()
void setMaximum(int maximum) //设置最大值
void setMinimum(int minimum) //设置最小值
void setRange(int minimum, int maximum) //设置值范围
void setValue(int value) //设置当前值
1、常用函数
void addItem(const QString & text, constQVariant & userData = QVariant()) //加入纯文本
void addItem(const QIcon & icon, constQString & text, const QVariant & userData = QVariant()) //加入图标和文字
void addItems(const QStringList & texts) //批量加入
QString currentText() const //当前内容
void insertItem(int index, const QString& text, const QVariant & userData = QVariant())
void insertItem(int index, const QIcon &icon, const QString & text, const QVariant & userData = QVariant())
void insertItems(int index, constQStringList & list)
void removeItem(int index)
2、常用信号
void currentIndexChanged(int index)
void currentIndexChanged(const QString &text)
void currentTextChanged(const QString &text)
void editTextChanged(const QString &text)
void highlighted(int index)
void highlighted(const QString & text)
3、常用槽
void clear()
void clearEditText()
void setCurrentIndex(int index)
void setCurrentText(const QString &text)
void setEditText(const QString & text)
(1)常用函数
QPushButton * addButton(constQString & text, ButtonRole role) //加按钮
QPushButton * addButton(StandardButtonbutton)
void removeButton(QAbstractButton * button)
void setDefaultButton(QPushButton * button) //设置默认按钮
void setInformativeText(const QString &text)
void setStandardButtons(StandardButtonsbuttons) //设置标准按钮
void setText(const QString & text)
void setWindowTitle(const QString &title)
静态函数:
void about(QWidget * parent, const QString& title, const QString & text)
void aboutQt(QWidget * parent, const QString& title = QString())
StandardButton critical(QWidget *parent, const QString & title, const QString & text, StandardButtonsbuttons = Ok, StandardButton defaultButton = NoButton)
StandardButton information(QWidget* parent, const QString & title, const QString & text, StandardButtonsbuttons = Ok, StandardButton defaultButton = NoButton)
StandardButton question(QWidget *parent, const QString & title, const QString & text, StandardButtonsbuttons = StandardButtons( Yes | No ), StandardButton defaultButton = NoButton)
StandardButton warning(QWidget *parent, const QString & title, const QString & text, StandardButtonsbuttons = Ok, StandardButton defaultButton = NoButton)
(2)常见用法举例:
例1:
QMessageBox msgBox;
msgBox.setText("The document has beenmodified.");
msgBox.setInformativeText("Do you wantto save your changes?");
msgBox.setStandardButtons(QMessageBox::Save| QMessageBox::Discard | QMessageBox::Cancel);
msgBox.setDefaultButton(QMessageBox::Save);
int ret = msgBox.exec();
switch (ret) {
case QMessageBox::Save:
// Save was clicked
break;
case QMessageBox::Discard:
// Don't Save was clicked
break;
case QMessageBox::Cancel:
// Cancel was clicked
break;
default:
// should never be reached
break;
}
效果图:
例2:
int ret = QMessageBox::warning(this,tr("My Application"),
tr("Thedocument has been modified.\n"
"Do youwant to save your changes?"),
QMessageBox::Save | QMessageBox::Discard
|QMessageBox::Cancel,
QMessageBox::Save);
效果图:
(1) 常见函数
最常用的静态成员函数:
1QString getExistingDirectory( QWidget * parent = 0, const QString & caption= QString(), const QString & dir = QString(), Options options =ShowDirsOnly )
2QString getOpenFileName ( QWidget * parent = 0,const QString & caption = QString(), const QString & dir = QString(),const QString & filter = QString(), QString * selectedFilter = 0, Optionsoptions = 0 )
3QStringList getOpenFileNames ( QWidget * parent = 0,const QString & caption = QString(), const QString & dir = QString(),const QString & filter = QString(), QString * selectedFilter = 0, Optionsoptions = 0 )
4QString getSaveFileName ( QWidget * parent = 0, const QString & caption = QString(),const QString & dir = QString(), const QString & filter = QString(),QString * selectedFilter = 0, Options options = 0 )
void selectFile(const QString &filename)
void selectNameFilter(const QString &filter)
QStringList selectedFiles() const
QString selectedNameFilter() const
void setAcceptMode(AcceptMode mode)
void setDefaultSuffix(const QString &suffix)
void setDirectory(const QString &directory)
void setDirectory(const QDir &directory)
(2)常见用法举例:
例1:
QFileDialog fildlg;
fildlg.setAcceptMode(QFileDialog::AcceptOpen);
if(fildlg.exec()==QFileDialog::Accepted) // ok
{
int ret =QMessageBox::information(this, "Title", "打开成功",
QMessageBox::Ok, QMessageBox::Ok);
}
效果图:
例2:
QStringfileName=QFileDialog::getOpenFileName(this,
tr("OpenImage"),"/home/jana",tr("Image Files(*.png *.jpg *.bmp)"));
效果图:
(1)常用函数
void setContextMenu( QMenu * menu ) //设置托盘右键菜单
void setIcon( const QIcon & icon ) //设置图标
void setToolTip( const QString & tip ) //设置托盘名称
void showMessage( const QString & title, const QString & message, MessageIcon icon =Information, int millisecondsTimeoutHint = 10000 ) //设置气泡显示信息
常用信号
void activated( QSystemTrayIcon::ActivationReason reason ) /*激活理由(单击,双击等),通常用
connect(trayIcon,SIGNAL(activated(QSystemTrayIcon::ActivationReason)),this,SLOT(iconActivated(QSystemTrayIcon::ActivationReason)));绑定。*/
void messageClicked()
(1)常用函数
void exit( int returnCode = 0 ) //退出,返回一个代码
bool isFinished() const //检查线程是否结束
bool isRunning() const //检查线程是否在运行
常用信号
void finished() //结束
void started() //开始
void terminated() //终止
常用槽:
void quit() //退出,返回0,相当于QThread::exit(0)
void start (Priority priority = InheritPriority ) //开始
void terminate() //终止
使用举例:
//MyThread.h
class MyThread :public QThread
{
Q_OBJECT //要使用“信号-槽”机制就要加入这句
signals:
void ShowWin(int i);
protected:
void run();
};
//MyThread.cpp
voidMyThread::run() //run是线程的核心函数,自定义操作都在这里进行
{
while(1)
{
emit ShowWin(10);
}
}
//mainwindow.h
class MainWindow: public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
private slots:
void SetShow(int i);
}
//mainwindow.cpp
MainWindow::MainWindow(QWidget*parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
MyThread *thread = new MyThread(parent);
connect(thread, SIGNAL(ShowWin(int)), this, SLOT(SetShow(int))); //在绑定信号槽时,信号函数和槽函数的参数均只有数据类型,没有变量名
thread->start();
}
voidMainWindow:: SetShow(int i)
{
Std::cout<
show();
}
若要在自定义线程里编辑界面,不可以直接通过窗口指针来操作界面,直接操作界面会莫名其妙地崩溃,应当通过信号槽机制来编辑界面。
1、QtWebkit从Qt4.4版本开始引入,若Qt4.4以上没发现QtWebkit组件极有可能是安装不完全所致。
2、使用webkit时注意要在.pro文件添加相应选项:QT+= webkitwidgets(Qt5版本),QT += webkit(Qt4版本)
3、简单Demo存放在:\\192.168.1.1\temp\kongfy\webkit_Demo
参考网址:http://blog.csdn.net/liuhongwei123888/article/details/6111434
http://www.tuicool.com/articles/iayIj2