QT入门篇---无门槛学习

1.1 什么是 Qt

Qt 是⼀个 跨平台的 C++ 图形⽤⼾界⾯应⽤程序框架 。它为应⽤程序开发者提供了建⽴艺术级图形界⾯所需的所有功能。它是完全⾯向对象的,很容易扩展。Qt 为开发者提供了⼀种基于组件的开发模式,开发者可以通过简单的拖拽和组合来实现复杂的应⽤程序,同时也可以使⽤ C++ 语⾔进⾏⾼级开发。
图形⽤⼾界⾯ :指采⽤图形⽅式显⽰的计算机操作⽤⼾界⾯,是计算机与其使⽤者之间的对话接⼝,是计算机系统的重要组成部分。如下分别是:Android ⼿机图形⽤⼾界⾯ 和 IOS ⼿机图形⽤⼾界⾯。
QT入门篇---无门槛学习_第1张图片
QT入门篇---无门槛学习_第2张图片

Qt 的优点

跨平台,⼏乎⽀持所有的平台;
• 接⼝简单,容易上⼿,学习 QT 框架对学习其他框架有参考意义。
• ⼀定程度上简化了内存回收机制;
• 开发效率⾼,能够快速的构建应⽤程序。
• 有很好的社区氛围,市场份额在缓慢上升。
• 可以进⾏嵌⼊式开发。

Qt 的应用场景

桌⾯应用程序
Qt 能够创建各种类型的桌⾯应⽤程序,包括⽂件管理器、媒体播放器、绘图程序等。Qt 应⽤程序⽀持多种操作系统,可以运⾏在 Windows、Linux、macOS 等桌⾯操作系统上。
移动应用程序
Qt ⽀持 Android 和 IOS 移动操作系统,为应⽤程序提供了强⼤的跨平台能⼒。可以使⽤ Qt 构建各种移动应⽤程序,例如社交应⽤、游戏、娱乐等。
嵌⼊式系统
Qt 在嵌⼊式领域应⽤⾮常⼴泛,它可以构建⾯向各种设备的图形应⽤程序,在机顶盒、⻋载娱乐系统、安防监控设备等领域具有⼴泛的应⽤。

Qt 的开发工具概述

Qt Creator

Qt Creator 是⼀个轻量级的跨平台集成开发环境(IDE),专为使⽤ Qt 框架进⾏应⽤程序开发⽽设计。
它是⼀个功能强⼤、易于使⽤、快速且⾼效的⼯具,被⼴泛⽤于编写各种类型的应⽤程序,如桌⾯应用程序、移动应⽤程序和嵌⼊式系统等。
Qt Creator 提供了⼀个可视化的界⾯设计器和代码编辑器,可以帮助开发者更快捷地创建复杂的用户界面和处理各种事件。
它还包含了调试⼯具、版本控制⼯具、⾃动完成和智能提⽰等功能,以及⽀持多语⾔和跨平台的开发环境。

使用 Qt Creator 新建项目

打开 Qt Creator ,在菜单栏中选中: “⽂件” --------> “新建⽂件或项⽬” ;或者使⽤快捷键:Ctrl +n;或者直接点击:“new”;
QT入门篇---无门槛学习_第3张图片
QT入门篇---无门槛学习_第4张图片

选择项目模板

QT入门篇---无门槛学习_第5张图片
新建项⽬对话框⾥有五类项⽬模板

项⽬模板 说明
Application Qt 应⽤程序,包括普通窗体程序和 QtQuick 程序
Library 可以创建动态库、静态库以及 Qt Quick 扩展插件、QtCreator ⾃⾝插件
其他项⽬ 可以创建单元测试项⽬、Qt4 设计师⾃定义控件、⼦⽬录项⽬等
Non-Qt-Project ⾮ Qt 项⽬。可以创建纯 C 或纯 C++ 项⽬
Import Project 导⼊项⽬。从版本控制系统管理的软件项⽬导⼊旧的项⽬

