Qt --- 基础知识

QT是什么?

Qt(官方发音 [kju:t],音同 cute)是一个跨平台的 C++ 开发库,主要用来开发图形用户界面(Graphical User Interface,GUI)程序,当然也可以开发不带界面的命令行(Command User Interface,CUI)程序---控制台窗口--->终端。

Qt 是纯 C++ 开发的,所以学好 C++ 非常有必要,Qt 还存在 Python、Ruby、Perl 等脚本语言的绑定, 也就是说可以使用脚本语言开发基于 Qt 的程序。开源社区就是这样,好东西就会被派生扩展,到处使用, 越来越壮大。

Qt 支持的操作系统有很多,例如通用操作系统 Windows、Linux、Unix,智能手机系统 Android、iOS、WinPhone, 嵌入式系统 QNX、VxWorks 等等。

Qt --- 基础知识_第1张图片

Qt 可以做什么?

Qt 虽然经常被当做一个 GUI 库,用来开发图形界面应用程序,但这并不是 Qt 的全部;Qt 除了可以绘制漂亮的界面(包括控件、布局、交互),还包含很多其它功能,比如多线程、访问数据库、图像处理、音频视频处理、网络通信、文件操作等,这些 Qt 都已经内置了。

Qt 是应用程序开发的一站式解决方案,有了 Qt,你就可以高枕无忧了!Qt 本身包含的模块也日益丰富, 一直有新模块和第三方模块加入进来。

大部分应用程序都可以使用 Qt 实现,除了与计算机底层结合特别紧密的,例如驱动开发,它直接使用硬件提供的编程接口,而不能使用操作系统自带的函数库。

1997年,Qt 被用来开发 Linux 桌面环境 KDE,大获成功,使 Qt 成为 Linux 环境下开发 C++ GUI 程序的事实标准。

下面的程序都使用 Qt 开发:WPS、YY语音、Skype、豆瓣电台、虾米音乐、淘宝助理、千牛、暴雪的战网客户端、VirtualBox---虚拟机、Opera、咪咕音乐、Google地图、Adobe Photoshop Album 等。

Linux 也是嵌入式的主力军,广泛应用于消费类电子、工业控制、军工电子、电信/网络/通讯、航空航天、汽车电子、医疗设备、仪器仪表等相关行业。

Qt 虽然也支持手机操作系统,但是由于 Android 本身已经有 Java 和 Kotlin,iOS 本身已经有 Objective-C 和 Swift,所以 Qt 在移动端的市场份额几乎可以忽略。

总起来说,Qt 主要用于桌面程序开发---PC和嵌入式开发。

Qt的辛酸史

说到 Qt 的发展史,那真是一波三折,几经卖身。

Qt 最早是 1991 年由挪威的 Eirik Chambe-Eng 和 Haavard Nord 开发的, 他们随后于 1994 年 3 月 4 号正式成立奇趣科技公司(Trolltech)。Qt 原本是商业授权的跨平台开发库, 在 2000 年奇趣科技公司为开源社区发布了遵循 GPL(GNU General Public License)许可证的开源版本。

在 2008 年,诺基亚公司收购了奇趣科技公司,并增加了 LGPL(GNU Lesser General Public License)的授权模式。诺基亚联合英特尔利用 Qt 开发了全新的智能手机系统 MeeGo,可惜遭遇了微软木马屠城,诺基亚被迫放弃了 MeeGo, 而 Qt 商业授权业务也于 2011 年 3 月出售给了芬兰 IT 服务公司 Digia。

Qt --- 基础知识_第2张图片

当然好消息是 Digia 于 2014 年 9 月宣布成立 Qt Company 全资子公司,独立运营 Qt 商业授权业务。目前 Qt 公司大力推广移动平台开发和商业应用, 总的来说 Qt 历经曲折,现在算是步入正轨了。

经过 30 多年的发展,Qt 已经成为最优秀的跨平台开发框架之一,在各行各业的项目开发中得到广泛应用。许多大型软件都是用 Qt 开发的,如 Autodesk Maya、Google Earth、Skype、WPS Office等。

永远不要忽视微软帝国的威胁,作为软件业的一代霸主,任何人都不要天真地试图和它做朋友,因为霸主不可能有朋友。微软的木马屠城是所有诺基亚人和芬兰人的痛,希望读者们都记牢这条。

Qt 和 KDE

之前提到 Qt 原本是商业授权软件,是怎么开源的呢?这就涉及 Qt 和 KDE 的纠葛了。

KDE 是 Linux 操作系统的桌面环境,与 GNOME 桌面是类似的,作为开源桌面它们竞争的情况更为多见。

KDE 是采用 GPL 许可证发布的开源软件,而最初 Qt 是商业授权的,存在商业侵权风险,GNOME 则是基于开源 GTK 库的,没有什么商业风险,这一度是 GNOME 优越于 KDE 的特性。

由于 Qt 的商业授权,KDE 社区一度混乱纠结,与此同时 GNOME 则如火如荼发展起来了。 KDE 毕竟算是亲儿子,被另一波人欺负,奇趣科技公司当然看不下去了,最后是奇趣科技公司为了赢得开发者的支持,为 Qt 增加了 GPL 的开源授权, 对于开源社区而言,遵循 GPL 使用 Qt 就不需要付费,这为 KDE 解决了燃眉之急。

之后 KDE 桌面和 GNOME 都发展壮大起来,都做得越来越好了。

GPL 和 LGPL

除了商业授权,目前 Qt 的开源授权有两种,一种是 GPL 授权,另一种是 LGPL 授权(诺基亚收购后新增)。

