QT学习笔记(1)----- QT简介

本文详细介绍了Qt框架的历史背景、核心特点及应用领域。从Qt的名字由来到其发展历程,再到跨平台特性和开发工具的使用,全面解析Qt在桌面、嵌入式及移动设备上的开发优势。

名字由来

在《C++ GUI Programming with Qt 4》里有这么一段介绍:
A Brief Histroy of Qt:
The letter 'Q' was chosen as the class prefix because the letter looked beautiful in Haavard's Emacs font. The 't' was added to stand for "toolkit", inspired by Xt, the X Toolkit. The company was incorporated on March 4, 1994,originally as Quasar Technologies, then as Troll Tech, and today as Trolltech.
说白了,Qt不是某几个单词的缩写,而是一个拼凑,情况是,Q这个字符在Haavard's Emacs字体下显得很漂亮,所以选Q作为这个框架的名字的开头前缀,t是表示工具集的意思,来自toolkit的首字母,拼起来就成了Qt,所以就是Qt这个名字命名的由来

 

什么是Qt

Qt是一个针对桌面、嵌入式、移动设备的一个跨平台的应用程序开发框架,支持的平台包括Linux、OS X、Windows、VxWorks、QNX、Android、iOS、BlackBerry(黑莓)、Sailfish OS(旗鱼操作系统)等。

Qt 1991年由Trolltech-奇趣科技(成立于1994年)开发,2008年,Trolltech被Nokia收购,2012年,Qt被Digia收购

Qt是基于C++编写的框架,它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器,它提供了在网络,数据库,OpenGL,Web技术,传感器,通信协议(蓝牙,串行端口,NFC),XML和JSON处理,打印,PDF生成等领域的跨平台开发的模块。预处理器,MOC(全称:Meta-Object Compiler-元对象编译器)用于扩展C++,如:信号和槽的特性。在编译之前,先使用MOC分析Qt扩展的C++源文件(检测是否包含Q_OBJECT宏),然后生成符合C++标准的源文件(新文件名将会由moc_加上原文件名构成)。因此框架本身和应用程序/库使用它能被任何符合标准C++的编译器(像Clang、GCC、 ICC、MinGW 和MSVC)所编译。

 

发展史

Qt的第一个商业版本于1995年推出,随后Qt的发展就很快了,下面是Qt发展史上的一 些里程碑,从之前的Qt1.x开始到现在的Qt5.x。

QT分为4.0版本和5.0版本他们之间的差别很大,不通用!!!不通用!!!不通用!!!

Qt1-3

版本发布日期
1.4010 July 1998
1.412 October 1998
1.4219 December 1998
1.4413 March 1999
2.026 June 1999
2.113 April 2000
2.27 December 2000
2.38 March 2001
3.016 October 2001
3.114 November 2001
3.224 July 2003
3.35 February 2004

Qt4

Trolltech在2005年6月28发布了Qt4.0,介绍了框架的五个新技术:

  1. 一套模板容器类
  2. 为item views提供了一套模型 - 视图 - 控制器体系结构
  3. 二维绘图框架
  4. 为低级文本布局提供了Unicode文本渲染器的公共API
  5. 基于Action的MainWindow,包括:工具栏,菜单和停靠体系
版本发布日期新特性
4.120 December 2005推出集成SVG微小的支持,一个PDF的后端Qt打印系统,以及其他一些功能。
4.24 October 2006介绍了Windows Vista的支持,部件的CSS样式支持,以及QGraphicsView框架-在屏幕上高效渲染成千上万个2D对象,以取代Qt3.x中的QCanvas类。
4.330 May 2007改进了Windows Vista支持,改进了OpenGL引擎、SVG文件的生成,增加了QtScript(基于QSA的ECMAScript脚本引擎)。
4.46 May 2008特性包含了改进multimedia的支持(使用Phonon),增强XML支持,集中共享内存的IPC框架,以及WebKit集成。
4.53 March 2009主要包括功能有QtCreator,改进图形引擎,WebKit的集成,OpenDocument格式写入支持和新的许可选项,以及OS X Cocoa框架的支持。
4.61 December 2009新的API框架-动画、手势、多点触控。支持Symbian、Windows 7和Mac OS X 10.6,支持扩展一些Unix系统。也取得了整体性能的改进。
4.721 September 2010QML 和 Qt Quick
4.815 December 2011Qt的平台抽象化,支持单线程OpenGL,多线程HTTP,优化了文件系统访问。