常⽤的只有第⼀类 Application,选择它,在右侧会看到 Qt 应⽤程序的五个⼦模板
Qt Widgets Application:普通窗体模板,传统基于部件的窗体界⾯程序。
• Qt Console Application:Qt 控制台应⽤程序。因为 Qt 主要⽤于图形界⾯设计,这个控制台项⽬模板基本不⽤。
• Qt for Python:在Python下⽤ LGPL 的许可来开发闭源 Qt 软件。
• Qt Quick Application: Qt 提供的⼀种⾼级⽤⼾界⾯技术,使⽤它可以方便快速的为移动以及嵌⼊式设备开发流畅美观的⽤⼾界⾯。Qt Quick 模块是开发 QML 应⽤的标准库,提供了使⽤ QML 创建⽤⼾界⾯所需的⼀切,包括可视化、交互、动画、模型、视图、粒⼦效果以及着⾊效果等。
QT入门篇---无门槛学习_第6张图片
Qt 中的构建⼯具有三种可供选择,分别是:qmake、CMake、Qbs,下⾯依次介绍。
qmake: qmake 是⼀个构建⼯具(build tool),⽤于⾃动⽣成 makefile ⽂件。qmake ⽀持跨平台构建。qmake 编辑的是⼀个后缀名为 .pro 的⽂件。
• CMake:CMake 是⼀个跨平台的构建⼯具。CMake 本⾝不是⼀个编译器,其实就是⽣成⼀个让编译器能读懂编译流程的⽂件⼯具。让 CMake ⾃动⽣成构建系统,例如 Makefile 和 Visual Studio
项⽬⽂件。CMake 是⼀个第三⽅⼯具,有⾃⼰的⽂档。
• Qbs:Qbs(Qt Build Suite:Qt构建套件)同 qmake、CMake ⼀样都是构建⼯具。Qbs 号称是新⼀代的构建⼯具,⽐ qmake 编译速度更快。Qbs 没有绑定 Qt 版本,它从项⽬⽂件的⾼级项⽬描述中⽣成⼀个正确的依赖表。⽽传统的 MakeFile ⽣成⼯具如 qmake 和 CMake ,其在⽣成 MakeFile⽂件后将实际的命令交给 Make ⼯具去执⾏。
QT入门篇---无门槛学习_第7张图片

认识 Qt Creator 界面

QT入门篇---无门槛学习_第8张图片
在编辑模式下,左边竖排的两个窗⼝叫做 “边栏” 。① 是项⽬⽂件管理窗⼝,② 是打开⽂件列表窗⼝。在 QtCreator 菜单 “控件” -------> “Show Left Sidebar”,或者使⽤快捷键:“Alt + 0” 可以控制边栏的显⽰和隐藏。

代码编辑区

QT入门篇---无门槛学习_第9张图片

UI设计界面

双击 widget.ui ⽂件,Qt Creator 会⾃动进⼊设计模式,可以对图形界⾯进⾏可视化编辑:
QT入门篇---无门槛学习_第10张图片
①:组件选择窗⼝。组件选择窗⼝分为多个组,如 Layouts、Buttons、Display Widgets 等,界⾯设计的常⻅组件都可以在组件选择窗⼝中找到。
②:UI 设计窗⼝。如果要将某个组件放置到该窗⼝上时,从组件选择窗⼝上拖放⼀个组件到窗体上即可。
③:动作编辑窗⼝。动作编辑窗⼝包括 Action Editor 以及 Signals 和 Slots 编辑器。 Action Editor 主要是⽤来新建 Action,并且通过拖拽的动作,将新建好的 Action 添加到菜单栏和⼯具栏上;Signals和 Slots 编辑器⽤于可视化地进⾏信号与槽的关联。
④:对象浏览窗⼝。⽤树状视图显⽰窗体上各组件之间的布局包含关系,视图有两列,显⽰每个组件的对象名称(ObjectName)和类名称。
⑤:属性设置窗⼝。显⽰某个选中的组件或窗体的各种属性及其取值,可以在属性设置窗⼝⾥修改这些属性的值。

Qt Hello World 程序

使⽤ “按钮” 实现

纯代码⽅式实现

QT入门篇---无门槛学习_第11张图片
QT入门篇---无门槛学习_第12张图片

可视化操作实现

(1)双击:" widget.ui " ⽂件;
QT入门篇---无门槛学习_第13张图片
(2)拖拽控件⾄ ui 界⾯窗⼝并修改内容;
QT入门篇---无门槛学习_第14张图片