对这两种开源授权,简单来说,使用 GPL 版本的软件一定还是 GPL 的开源软件,无论是使用了 Qt 的程序代码还是修改了 Qt 库代码,都必须按照 GPL 来发布,这是 GPL 的传染性。

GPL 是什么都要开源,这对商业软件应用是不利的,所以诺基亚增加了 LGPL 授权 (第一个 L 可以叫 Lesser 宽松版或 Library 开发库版)。使用 LGPL 授权就可以利用 Qt 官方动态链接库,而不必开放商业代码。只要不修改和定制 Qt 库,仅使用 Qt 官方发布的动态链接库就可以不开源,这是商业友好的授权模式。

其实只要不是做商业,就不太需要关注用什么授权,以 GPL 授权发布程序代码就可以了。

如何选择开源协议

世界上的开源协议有上百种,很少有人能彻底搞清它们之间的区别,即使在最流行的六种开源协议——GPL、BSD、MIT、Mozilla、Apache 和 LGPL——之中做选择,也很复杂。

乌克兰程序员 Paul Bagwell 画了一张分析图,说明应该怎么选择开源协议,大家看了一目了然,真是清爽。

Qt --- 基础知识_第3张图片

Qt Creator

Qt是开源的库 Qt Creator是一个集成开发环境  

Qt --- 基础知识_第4张图片

创建项目

  • 选择项目模板

Qt --- 基础知识_第5张图片

  • 填写项目名称和选择路径(不能包含中文和空格!不能包含中文和空格!不能包含中文和空格!)

Qt --- 基础知识_第6张图片

  • 定义编译系统(qmake即可) Qt --- 基础知识_第7张图片

  • 选择窗口类信息

  • 不生成窗体文件

Qt --- 基础知识_第8张图片

  • 选择编译套件(用Qt Creator开发请选择MinGW Minimalist GNU for Windows)

Qt --- 基础知识_第9张图片

main.cpp  

  • 在Qt里面,头文件名称一般就是类名称-->想用哪个类直接包含哪个类的名称就可以把头文件包含进来

  • 一个标准的main函数 argc命令行参数个数-->数组有多少个元素,argv命令行参数数组-->字符串数组

#include "widget.h"              //自己创建的类的头文件 继承于QWidget

#include           //应用程序类
int main(int argc, char *argv[]) //main函数有且只能有一个
{
    QApplication a(argc, argv);  //创建了一个应用程序对象,而且把main函数的参数传递给了应用程序
    Widget w;                    //创建窗口
    w.show();                    //显示窗口
    //while(1);                  //如果用while(1)程序无法响应 无法拖动
    return a.exec();             //死[消息]循环 消息处理 消息监听
}

 widget.h 

#ifndef WIDGET_H                   //防止头文件被重复包含
#define WIDGET_H

#include                  //控件类

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT                      //在Qt中使用信号与槽必须包含的一个宏 写的每个类中必须要把 Q_OBJECT 写在最前面

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

 widget.cpp 

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)            //构造函数初始化参数列表,构造父类
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
}

Widget::~Widget()
{
    delete ui;
}

 text.pro 

Qt项目文件,注释需要用#号

 在源代码中如果要包含某个模块的头文件,必须加载对应的模块

#项目编译时需要加载哪些模块--->文件夹 core核心模块 gui界面模块
QT       += core gui
#QT       += core gui widgets
#当 Qt 版本大于4 Qt5需要额外加上widgets模块
#Qt4以上的版本,gui和Widgets分开了,Qt4之前的版本没有Widgets模块,都在gui中
#Qt5中对gui模块进行了拆分, 将widgets独立出来了
'QWidget' file not found

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

#指定c++版本 让Qt支持c++11标准
CONFIG += c++11

#使用过时的函数API 并且定义了以下宏 编译器会给你警告
# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

#如果您使用任何已标记为不推荐使用的Qt功能,则以下定义使您的编译器发出警告(确切的警告取决于您的编译器)。 
#请参考不推荐使用的API的文档,以了解如何将您的代码移植远离它。
DEFINES += QT_DEPRECATED_WARNINGS


#使用过时的函数API 并且定义了以下宏 编译器会给你报错
# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000   
# disables all the APIs deprecated before Qt 6.0.0

#如果使用过时的API,您还可以使代码无法编译。
#为此,请取消注释以下行。
#您也可以选择仅在特定版本的Qt之前禁用已弃用的API。
#DEFINES + = QT_DISABLE_DEPRECATED_BEFORE = 0x060000    #禁用所有在Qt 6.0.0之前弃用的API

# 项目中的源文件	删除后,项目里不会显示所有的源文件
SOURCES += \
    main.cpp \
    widget.cpp
#SOURCES +=  main.cpp  widget.cpp

#项目中的头文件
HEADERS += \
    widget.h

#项目中的ui文件
FORMS += \
    widget.ui

#部署默认规则
# Default rules for deployment.
#嵌入式平台
qnx: target.path = /tmp/$${TARGET}/bin  
#unix平台              
else: unix:!android: target.path = /opt/$${TARGET}/bin     
!isEmpty(target.path): INSTALLS += target

pro是Qt的工程文件,这个文件是给qmake用来生成Makefile用的

如果了解makefile的人应该知道,Makefile的三个关键点就是目标依赖命令。这里也很类似。pro文件中可以指明这个Qt项目的头文件源文件链接的外部库目标文件名模板(生成什么样的Makefile)版本配置(debug/release)

你可能感兴趣的:(Qt,qt,开发语言,c++)