Qt5

Qt5于2012年12月19正式发布,这个新版本标志着平台的重大变化,硬件加速的显卡,QML和JavaScript发挥了重要作用。传统的C++ - 仅QWidgets继续得到支持,但没有从新体系结构的性能改进中受益,Qt5带来了速度及用户界面上的显著改进,Qt5开发框架移动至qt-project.org。外部开发者可以为Digia公司提交补丁,并让他们审查。

版本发布日期新特性
5.019 December 2012对Qt4.x进行一系列重大改革。完成Wayland的支持。
5.13 July 2013新模块以及Android和iOS实验性的支持技术预览。
5.212 December 2013第一个官方支持Android和iOS的版本。
5.320 May 2014集中于稳定性和可用性
5.410 December 2014完整的WinRT和Windows Phone支持。介绍基于Chromium的Qt WebEngine内部组件,将在未来的版本中取代QtWebKit。动态的GL图形切换在Windows(ANGLE或OpenGL)后台,本地化的“外观和感觉”在QtQuick的控制在Android平台的后端,引入Qt WebChannels提供QObject到WebSockets的桥梁。最初仅使用Qt WebKit的集成,但还正在5.5下进行Qt WebEngine集成
5.51 July 2015Qt5.5根据官方网站提供的功能:新模块: Qt 3D、Qt Canvas 3D、Qt Location。过时的模块的:Qt WebKit、Qt Declarative (Qt Quick 1)、Qt Script。蓝牙API的最终版本,新的视频过滤框架,Camera和QML MediaPlayer改善iOS,适用于Linux的NFC,SSL/TLS改进Qt Network
5.6Alpha release: 8 September 2015 Final release plan: 8 December 2015值得注意的改进:Qt Core:一些性能改进,包括减少动态性能的内存使用情况和性能最佳化的QString Qt Network:支持HTTP重定向 Qt GUI:改进了跨平台的OpenGL ES3.0和3.1 Qt Multimedia:添加QML类型播放列表 Qt WebEngine:基于Chromium 45,自定义URL方案的API,拦截和阻止网络请求,并跟踪或阻止Cookie QtQML:减少内存消耗 嵌入式平台:支持Intel Atom-based NUCs 过时的模块:Qt Script、Qt Enginio 已删除模块:Qt WebKit, Qt Declarative (Qt Quick 1)

平台支持

Qt支持下述平台:

  1. MS/Windows - 95、98、NT4.0、ME、2000、XP 、Vista、Win7、win8、win2008、win10
  2. Unix/X11-Linux、SunSolaris、HP-UX、CompaqTru64 UNIX、IBMAIX、SGI IRIX、FreeBSD、BSD/OS和其它很多X11平台
  3. Macintosh -Mac OS X
  4. Embedded - 有帧缓冲(framebuffer)支持的嵌入式Linux平台,Windows CE
  5. Symbian、Symbian^3、Symbian Anna、Symbian Belle、MeeGo

优点

Qt同X Window上的 Motif、Openwin、GTK 等图形界面库和 Windows平台上的 MFC、OWL、VCL、ATL是同类型的东西,但是 Qt 具有下列优点:

  • 优良的跨平台特性: 
    Qt支持下列操作系统: Microsoft Windows 95/98, Microsoft Windows NT, Linux, Solaris, SunOS, HP-UX, Digital UNIX (OSF/1, Tru64), Irix, FreeBSD, BSD/OS, SCO, AIX, OS390,QNX 等等。

  • 面向对象 
    Qt 的良好封装机制使得 Qt 的模块化程度非常高,可重用性较好,对于用户开发来说是非常 方便的。 Qt 提供了一种称为 signals/slots 的安全类型来替代 callback,这使得各个元件 之间的协同工作变得十分简单。

  • 丰富的 API 
    Qt包括多达250个以上的C++类,还替供基于模板的collections、serialization、 file、I/O device、 directory management、date/time 类。甚至还包括正则表达式的处理功能。

  • 支持 2D/3D 图形渲染,支持 OpenGL

  • 大量的开发文档

  • XML 支持