使⽤ “标签” 实现

纯代码⽅式实现

QT入门篇---无门槛学习_第15张图片

可视化操作实现

(1)双击:" widget.ui " ⽂件;
QT入门篇---无门槛学习_第16张图片
(2)拖拽 “标签” ⾄ UI 设计界⾯中,并双击修改标签内容;
QT入门篇---无门槛学习_第17张图片

项目⽂件解析

.pro ⽂件解析

⼯程新建好之后,在⼯程⽬录列表中有⼀个后缀为 “.pro” 的⽂件, “.pro” ⽂件就是⼯程⽂件 (project),它是 qmake ⾃动⽣成的⽤于⽣产 makefile 的配置⽂件。如图所⽰:
QT入门篇---无门槛学习_第18张图片

双击进⼊该⽂件,该⽂件的核⼼内容如下:
QT += core gui // Qt 包含的模块
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets //⼤于 Qt4 版本才包含 widget 模块
TARGET = QtFirst //应⽤程序名⽣成的 .exe 程序名称
TEMPLATE = app //模板类型,应⽤程序模板
SOURCES += main.cpp\ //源⽂件
widget.cpp //源⽂件
HEADERS += widget.h //头⽂件

widget.h ⽂件解析

在Qt中,如果要使⽤信号与槽(signal 和 slot)的机制 就必须加⼊ Q_OBJECT 宏;
Ui::Widget *ui; 这个指针是⽤前⾯声明的 namespace Ui ⾥的 Widget 类定义的,所以指针 ui 是指向可视化设计的界⾯,后⾯要访问界⾯上的组件,都需要通过这个指针 ui 去访问。
QT入门篇---无门槛学习_第19张图片

main.cpp ⽂件解析

使⽤ Qt Creator 新建任意⼯程之后,main.cpp ⽂件中都会⾃动⽣成如下代码
QT入门篇---无门槛学习_第20张图片

  1. Qt 系统提供的标准类名 声明头⽂件没有 .h 后缀;
  2. Qt ⼀个类对应⼀个头⽂件,类名 就是 头⽂件名;
  3. QApplication 为应⽤程序类;QApplication a;(a为应⽤程序对象,有且仅有⼀个。)
    ⚫ QApplication 管理图形⽤⼾界⾯应⽤程序的控制流和主要设置。
    ⚫ QApplication 是 Qt 的整个后台管理的命脉。它包含主事件循环,在其中来⾃窗⼝系统和其它
    资源的所有事件处理和调度。它也处理应⽤程序的初始化和结束,并且提供对话管理。
    ⚫ 对于任何⼀个使⽤ Qt 的图形⽤⼾界⾯应⽤程序,都正好存在⼀个 QApplication 对象,⽽不论
    这个应⽤程序在同⼀时间内是不是有 0、1、2 或更多个窗⼝。
  4. myWidget w; //实例化窗⼝对象
  5. w.show(); //调⽤show函数显⽰窗⼝
  6. a.exec() :程序进⼊消息循环,等待对⽤⼾输⼊进⾏响应。这⾥ main()把控制权转交给Qt,Qt 完
    成事件处理⼯作,当应⽤程序退出的时候 exec() 的值就会返回。在 exec() 中,Qt 接受并处理⽤⼾
    和系统的事件并且把它们传递给适当的窗⼝部件。

widget.cpp ⽂件解析

QT入门篇---无门槛学习_第21张图片

认识对象模型(对象树)

