Qt是一个成熟而强大的框架,可用于跨多个平台交付复杂的应用程序。它广泛用于嵌入式设备,包括电视,卫星机顶盒,医疗设备,汽车仪表板等。它在Linux领域也有悠久的历史,广泛使用KDE和Sailfish OS,并且使用Qt开发了商店中的许多应用程序。在过去的几年中,它还在移动领域取得了长足的进步。但是,在Microsoft Windows和Apple Mac OS X世界中,C#/。NET和Objective-C / Cocoa的统治地位意味着Qt经常被忽略。
本书旨在演示Qt框架的强大功能和灵活性,并展示如何编写一次应用程序并将其部署到多个操作系统桌面。我们将从头开始构建一个完整的,真实世界的业务线(LOB)解决方案,其中包含独特的库,用户界面和单元测试项目。
我们将介绍如何使用QML构建现代的响应式用户界面,并将其连接到丰富的C ++类。我们将使用QMake控制项目配置和输出的各个方面,包括平台检测和条件表达式。我们将构建可以在JSON和JSON之间进行序列化的“自觉”数据实体。我们将把这些数据实体保存在数据库中,并学习如何查找和更新它们。我们将联系互联网并使用RSS提要。最后,我们将生成一个安装包,以便可以将应用程序部署到其他计算机上。
在本章中,我们将安装和配置Qt框架以及相关的集成开发环境(IDE)Qt Creator。我们将创建一个简单的便笺本应用程序,在本书的其余部分中将使用它来演示各种技术。我们将涵盖以下主题:
- 安装Qt
- 维护您的安装
- Qt创作者
- Scratchpad项目
- qmake
安装Qt
首先,请访问Qt网站https://www.qt.io:
网站布局变化相当频繁,但是您要寻找的是下载Qt Open Source for Desktop&Mobile:
- 从顶层菜单中,选择“产品”,然后选择“ IDE和工具”
- 单击免费开始
- 选择桌面和移动应用程序
- 单击获取您的开源软件包
警告:如果您在这些个人项目之外继续使用Qt,请确保您阅读了Qt网站(https://www.qt.io/licensing/)上可用的许可信息。 如果您的项目范围需要Qt商业Qt许可证,或者想要获得Qt官方支持以及与Qt公司建立紧密战略关系的好处,请升级到Qt商业许可证。
该站点将检测到您的操作系统并建议下载:
在Windows上,建议您使用联机安装程序* .exe文件,而在Linux上,则建议您使用* .run文件,如果运行Mac OS X,则提供.dmg文件。在所有情况下,请下载并启动安装程序。 :
警告:在Linux上,一旦下载,您可能需要先导航到* .run文件并将其标记为可执行文件才能启动它。 为此,请在文件管理器中右键单击该文件,然后单击“属性”。 单击“权限”选项卡,然后勾选“允许将文件作为程序执行”框。
在初始欢迎对话框之后,向您展示的第一件事是选择注册或使用Qt帐户登录的选项。 如果您愿意,可以随意创建一个,但是现在,我们将继续并跳过:
然后,要求您选择要安装的组件。
您的第一个决定是所需的Qt框架版本。您可以并排安装多个版本。让我们选择最新的和最大的版本(在撰写本文时为Qt 5.10),并保留所有较旧的版本为未选中状态。
接下来,展开选定的版本,您将看到第二个选项列表。说明中显示为“ ...的Qt 5.9.x预制组件”的所有选项都是所谓的套件。套件本质上是一个工具集,使您可以使用特定的编译器/链接器构建应用程序并在特定的目标体系结构上运行它。每个工具包都附带专门针对该特定工具集编译的Qt框架二进制文件以及必要的支持文件。请注意,工具包不是所引用的编译器随附的。您将需要提前安装它们。 Windows上的一个例外是MinGW(包括Windows的GCC),您可以选择通过底部的“工具”组件列表进行安装。
在Windows上,这正是我们要做的事情,因此我们从“工具”部分中选择了MinGW 5.3.0 32位套件和MinGW 5.3.0开发环境。在我的(64位)计算机上,我已经安装了Microsoft Visual Studio 2017,因此我们还将选择
MSVC 2017 64位套件可帮助在本书后面部分演示一些技术。在Linux上,我们选择GCC 64位,而在Mac OS上,我们选择macOS 64位(使用Clang编译器)。请注意,在Mac OS上,必须安装XCode,并且最好至少启动一次XCode,以便有机会完成其初始化和配置。
随时按一下暂停,开始安装您要使用的任何其他IDE或编译器,然后返回并选择要匹配的工具包。无论您选择哪种工具都没关系-本书所介绍的技术都适用,无论使用哪种套件,都可能会得到稍微不同的结果。请注意,随您提供的可用套件会因操作系统和芯片组的不同而有所差异。例如,如果您使用的是32位计算机,则不会为您提供任何64位套件。
警告:这些工具包下方是一些可选的Qt API(例如Qt图表),本书不需要涵盖这些主题,但是如果您想探索它们的功能,可以随时添加它们。 请注意,它们可能与Qt核心框架具有不同的许可协议。
无论使用什么工具包和API,您都将在“工具”部分中注意到默认情况下已安装Qt Creator,这就是我们将在本书中使用的IDE:
完成选择后,单击“下一步”和“更新”开始安装。
建议:通常,最好将安装位置保留为默认设置,以确保机器之间的一致性,但可以随时随地安装。
维护您的安装
安装后,您可以通过Qt安装目录中的维护工具应用程序更新,添加和删除组件(甚至整个Qt安装)。
启动此工具可提供与我们初次安装Qt时几乎相同的体验。添加或删除组件选项是您想要添加以前可能不需要的项目的选项,包括工具包甚至是框架的全新版本。 如果您主动取消选中它们,则系统上已经安装的组件将不会受到影响。
Qt Creator
尽管对Qt Creator的详细概述超出了本书的范围(如此处所述,可通过“帮助”模式访问Qt Creator手册),但是在我们坚持第一个项目之前,有个快速的举报之旅是值得的,因此请启动 新安装的应用程序,我们将看一下:
左上角(1)是应用程序的不同区域或模式:
- 欢迎模式是启动Qt Creator时的默认模式,是创建或打开项目的起点。有大量示例可以帮助展示框架的各种功能以及一些教程视频。
- 编辑模式是您将花费大量时间的地方,用于编辑所有各种基于文本的文件。
- 设计模式仅当您打开UI文件并且是用于视图的WYSIWYG编辑器时,才可以访问。尽管它对UX设计和基本布局工作很有用,但它可能很快就会令人沮丧,我们将在“编辑”模式下完成所有QML工作。以这种方式工作可以增进对QML的理解(因为您必须编写QML),并且具有以下优点:编辑器不会添加不需要的代码。
- 调试模式用于调试应用程序,超出了本书的范围。
- 项目模式,可以管理项目的配置,包括构建设置。此处所做的更改将反映在* .pro.user文件中。
- 帮助模式将带您进入Qt Creator手册和Qt库参考。
建议:当光标位于已识别的Qt符号上时按F1键将自动打开该符号的上下文相关帮助。
在此之下,我们具有构建/运行工具(2):
- 编译使您可以选择套件并设置构建模式
- 运行构建并运行应用程序而无需调试
- 开始调试构建并使用调试器运行应用程序(请注意,必须在所选工具包中安装并配置了调试器,该调试器才能正常工作)
- 编译工程生成应用程序而不运行它
在底部(3),我们有一个搜索框,然后有几个输出窗口:
- 问题显示任何警告或错误。对于与您的代码有关的编译器错误,双击该项目将使您导航到相关的源代码。
- 搜索结果使您可以查找各种范围内的文本。 Ctrl + F调出快速搜索,然后从中选择Advanced…也调出Search Results控制台。
- 应用程序输出是控制台窗口;应用程序代码(例如std :: cout和Qt的等效qDebug())的所有输出以及来自Qt框架的某些消息都显示在此处。
- 编译输出包含从qmake到编译和链接的生成过程的输出。
- 调试平台包含我们在本书中不会涉及的调试信息。
- 普通消息包含其他各种输出,其中最有用的是来自* .pro文件的qmake解析,我们将在后面进行介绍。
搜索框实际上是一个隐藏的宝石,它使您无需单击无尽的文件和文件夹来尝试查找所需内容。您可以开始在框中输入要查找的文件的名称,然后会显示包含所有匹配文件的过滤列表。只需单击所需的文件,它就会在编辑器中打开。不仅如此,您还可以应用大量过滤器。在空白的搜索框中单击光标,它会显示可用过滤器的列表。例如,过滤器m搜索C ++方法。因此,假设您记得编写了一个名为SomeAmazingFunction()的方法,但不记得它在哪里,只需转到搜索框,开始输入m Some,它将出现在过滤列表中。
在“编辑”模式下,布局会稍有变化,并且会出现一些新窗格。 最初,它们将为空,但是一旦您打开了一个项目,它们将类似于以下内容:
导航栏旁边是项目浏览器,您可以使用它来浏览解决方案的文件和文件夹。 下部窗格是您当前打开的所有文档的列表。 右侧较大的区域是编辑器窗格,您可以在其中编写代码和编辑文档。
通常,在项目资源管理器中双击文件会在编辑器窗格中将其打开,并将其添加到打开的文档列表中。 单击打开的文档列表中的文档将在编辑器窗格中将其激活,而单击文件名右侧的小x将其关闭。
使用标题中的按钮,可以更改窗格以显示不同的信息,调整大小,拆分,关闭以及可能与编辑器进行过滤或同步。 尝试一下,以了解他们可以做什么。
正如您对现代IDE所期望的那样,Chrome和文本编辑器的外观非常可定制。 选择Tools>Options...以查看可用的内容。 我通常编辑以下内容:
Environment > Interface > Theme > Flat
Text Editor > Fonts & Colors > Color Scheme > My own scheme
Text Editor > Completion > Surround text selection with brackets > Off
Text Editor > Completion > Surround text selection with quotes> Off
C++ > Code Style > Current Settings > Copy… then Edit…
Edit Code Style > Pointers and References > Bind to Type name > On (other options Off)
玩耍并获得喜欢的东西
Scratchpad项目
为了演示Qt项目的最小规模并为我们提供一个编程沙坑,我们将创建一个简单的便笺本项目。 对于这个项目,我们甚至不会使用IDE来为我们做,因此您可以真正了解项目是如何构建的。
首先,我们需要创建一个根文件夹来存储我们所有的Qt项目。 在Windows上,我使用c:\ projects \ qt,而在Linux和Mac OS上我使用〜/ projects / qt。 在适合您的位置创建该文件夹。
警告:请注意,文件同步工具(OneDrive,DropBox等)有时可能会导致项目文件夹出现问题,因此请将项目文件保存在常规的未同步文件夹中,并使用带有远程存储库的版本控制进行备份和共享。
对于本书的其余部分,我将宽松地将该文件夹称为<Qt Projects>或类似。 我们还将倾向于使用Unix样式/分隔符作为文件路径,而不是Windows样式反斜杠\。 因此,对于使用Windows的读者,<Qt项目> / scratchpad / amazing / code等效于
c:\ projects \ qt \ scratchpad \ amazing \ code。 Qt也倾向于这个约定。
同样,本书其余部分的大部分屏幕截图都来自Windows,因此Linux / Mac用户应解释对以下内容的任何引用:c:\projects\qt as ~/projects/qt.
在我们的Qt项目文件夹中,创建一个新的文件夹暂存器并导航到它。 创建一个名为scratchpad.pro的新纯文本文件,记住要删除操作系统可能要为您添加的任何.txt扩展名。
接下来,只需双击该文件,它将在Qt Creator中打开:
在这里,Qt Creator问我们如何配置项目,即在构建和运行代码时要使用哪些工具包。 选择一个或多个可用工具包,然后单击“配置项目”。 您以后可以轻松添加和删除工具包,因此不必担心选择了哪些工具包。
如果切换回文件系统,您将看到Qt Creator为我们创建了一个名为scratchpad.pro.user的新文件。 这只是一个包含配置信息的XML文件。 如果删除此文件并再次打开.pro文件,将提示您重新配置项目。 顾名思义,配置设置与本地用户相关,因此,如果您加载由其他人创建的项目,则通常也需要经过configure project步骤。
成功配置项目后,即使完全空的.pro文件,您也会看到该项目已打开。 这几乎是一个项目所能达到的最低要求!
返回文件系统,创建以下纯文本文件:
- main.cpp
- main.qml
- qml.qrc
我将仔细阅读每个文件,解释它们的用途,并尽快添加它们的内容。 在一个真实的项目中,我们当然会使用IDE为我们创建文件。 确实,这就是我们创建主要解决方案文件时要做的事情。 但是,这样做的目的是向您展示,当您将其煮沸时,一个项目只是一堆文本文件。 不要害怕手动创建和编辑文件。 许多现代的IDE可能会使一个接一个的菜单以及永无休止的选项窗口变得混乱且过于复杂。 Qt Creator可能会错过其他IDE的一些高级功能,但是却非常清新和简洁。
创建完这些文件后,双击“项目”窗格中的scratchpad.pro文件,我们将开始编辑新项目。
qmake
我们的项目(.pro)文件由名为qmake的实用程序进行解析,该实用程序又会生成驱动应用程序构建的Makefile。 我们定义所需的项目输出的类型,包括哪些源文件以及相关性等等。 这大部分是通过像现在在项目文件中那样简单地设置变量来实现的。
将以下内容添加到scratchpad.pro:
TEMPLATE = app
QT += qml quick
CONFIG += c++14
SOURCES += main.cpp
RESOURCES += qml.qrc
让我们依次浏览以下各行:
TEMPLATE = app
TEMPLATE告诉qmake这是什么类型的项目。 在我们的例子中,它是一个由app代表的可执行应用程序。 我们感兴趣的其他值是用于构建库二进制文件的lib和用于多项目解决方案的子目录。 请注意,我们使用=运算符设置了一个变量:
QT += qml quick
Qt是一个模块化框架,仅允许您引入所需的部分。 QT标志指定我们要使用的Qt模块。 默认情况下包括core和gui模块。
请注意,我们将附加值附加到期望带有+ =的列表的变量中:
CONFIG += c++14
CONFIG允许您添加项目配置和编译器选项。 在这种情况下,我们指定要使用C ++ 14功能。 请注意,如果您使用的编译器不支持这些语言功能标志,则这些标志不起作用:
SOURCES += main.cpp
SOURCES是我们要包含在项目中的所有* .cpp源文件的列表。 在这里,我们添加了一个空的main.cpp文件,将在其中实现main()函数。 我们还没有,但是当我们这样做时,我们的头文件将使用HEADERS变量指定:
RESOURCES += qml.qrc
RESOURCES是项目中包含的所有资源收集文件(* .qrc)的列表。
资源收集文件用于管理应用程序资源,例如图像和字体,但对我们而言最重要的是我们的QML文件。
随着项目文件的更新,保存更改。
每当您将更改保存到* .pro文件时,qmake都会解析该文件。 如果一切顺利,您将在Qt Creator的右下角看到一个绿色的小条。 红条表示某种问题,通常是语法错误。 该过程的所有输出将被写到“常规消息”窗口中,以帮助您诊断和解决问题。 空格会被忽略,因此不必担心完全匹配空白行。
警告:要使qmake重新查看您的项目并生成新的Makefile,请在“项目”窗格中右键单击您的项目,然后选择“运行qmake”。 这可能有点乏味,但是在构建和运行应用程序之前,以这种方式在每个项目上手动运行qmake是一个好习惯。 我发现某些类型的代码更改可能会“悄悄溜走”,并在您运行应用程序时让您挠头,但这似乎没有任何效果。 如果您发现自己的应用程序忽略了刚进行的更改,请在每个项目上运行qmake,然后重试。 如果您收到虚假的链接器错误,则同样适用。
您将看到我们的其他文件现在已经神奇地出现在“项目”窗格中:
双击main.cpp进行编辑,我们将编写第一行代码:
#include <QGuiApplication>
#include <QQmlApplicationEngine>
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
return app.exec();
}
我们在这里所做的只是实例化一个Qt GUI应用程序对象,并要求它加载我们的main.qml文件。 它非常简短,因为Qt框架为我们完成了所有复杂的底层工作。 我们不必担心平台检测或管理窗口句柄或OpenGL。
可能要学习的最有用的方法之一是将光标放在Qt对象之一中,然后按F1键将打开该类型的帮助。 Qt对象上的方法和属性也是如此。 在帮助文件中四处浏览,以查看QGuiApplication和QQmlApplicationEngine的全部含义。
要编辑我们项目中的下一个文件qml.qrc,您需要右键单击并选择要用来打开该文件的编辑器。 默认值为资源编辑器:
我个人不喜欢这个编辑器。 我觉得它不仅使编写纯文本变得容易,而且不是特别直观。 关闭此窗口,改为选择“打开方式”
> Plain Text Editor.
添加以下内容:
<RCC>
<qresource prefix="/">
<file>main.qml</file>
</qresource>
</RCC>
回到main.cpp,我们要求Qt加载qrc:/main.qml文件。 从本质上讲,这可以分解为“在前缀为/且名称为main.qml的qrc文件中查找文件”。 现在在我们的qrc文件中,我们创建了一个qresource元素,其前缀属性为/。
在此元素内,我们有一个名为main.qml的资源集合(尽管只有其中一个)。 将qrc文件视为可移植文件系统。 请注意,资源文件相对于引用它们的.qrc文件而定位。 在这种情况下,我们的main.qml文件与qml.qrc文件位于同一文件夹中。 例如,如果它位于名为views的子文件夹中,则qml.qrc中的行将这样读取:
<file>views/main.qml</file>
同样,main.cpp中的字符串将是qrc:/views/main.qml。
保存这些更改后,您将在Projects窗格中看到空的main.qml文件作为qml.qrc文件的子级出现。 双击该文件进行编辑,我们将完成项目:
import QtQuick 2.9
import QtQuick.Window 2.3
Window {
visible: true
width: 1024
height: 768
title: qsTr("Scratchpad")
color: "#ffffff"
Text {
id: message
anchors.centerIn: parent
font.pixelSize: 44
text: qsTr("Hello Qt Scratchpad!")
color: "#008000"
}
}
我们将在第2章“项目结构”中详细介绍QML,但总而言之,此文件表示应用程序启动时呈现给用户的屏幕或视图。
导入行类似于C ++中的#include语句,但是它们导入整个模块而不是不包含单个头文件。在这种情况下,我们希望基本的QtQuick模块可以让我们访问所有核心QML类型,还希望QtQuick窗口模块可以让我们访问Window组件。模块是版本控制的,通常,您将要使用最新版本来发布所使用的Qt。当前版本号可以在Qt文档中找到。请注意,尽管在输入版本号时可以完成代码,但是显示的选项有时并不反映最新的可用版本。
顾名思义,Window元素为我们提供了一个顶层窗口,在其中将呈现所有其他内容。我们给它一个1024 x 765像素的大小,标题为“便签本”,背景颜色为白色,表示为十六进制RGB值。
在该组件(QML是一种分层标记语言)中,我们在Text组件中添加了欢迎消息。我们在屏幕上居中放置文本,并设置其字体大小和颜色,但除此之外,我们不关心花哨的格式设置或与此相关的任何内容
阶段,所以就像我们要做的那样复杂。再说一次,我们稍后会详细介绍,所以不要担心它似乎有点陌生。
对了。要构建和运行我们惊人的新应用程序,请首先使用左下角的监视器图标选择所需的Kit and Build配置:
接下来,在“项目”窗格中右键单击项目名称,然后选择“运行qmake”。 完成后,使用绿色播放图标运行应用程序:
摘要
在本章中,我们下载,安装和配置了Qt。 我们进行了Qt Creator IDE的旋风之旅,并试用了其选项,并了解了如何使用它编辑各种文件。
我们对qmake进行了详尽的介绍,并了解了创建项目的过程多么荒谬,使过程中的事物神秘化。 最后,我们从头开始构建了我们的首个项目(弱双关语),并在屏幕上显示了必填的Hello World消息。
在第二章“项目结构”中,我们将基于这些基础知识并建立我们的主要解决方案。