Qt Creator

简介

在发布 Qt 4.6 的同时,作为 Qt 开发跨平台 IDE 的Qt Creator也发布了更新版本。Qt Creator 1.3 和 Qt 4.6共同构成的 Qt SDK,包含了开发跨平台应用程序所需的全部功能。

Qt Creator是一个用于Qt开发的轻量级跨平台集成开发环境。Qt Creator可带来两大关键益处:提供首个专为支持跨平台开发而设计的集成开发环境 (IDE),并确保首次接触Qt框架的开发人员能迅速上手和操作。即使不开发Qt应用程序,Qt Creator也是一个简单易用且功能强大的IDE。

Qt Creator 包括项目生成向导、高级的 C++ 代码编辑器、浏览文件及类的工具、集成了 Qt Designer、Qt Assistant、Qt Linguist、图形化的 GDB 调试前端,集成 qmake 构建工具等。

功能和优势

QtCreator 主要是为了帮助新 Qt 用户更快速入门并运行项目,还可提高有经验的 Qt 开发人员的工作效率。

  • 使用强大的 C++ 代码编辑器可快速编写代码

语法标识和代码完成功能输入时进行静态代码检验以及提示样式上下文相关的帮助代码折叠括号匹配和括号选择模式高级编辑功能

  • 使用浏览工具管理源代码

集成了领先的版本控制软件,包括 Git、Perforce 和 Subversion开放式文件,无须知晓确切的名称或位置搜索类和文件跨不同位置或文件沿用符号在头文件和源文件,或在声明和定义之间切换

  • 为Qt跨平台开发人员的需求而量身定制

集成了特定于 Qt 的功能,如信号与槽 (Signals & Slots)图示调试器, 对 Qt 类结构可一目了然集成了 Qt Designer 可视化布局和格式构建器只需单击一下就可生成和运行 Qt 项目

Qt Designer

Qt Designer被称为Qt设计师,用于设计和构建图形用户界面(Qt Widgets)。你可以组合和自定义窗口或对话框(所见即所得),并使用不同的风格和分辨率进行测试。用Qt Designer创建的窗口部件和表格无缝集成编程代码,采用Qt信号和槽机制,这样就可以轻松地分配图形元素的行为。在Qt设计师中设置的所有属性可以动态地在代码中进行更改。此外,类似插件推广和自定义插件功能,可以使用自己的组件来使用Qt Designer。

注意:你也可以选择使用Qt Quick来设计用户界面,而不是Qt Widgets。这样更容易写各种各样的应用。它可以完全定制外观,触摸反应的元素,流畅的动画过渡,支持OpenGL图形加速功能。如果刚接触Qt Designer,可以看看Qt设计师文档。有关如何使用Qt设计师,请参阅Qt设计师快速入门。

Qt Linguist

简介

Qt Linguist被称为Qt语言家。主要任务是读取翻译文件、为翻译人员提供友好的翻译界面,是用于界面国际化的重要工具。它能帮助你很容易读懂C++语言。

使用方式

lupdate可以把.h、.cpp、.ui中需要翻译的字符串提取出来形成.ts文件,然后用linguist翻译。用lerealse生成.qm。

翻译一个含有tr()调用的Qt应用程序需要以下三步: 
1. 运行ludate,从应用程序的源代码中提取所有用户可见的字符串。 
2. 使用Qt Linguist翻译该应用程序。 
3. 运行lrelease,生成二进制.qm文件,应用程序可以使用QTranslator加载这个文件。 
如果开发工程中出现翻译改动,可以多次执行此过程!

Qt Assistant

Qt Assistant被称为Qt助手,是Qt自带的一款可定制、可重新发行的帮助文件浏览器。它支持HTML文件,用户可以利用其定制自己的功能强大的帮助文档浏览器。

 

===================================常见问答=======================================

1、Qt能在哪些平台使用?

这里的平台是指操作系统,不是指CPU。Qt可以在Windows、Linux、Android、iOS、mac OS、QNX、VxWorks下使用。

把Linux移植到ARM上,也是能跑Qt开发出来的软件的。

2、Qt是开源的,还是收费的?