在 Qt 中创建很多对象的时候会提供⼀个 Parent 对象指针,下⾯来解释这个 parent 到底是⼲什么的。
• QObject 是以对象树的形式组织起来的。
◦ 当创建⼀个 QObject 对象时,会看到 QObject 的构造函数接收⼀个 QObject 指针作为参数,这个参数就是 parent,也就是⽗对象指针。
◦ 这相当于,在创建 QObject 对象时,可以提供⼀个其⽗对象,我们创建的这个 QObject 对象
会⾃动添加到其⽗对象的 children() 列表。
◦ 当⽗对象析构的时候,这个列表中的所有对象也会被析构。(注意,这⾥的⽗对象并不是继承意义上的⽗类!)
这种机制在 GUI 程序设计中相当有⽤。例如,⼀个按钮有⼀个 QShortcut(快捷键)对象作为其⼦对象。当删除按钮的时候,这个快捷键理应被删除。这是合理的。
• QWidget 是能够在屏幕上显⽰的⼀切组件的⽗类。
◦ QWidget 继承⾃ QObject ,因此也继承了这种对象树关系。⼀个孩⼦⾃动地成为⽗组件的⼀个⼦组件。因此,它会显⽰在⽗组件的坐标系统中,被⽗组件的边界剪裁。例如,当⽤⼾关闭
⼀个对话框的时候,应⽤程序将其删除,那么,我们希望属于这个对话框的按钮、图标等应该⼀起被删除。事实就是如此,因为这些都是对话框的⼦组件。
◦ 当然,我们也可以⾃⼰删除⼦对象,它们会⾃动从其⽗对象列表中删除。⽐如,当我们删除了⼀个⼯具栏时,其所在的主窗⼝会⾃动将该⼯具栏从其⼦对象列表中删除,并且⾃动调整屏幕显⽰。
Qt 引⼊对象树的概念,在⼀定程度上解决了内存问题。
• 当⼀个 QObject 对象在堆上创建的时候,Qt 会同时为其创建⼀个对象树。不过,对象树中对象的顺序是没有定义的。这意味着,销毁这些对象的顺序也是未定义的。
• 任何对象树中的 QObject 对象 delete 的时候,如果这个对象有 parent,则⾃动将其从 parent 的children() 列表中删除;如果有孩⼦,则⾃动 delete 每⼀个孩⼦。Qt 保证没有 QObject 会被delete 两次,这是由析构顺序决定的。
Qt 引⼊对象树的概念,在⼀定程度上解决了内存问题。
当⼀个 QObject 对象在堆上创建的时候,Qt 会同时为其创建⼀个对象树。不过,对象树中对象的顺序是没有定义的。这意味着,销毁这些对象的顺序也是未定义的。
任何对象树中的 QObject 对象 delete 的时候,如果这个对象有 parent,则⾃动将其从 parent 的children() 列表中删除;如果有孩⼦,则⾃动 delete 每⼀个孩⼦。Qt 保证没有 QObject 会被delete 两次,这是由析构顺序决定的。
如果 QObject 在栈上创建,Qt 保持同样的⾏为。正常情况下,这也不会发⽣什么问题。来看下⾯的代码⽚段:
QT入门篇---无门槛学习_第22张图片
作为⽗组件的 window 和作为⼦组件的 quit 都是 QObject 的⼦类(事实上,它们都是QWidget的⼦
类,⽽QWidget 是 QObject 的⼦类)。这段代码是正确的,quit 的析构函数不会被调⽤两次,因为标准 C++ 要求,局部对象的析构顺序应该按照其创建顺序的相反过程。因此,这段代码在超出作⽤域时,会先调⽤ quit 的析构函数,将其从⽗对象 window 的⼦对象列表中删除,然后才会再调⽤window 的析构函数。
但是,如果我们使⽤下⾯的代码:
QT入门篇---无门槛学习_第23张图片
情况⼜有所不同,析构顺序就有了问题。我们看到,在上⾯的代码中,作为⽗对象的 window 会⾸先被析构,因为它是最后⼀个创建的对象。在析构过程中,它会调⽤⼦对象列表中每⼀个对象的析构函数,也就是说, quit 此时就被析构了。然后,代码继续执⾏,在 window 析构之后,quit 也会被析构,因为 quit 也是⼀个局部变量,在超出作⽤域的时候当然也需要析构。但是,这时候已经是第⼆次调⽤ quit 的析构函数了,C++ 不允许调⽤两次析构函数,因此,程序崩溃了。
由此我们看到,Qt 的对象树机制虽然在⼀定程度上解决了内存问题,但是也引⼊了⼀些值得注意的事情。这些细节在今后的开发过程中很可能时不时跳出来烦扰⼀下,所以,我们最好从开始就养成良好习惯。
注意:在 Qt 中,尽量在构造的时候就指定 parent 对象,并且⼤胆在堆上创建。
QT入门篇---无门槛学习_第24张图片

你可能感兴趣的:(qt,学习,开发语言)