qt的概述
1.什么是qt
qt是一个跨平台的c 图形用户界面应用程序框架。它为应用程序开发者提供建立艺术级图形所需的所有功能。它是完全面向对象的,容易扩展,并且允许真正的组件编程。
2.qt的发展史
1991年,qt最早由奇趣科技开发
1996年,进入商业领域,它也是目前流行的linux桌面环境kde的基础
2008年,奇趣科技被诺基亚收公司收购,qt称为诺基亚旗下的编程语言
2012年,qt又被digia公司收购
2014年,跨平台的集成开发环境qt creator 3.1.0发布,同年5月20日配发了qt 5.3 正式版,至此qt实现了对ios、android、wp等各平台的全面支持。
3.qt支持的平台
windows - xp、vista、win7、win8、win2008、win10
linux/x11 - linux、sun solaris、hp-ux、compaq tru64 unix、ibm aix、sgi irix、freebsd、bsd/os和其他很多x11平台
macintosh - mac os x(即所有的苹果系统均支持)
embedded - 有帧缓冲支持的嵌入式linux平台,windows ce
4.qt版本
qt按照不同的版本发行,分为商业版和开源版。
商业版----为商业软件提供开发,他们提供传统商业软件开发版,并且提供在商业有效期内的免费升级和ag真人游戏的技术支持服务。
开源的lgpl版本---为了开发自由而设计的开放源码软件,它提供了和商业版同样的功能。在gnu通用公用许可下,它是免费的。
5.qt的优点
跨平台,几乎支持所有的平台
接口简单,容易上手,学习qt框架对学习其它框架有参考意义
一定程度上简化内存回收机制
开发效率高,能够快速构建应用程序
有很好的社区氛围,市场份额在缓慢上升
可以进行嵌入式开发
6.市面上成功的案例
linux桌面环境kde
wps office办公软件
skype 网络电话
google earth 谷歌地图
vlc多媒体播放器
virtualbox虚拟机软件
创建第一个qt程序
0.选择new project或者工具栏新建文件
选择一个模板----qt widgets application
1.点击创建项目后,选择项目路径以及给项目起名称
名称:不能有中文,不能有空格
路径:不能有中文路径
注意点:
创建时的创建路径必须是全英文的,如果有中文虽然不会报错,但是运行页面不会出来。
2.kits
选择编译套件,如有多个,按需要选择即可。
3.details
默认创建窗口类名称可以自己定义。
base class(基类)包括:
1.qwidget是所有窗口类的基类;
2.qmainwindow是菜单窗口类;
3.qdialog是对话框窗口类。qmainwindow、qdialog的父类是qwidget。
类名可以自定义也可以默认。
generate form(创建界面)勾选代表启动qt设计界面功能。即有一个初始页面,可以拖拽控件。如果不选择则使用代码编辑界面。
4.sumary
可添加版本控制系统(如:git,svn,vss),如不使用,默认 none 即可。
5.项目创建成功后,main.cpp的介绍
#include "mywidget.h"
#include //包含一个应用程序类的头文件
//main程序入口
//argc命令行变量的数量,argv命令行变量的数组
int main(int argc, char *argv[])
{
//创建应用程序对象a,在qt中,应用程序对象有且仅有一个
qapplication a(argc, argv);
//自定义窗口对象 mywidget父类为qwidget
mywidget w;
//窗口对象默认不会显示,必须要调用show方法显示窗口
w.show();
//让应用程序对象a进入消息循环机制
//让代码阻塞到这一行,一直捕获用户行为
//让窗口不会一闪而过,只有点了窗口的×才会退出这个窗口(消息循坏)
return a.exec();
}
其他:
translation
可以为项目创建一个翻译文件,将你的应用界面翻译成其它语言,不适用默认none即可。
build system
cmake很常用,功能强大,比如opencv、vtk。但语法繁杂。
qmake是针对辅助qt开发的,但也可以在非qt项目使用,特点是语法简单明了,功能简单。
qbs号称下一代构架工具,许多人追捧。
.pro文件的解释
qt = core gui // qt包含的模块
greaterthan(qt_major_version, 4): qt = widgets // 大于4版本以上 包含 widget模块
target = 01_fristproject // 目标 生成.exe程序的名称(运行编译之后生成的.exe文件)
template = app //模块 应用程序模块 application
sources = mian.cpp\ // 源文件
mywidget.cpp
headers = mywidget.h //头文件
头文件 (.h文件)
头文件开头的是防止重复加载的,在新版编译器中部分功能可以用#program once代替,但是两者有一些不同,具体可以参考:#ifndef 与 #program once 的区别
源文件(.cpp文件)
在界面中添加按钮
在qt助手中搜索pushbotton
文档中给出了一些该类的信息,比如需要的头文件,所属模块,父类、子类等等。
按钮常用api
- 创建 qpushbutton * btn = new qpushbutton
- 设置父亲 setparent(this)
- 设置文本 settext(“文字”)
- 设置位置 move(宽,高)
- 重新指定窗口大小 resize
- 设置窗口标题 setwindowtitle
- 设置窗口固定大小 setfixedsize
mywidget.cpp
#include "mywidget.h"
#include // 按钮控件的头文件
mywidget::mywidget(qwidget *parent)
: qwidget(parent)
{
// 创建一个按钮对象
qpushbutton * btn = new qpushbutton;
//btn->show(); // show以顶层方式弹出窗口
// 让btn对象依赖在mywidget窗口中
// this指向的就是当前对象的指针
btn->setparent(this);
// 显示文本
btn->settext("第一个按钮");
// 创建第二个按钮
// 这种方式创建的按钮窗口是按照控件的大小创建窗口(比较小)
qpushbutton * btn2 = new qpushbutton("第二个按钮",this);
// 移动btn2按钮位置(如果没有移动的话,第二个按钮会覆盖第一个按钮,显示不出来)
btn2->move(100,100);// 坐标
// 重置窗口大小
resize(600,400);
// 设置窗口的标题
setwindowtitle("第一个窗口");
// 设置固定窗口大小(未设置前,窗口是可以拖拽改变窗口大小的)
setfixedsize(600,400);
}
mywidget::~mywidget()
{
}
对象树
特点:
当创建的对象在堆区时候,如果指定的父亲是qobject派生下来的类或者qobject子类派生下来的类,可以不用管理释放的操作,将对象会放入到对象树中。
一定程度上简化了内存回收机制.
当父对象析构的时候,这个子对象列表中的所有对象都会被析构,当析构子对象的时候,会自动从父对象的子对象列表中删除。
qobject 的构造函数中会传入一个 parent 父对象指针,children() 函数返回 qobjectlist。即每一个 qobject 对象有且仅有一个父对象,但可以有很多个子对象。按照这种形式排列就会形成一个对象树的结构,最上层是父对象,下面是子对象,在再下面是孙子对象,以此类推。
在项目中新建一个文件
点中项目名称右键,选择add new
然后点击完成即可。
pro文件中不用手动添加,已经自动添加过了。
mypushbutton.h
mypushbutton.cpp
mywidget.cpp
qt窗口坐标系
以左上角为原点(0,0),x向右增加,y向下增加。
对于嵌套窗口来说,其坐标是相对于父窗口来说的