是开源的,需要遵循LGPL或GPL协议。

3、Qt是使用什么语言开发的?

建议底层用C++做业务逻辑,上层用QML做图形界面。也可以纯C++开发,但是做界面时会比较累。

4、什么是Qt Quick,什么是QML,两者有什么关系?

Qt Quick只是一种技术名称,它本身不指代任何语言,但是,当别人说到Qt Quick一般是指用QML快速开发图形界面。

QML是一种类似于CSS和JAVA Script的混合语言,语法非常简单易学,适合没什么编程经验的人。

5、什么是Qt Creator?

Qt Creator是Qt官方的IDE,专门用Qt框架开发图形界面的。

6、除了Qt Creator,还有什么IDE可以用?

目前比较流行的是Visual Studio,简称VS。Qt Creator一安装好就能使用,但是VS是需要自己设置才可以用。

这里要特别注意的:VS使用的是msvc编译器,Qt Creator使用的是Mingw 32编译器,这两个编译器编译出来的库并不通用。

7、Qt Creator的原生编辑器有Vi / Vim模式吗?

有,叫Fake Vim,按照下图设置即可。

 

8、新手入门应该学哪个版本的Qt?

应该学最新的Qt5,推荐教材《Qt Creator快速入门》、《Qt Quick核心编程》,以及官方自带的英文文档。

9、哪里能找到Qt的官方文档?

打开Qt Creator,如下图,Help,就是了。

有某些方法,文档上并没有写,但是实际上是存在的。这时需要利用代码补全。

10、什么是pyQt?

pyQt是指用python脚本语言来调用Qt框架,从而快速开发图形界面。但是商业使用pyQt,是要收费的。

pyQt4请看《PyQt编程指南》。pyQt5请看《PyQt5快速开发与实战》。

推荐《pyQt5参考手册》、《PyQt5 tutorial》。

11、我现在只学习C、C++语法,不做图形界面,可以使用Qt Creator编译、运行代码吗?

可以。Qt Creator自带MinGW编译器可以编译C、C++。但不是所有从Qt官网下载的安装包,都带有MinGW编译器,下载时需特别注意。

新建工程时,使用以下工程模板即可。

12、如何使用Qt开发3D图形界面?

可以使用Open GL,请参考《QT OpenGL教程》。

13、为什么随便写一个Hello World,编译出来都30几MB?

因为Qt默认使用动态编译,所以编译出来体积超大。可以使用UPX压缩壳。

14、怎样使用Qt静态编译代码?

请参考《Qt5.9.0 MingGW静态编译》,建议下载现成的静态库。

静态编译出来的文件非常大,建议使用UPX压缩壳

其中,静态编译Qt5.7.0,需要卸载VC6.0,否则config不过。

15、怎样使用Qt发布应用?

动态编译的话,可以使用Qt Creator自带的windeployqt

动态编译后,可以使用NSIS制作成安装包。

静态编译,再加UPX压缩壳,即可发布,而且是单一文件。

16、怎样把Qt的代码,移植到ARM?

你需要使用交叉编译器Arm Gcc,并设置硬件相关的参数。

17、Qt用在Android、OS X上面多吗?

不多,所以不建议使用Qt开发Android、OS X的app。

18、Qt用在哪些地方比较多?

嵌入式开发、桌面开发。

19、哪里能下载到Qt?

https://www.qt.io/download-open-source/#section-2

在官网注册账号,登录,就可以在以上页面下载Qt了。

不想注册的话,也可以使用国内的镜像。

http://mirrors.ustc.edu.cn/qtproject/official_releases/qt/

20、Qt4和Qt5有什么区别?

Qt4一行代码,即可全局支持中文,Qt5默认支持中文。

Qt4不支持串口,需要使用第三方的串口库,Qt5支持串口。

此外,Qt4和Qt5还有很多区别,这里不一一列举。

21、有哪些好用的Qt第三方库?

第三方库,不是Qt官方开发的,而是由其它组织开发的。

比较出名的是QWT库,使用QWT库,可以轻松搞定各种图形界面,如:饼状图、示波器图、波特图等。

然而,QT自带的QtCharts比QWT库还要好用。QtCharts支持C++和QML混合编程,而QWT只支持C++。

