菜鸟笔记
提升您的技术认知

QT的概述

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按照不同的版本发行,分为商业版和开源版。

商业版----为商业软件提供开发,他们提供传统商业软件开发版,并且提供在商业有效期内的免费升级和技术支持服务。

开源的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 <QApplication>//包含一个应用程序类的头文件

//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 <QPushButton> // 按钮控件的头文件

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向下增加。

对于嵌套窗口来说,其坐标是相对于父窗口来说的