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 可以做什么?
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。
当然好消息是 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 Creator
Qt是开源的库 Qt Creator是一个集成开发环境
创建项目
选择项目模板
填写项目名称和选择路径(不能包含中文和空格!不能包含中文和空格!不能包含中文和空格!)
定义编译系统(qmake即可)
选择窗口类信息
不生成窗体文件
选择编译套件(用Qt Creator开发请选择MinGW
Minimalist GNU for Windows
)
main.cpp
在Qt里面,头文件名称一般就是类名称-->想用哪个类直接包含哪个类的名称就可以把头文件包含进来
一个标准的main函数 argc命令行参数个数-->数组有多少个元素,argv命令行参数数组-->字符串数组
#include "widget.h" //自己创建的类的头文件 继承于QWidget#include <QApplication> //应用程序类
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 <QWidget> //控件类QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass 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 foundgreaterThan(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 基础知识一(QT安装、创建项目、常用窗口控件使用、信号与槽机制讲解)
QT概念 Qt:Qt是一个跨平台的C++框架(C++库),Qt除了支持界面设计(GUI编程),还封装了与网络编程.多线程.数据库连接.视频音频等相关的功能. ctrl 撤销(返回上一步) 市面常见的G ...
- QT基础知识学习(二)——制作一个简单菜单界面
目录 一.界面简介 二.代码展示并讲解 一.界面简介 界面包括五个部分:菜单栏.工具栏.状态栏.核心控件和浮动窗口,制作的项目适用于PC端使用,应该用 QMainWindow类. 二.代码展示并讲解 ...
- qt checkbox 选中事件_Qt基础知识学习
Qt基础知识学习 Qt C++ SQLite ★★★★★ Qt · 简介 Qt是由Qt Company开发的面向对象的跨平台C++图形用户界面应用程序开发框架. 前期 · 准备 01 辨析Qt(开 ...
- ROS Qt环境的搭建及基础知识介绍
ROS Qt环境的搭建及基础知识介绍 文章目录 ROS Qt环境的搭建及基础知识介绍 1. 开发环境搭建 1.1 qtcreator安装 1.2 catkin_create_qt_pkg环境配置 1. ...
- Qt 线程(00):线程基础知识【官翻】
线程的基础知识 什么是线程? 线程和进程一样,都是并行的.那么线程和进程有什么不同呢?当你在电子表格上进行计算时,可能还有一个媒体播放器在同一台桌面上播放你最喜欢的歌曲.下面是两个并行工作的进程的例子 ...
- C++实战手把手教您用ffmpeg和QT开发播放器--01音视频基础知识
笔记:https://blog.csdn.net/tainjau/article/category/9272757 音视频基础知识 封装.解码.重采样.像素格式 1.MPEG-4 MPEG-4标准将众 ...
- SAP SD基础知识之凭证流(Document Flow)
SAP SD基础知识之凭证流(Document Flow) 一,根据参考创建Create with reference 可以参考之前的凭证来创建销售凭证,可以在初始画面,也可以在凭证处理过程中,通过u ...
- liteos内核驱动和linux,移植RTOS必备基础知识
1. 基础知识 移植内核对技术的要求比较高.比较细. 1.1 单片机相关的知识 栈的作用 加载地址.链接地址 重定位 几个简单的硬件知识 ○串口 ○定时器 中断的概念 1.2 Linux操作相关的知识 ...
- 计算机知识太多了,计算机基础知识对程序员来说有多重要?
原标题:计算机基础知识对程序员来说有多重要? 科班和培训生同比于自学者的优势就在于这些计算机专业的核心课程(数据结构与算法这种不管科班培训都要学的不算):离散数学.编译原理.计算机组成原理.操作与系统 ...
- 【分享】4412开发板-嵌入式Linux开发须要掌握的基础知识和技能
本文转自迅为电子论坛:http://www.topeetboard.com 1.Linux 基础 安装Linux操作系统 Linux文件系统 Linux经常使用命令 Linux启动过程具体解释 熟悉L ...
最新文章
- 容器退出时我丢失了数据
- acwing算法题--多重背包问题一
- 36氪研究院:机器人行业产业图谱
- 高通QXDM抓modem log
- W600 PWM捕获功能
- android分辨率px跟dp,Android屏幕适配 px,dp,dpi及density的关系与深入理解
- (8)Linux内核中的hash与bucket
- JAVA 类加载机制学习笔记
- 如何停止CSS3的动画?
- 数据库学习--DQL(数据库查询语言)
- Node-ES6模块化
- Oracle Sequence创建与使用
- 安平仓管王 5000xp v2.9 免费下载
- 谷歌浏览器xpath插件的安装
- python拦截广告弹窗_电脑总是有弹窗广告,真的烦人,一招教你解决!
- 计算机桌面体验,如何安装win10的桌面体验功能?
- 5-1 厘米换算英尺英寸 (15分)
- java批处理查询_java 实现批量查询
- android实现跑马灯效果,Android用过TextView实现跑马灯效果的示例
- Netfilter 内核数据包过滤框架