QWT已经很久不更新了,所以,有的人会使用qcustomplot,它也是一个画图的第三方库。

22、哪里可以在线浏览Qt的类?

http://doc.qt.io/qt-5/classes.html

23、哪里可以在线浏览Qml的类型?

http://doc.qt.io/qt-5/qmltypes.html

24、怎样读取USB设备的信息?

可以使用WIN32的API捕获USB的消息(#include <windows.h>),或者使用libusb。

25、哪些版本的QT可以支持XP系统?

Qt5.7.0及之前的版本都可以支持XP。Qt5.7.0可以直接支持XP,但是有可能会弹出警告。

26、如何设置全局快捷键、获取全局鼠标坐标?

设置全局快捷键可以使用第三方库qxtglobalshortcut

获取全局鼠标坐标可以用QCursor::pos()。

27、如何设置窗口快捷键,应用程序快捷键?

C++的话,可以使用QShortCut类,QML可以使用ShortCut。

但是QShortCut和ShortCut,只在窗口或应用程序在focus时,才能使用快捷键,并非全局快捷键。

28、如何显示系统托盘?

Qt5.8或以上版本,可以使用QML的SystemTrayIcon;或者使用C++的QSystemTrayIcon类。

Qt5.8以下的版本(不含5.8)只能使用C++的QSystemTrayIcon类。

29、Qt的动态编译文件太多,如何打包成一个文件?

使用Enigma Virtual Box,但是可能会被杀毒软件杀掉。

使用NSIS制作成安装包。

使用第14点的静态编译。

30、C++有哪些第三方库?

除了C++自带的库(如STL库)以外的,还有第三方库

较为出名的是Boost库,推荐《Boost程序库完全开发指南》。

31、如何让Qt运行单一实例进程?

可以使用QtSingleApplication

32、如何实现命令行程序?

可以使用QCommandLineParser和QCommandLineOption。

33、如何使用Open CV?

使用Qt Creator的话,请参考《用Qt Creator编译opencv并配置开发环境

使用VS的话,请参考《OpenCV3.1.0+VS2015开发环境配置

34、如何使用Qt Creator编译出64位机的应用程序?

请使用Mingw-w64或者msvc 64 bit

35、Widget和Qml可以共存在一个窗口吗?

可以用QQuickWidget和qml交互。请参考《Qml嵌入Widget以及Qml与Widget交互》。

36、怎样制作音视频播放器?

可以使用VLC-QT

37、如何编译Open SSL?

VS编译Open SSL》。

Mingw编译Open SSL》。

 

### Qt信号与槽机制学习教程 #### 一、基础概念 为了使用信号槽,类必须是从`QObject`派生而来,这是因为信号槽机制依赖于Qt的元对象系统[^1]。 #### 二、简单示例 下面是一个简单的例子来展示如何创建并连接两个自定义信号。这个案例展示了如何在一个按钮点击事件发生时触发另一个窗口部件中的特定行为: ```cpp // mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include "showvoid.h" namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = nullptr); ~MainWindow(); signals: void SendVoid(); // 定义一个无参信号 private slots: void on_pushButton_clicked(); private: Ui::MainWindow *ui; ShowVoid* showVoidInstance; // 创建ShowVoid实例 }; #endif // MAINWINDOW_H // mainwindow.cpp #include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); showVoidInstance = new ShowVoid(); // 连接按钮点击信号到SendVoid信号上 connect(ui->pushButton, SIGNAL(clicked()), this, SIGNAL(SendVoid())); // 将当前窗口组件的SendVoid信号连接至其他组件的方法或信号 connect(this,SIGNAL(SendVoid()),showVoidInstance,SLOT(handleSignal())); } MainWindow::~MainWindow() { delete ui; } ``` 在这个例子中,在构造函数里加入了`connect`调用语句,其中第四个参数指定了要关联的目标信号名称。当按钮被按下(`clicked`)的时候,不仅会发出自身的信号,还会立即触发展示窗口内的相应处理逻辑[^2]。 #### 三、进一步理解 对于更深入的理解,可以尝试构建更加复杂的场景,比如多级信号传递链路的设计;也可以研究官方文档其他开源项目的源码实现方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值