Qt Creator 应用开发(二)

原文:annas-archive.org/md5/27c7d87c779f8446e54a74757f855137

译者:飞龙

协议:CC BY-NC-SA 4.0

第六章:使用 Qt Creator 开发移动应用程序

Qt 和移动开发有着悠久的历史。Qt 的起步包括在九十年代末和本世纪初在 Linux 个人数字助理上的早期发布。从那时起,它已经移植到了许多移动环境,包括诺基亚出货的移动 Linux 变体,如 MeeGo,以及 Symbian。尽管 Symbian 和 MeeGo 已经消失,Qt 对移动平台的接受仍然存在,最近还支持 Android。

在本章中,我们会简要讨论编写移动应用程序,然后学习如何设置 Qt Creator 来编写 Android 应用程序。值得一提的是,尽管我们将利用您在 Qt 开发中学到的一切来开发移动应用程序,但我们还需要了解移动软件运行的环境与传统的桌面和笔记本电脑环境有何不同,以及如何设计以适应这些限制。一旦我们了解了这些差异,使用 Qt 为 Android 编写软件就会变得轻而易举!

移动软件开发入门

在为任何移动平台(如手机或平板电脑)开发软件时要记住的关键区别是,每一种资源都是宝贵的。设备更小,这意味着:

  • 您的用户将对您的应用程序付出更少的关注,并且使用时间更短

  • 屏幕更小,因此您可以在显示器上显示更少的信息(不要被今天显示器的高点密度所迷惑:在 4 英寸的显示器上阅读 6 号字体是很不方便的,无论像素密度有多高)

  • 处理器和图形处理单元速度较慢

  • RAM 和图形内存较少

  • 应用程序数据的持久存储较少

  • 网络速度较慢,甚至慢了三个数量级

让我们更详细地看看这些。

用户的注意力是宝贵的

你能一边走路一边嚼口香糖吗?我不能——但很多人可以一边走路,一边嚼口香糖,一边使用他们的移动设备。 (更糟糕的是,一些人甚至在开车时使用他们的设备!)手机或平板上的应用程序很少能够吸引用户超过几分钟的百分之百的注意力。一个很好的经验法则是,设备越小,用户越有可能把它当作一种拿起来看一眼或者在做其他事情时使用的东西。

用户对您的应用程序的有限关注有三个关键后果:

  • 您的应用程序必须快速。移动设备不适合额外的进度条、旋转光标或冗长的启动画面。

  • 您的应用程序必须简洁。最好的移动应用程序只在一页或两页上显示数据,具有非常扁平的导航层次结构。一个常见的结构是有一个屏幕上的信息,和一个屏幕上的偏好设置,让您配置应该显示什么信息(比如您获取信息的位置)。如果您不能绘制清晰的图标,那就找一个可以的人,或者从The Noun Projectbit.ly/1fvBsnu)这样的网站购买图标。

  • 您的应用程序必须易于访问。按钮应该足够大(一个很好的指导原则是,应用程序中的点击目标不应该小于手指的垫,大约是一平方厘米),文本应该尽可能大。

因此,Qt Quick 是您将编写的大多数移动应用程序的更好选择。您可以创建流畅且响应迅速的应用程序,视觉上令人愉悦,并且不会让用户感到不知所措。

计算资源是宝贵的

移动设备必须携带它们的电源来源:也就是电池。虽然电池在过去二十年里有所改进,但它们并没有跟上摩尔定律的步伐;大部分的改进都是在处理器方面,因为处理器变得更小,在正常操作过程中散发的热量也更少。

尽管如此,移动设备不像台式机或笔记本那样快速——一个好的思路是,上一代的处理器设计可能对今天的移动设备有很好的适应性。这并不是说移动设备很慢,只是它们比较慢。同样重要的是,你不能让处理器或图形处理器全速运行而不严重影响电池寿命。

Qt——特别是 Qt Quick——被优化为低功耗,但仍然有一些事情可以帮助你挤出移动应用程序的最佳性能:

  • 不要轮询:这可能是最重要的一点。尽可能使用 Qt 的异步信号-槽机制,并考虑使用QThread进行多线程,如果需要在后台执行某些操作。你的应用程序休眠得越多,电池寿命就会延长得越久。

  • 避免不必要的动画:一些动画在当今的应用程序中是习惯的和重要的;深思熟虑的动画可以帮助用户了解他们在应用程序用户界面中来自哪里,以及他们要去哪里。但不要闪烁、闪烁或以其他方式进行动画,只是为了看到像素移动;在幕后,要移动这些像素需要发生很多事情,这会消耗电池寿命。

  • 谨慎使用网络:大多数移动设备至少有两个无线电(蜂窝和 Wi-Fi);有些设备有更多。访问网络应该被视为一种必要的恶,因为在传输和接收数据时,无线电会消耗电力。而且不要忘记数据解析:如果你解析了大量数据,你可能会让 CPU 全速运行来完成繁重的工作,这意味着电池寿命会降低。

网络资源是稀缺的

我已经警告过你使用网络对电池的高成本。更令人伤感的是,大多数移动设备运行的网络速度可能比台式机慢三个数量级:你的办公桌面可能有千兆以太网,但在世界上许多地方,每秒一兆比特被认为是快速的。这种情况正在迅速改善,因为网络运营商部署了诸如长期演进LTE)和 Wi-Fi 热点等蜂窝无线网络,但这并不是普遍可用的。最近在加利福尼亚的一次旅行中,在八个小时内,我的蜂窝网络连接吞吐量从比我的电缆调制解调器更快(运行在每秒 25 兆比特)到可怕的每秒一兆比特,这可能使一个大网页加载得很慢。

对于大多数应用程序,你应该可以使用超文本传输协议HTTP);Qt 的QNetworkAccessManager类实现了 HTTP 和 HTTPS,使用 HTTP 意味着你可以以标准方式构建支持后端的网络服务。

如果你正在开发游戏或非常定制的应用程序,你可能需要构建一个自定义协议。考虑使用QTcpSocketQUdpSocket来进行网络协议,当然要记住 TCP 是一种可靠的协议,而 UDP 则不能保证数据到达目的地;可靠性取决于你自己。

存储资源是稀缺的

移动设备通常使用全固态存储器。尽管在过去几年里,固态存储器的价格已经大幅下降,但它仍然不像大多数台式机和许多笔记本电脑中的磁盘驱动器所组成的旋转磁性存储器那样便宜。因此,移动设备的持久存储可能只有 8GB 的闪存,或者如果你很幸运的话,可能是 16GB 或 32GB。这些存储空间是系统和所有应用程序共享的;你的应用程序不应该使用超过几 GB 的存储空间,而且只有在用户期望的情况下才能使用这么多,比如播客应用程序。这应该是你的应用程序、其静态资源(如音频和视频)以及它可能从网络上下载和缓存的任何东西的总大小。

同样重要的是,应用程序的运行时大小需要更小。大多数移动设备可用的动态 RAM 介于半 GB 和 2GB 之间;系统会在所有运行的应用程序之间共享这些内存,因此重要的是在需要时分配所需的内存,并在完成后释放。Qt 的内存管理系统在这里非常有用,我在第三章和第五章中已经解释过。

最后,不要忘记你的图形纹理也会占用宝贵的 GPU 内存。虽然 Qt 为你管理 GPU,无论你使用 Qt 还是 Qt Quick,你都可以编写一个消耗设备所有纹理内存的应用程序,这会使原生操作系统难以渲染所需的内容,如果需要中断你的应用程序,甚至可能是不可能的。

移植还是不移植?

用 Qt 在众多平台上具有令人难以抗拒的灵活性,诱惑力很大,尤其是在垂直市场上,你可能已经用 Qt 为桌面编写了一款定制软件,而客户希望为他们的移动工作者提供最新移动设备上的“同样的东西”。总的来说,我能提供的最好建议是避免移植 UI,只有在应用程序对移动设备表现良好时才移植业务逻辑。

从桌面或笔记本环境移植的 UI 很少在移动设备上表现良好。用户的操作模式完全不同:一个人在桌面或笔记本前所想做的事情与站立、走动或在会议室、餐厅或咖啡厅短暂停留时所想做或能做的事情完全不同。如果你从一个移动设备移植到另一个移动设备,情况可能不会那么糟糕;例如,一个在 MeeGo 上使用 Qt 应用程序的开发人员,可能不会在将他们的应用程序移植到 Android 上遇到太多问题。

移植业务逻辑可能是一个更安全的选择,假设它不会过度使用 CPU、网络或动态或静态存储。Qt 通过 QtSQL 提供了 SQLite 的封装,许多企业应用程序都使用它进行本地存储。这是数据存储的一个合理选择,大多数基于 HTTP 的网络应用程序在网络层上不应该太过苛刻,只要它们有合理的缓存策略,不会太频繁地请求数据。但如果应用程序使用了大量存储空间或有持续的网络连接,那么就是重新设计和重写的时候了。

关于测试

测试任何应用程序都很重要,但移动应用程序需要额外的测试工作,尤其是 Android 应用程序。市场上有各种各样的设备,用户希望你的应用程序在任何可能拥有的设备上都能表现良好。

你能做的最重要的事情就是在真实设备上测试你的应用程序,尽可能多地使用它们,如果你有意商业发布你的应用程序。正如你将看到的,Qt Creator 使用的 Android SDK 带有一个模拟器,可以在桌面或笔记本电脑上运行你的 Android 应用程序,但在模拟器上运行不能替代在设备上运行。很多东西都不一样,从硬件大小到触摸屏,当然还有网络连接和原始处理能力。

幸运的是,Android 设备并不是非常昂贵,而且市面上有很多。如果你刚开始,eBay 或 Google Play 商店可能是购买廉价二手或新设备的好地方。如果你是学生或初创企业家,不要忘记许多家庭成员可能有你可以借用的 Android 设备,或者你已经拥有的 Android 手机。

什么时候应该测试什么?什么都要测试,而且要经常测试!在一个跨几周的项目中,您不应该离设备运行构建的时间超过几天。您在设备上没有测试的代码写得越多,您对设备性能的假设就越多。

一定不要只在良好的情况下测试您的应用,也要在不好的情况下测试。网络连接就是一个典型的例子;您应该在没有网络覆盖的情况下测试错误处理。如果您所在的地方有良好的网络覆盖,一个小技巧是将设备放在金属饼干罐或油漆罐中;金属会减弱信号,具有与在现实世界中信号丢失的相同效果(比如在隧道或地铁中)。

为 Android 设置 Qt Creator

Android 的功能在 API 级别中被限定;Qt for Android 支持 Android 10 及以上的级别:这是 Android 2.3.3,是 Gingerbread 的一个变种。幸运的是,今天市场上大多数设备至少都是 Gingerbread,这使得 Qt for Android 成为了数百万设备的可行开发平台。

下载所有的组件

要开始使用 Qt Creator for Android,您需要下载很多东西。让我们开始吧:

  • 首先是 Qt for Android 的一个版本,它可能是您在第一章中下载的 Qt 安装的一部分,或者您需要返回并从bit.ly/13G4Jfr下载它

  • Android 开发工具需要当前版本的Java Development Kit (JDK)(不仅仅是运行时,Java Runtime Environment,而是整个工具包);您可以从bit.ly/14HAaj4下载,或者您也可以尝试使用 OpenJDK 在 Linux 上运行,下载地址是bit.ly/1deNuTX

  • 您需要最新的 Android Software Development Kit (SDK),您可以从bit.ly/146nsPl下载,适用于 Mac OS X、Linux 或 Windows

  • 您需要最新的 Android Native Development Kit (NDK),您可以从bit.ly/16UYK50下载

  • 您需要当前版本的 Ant,即 Java 构建工具,您可以从bit.ly/18AVIlF下载

按照这个顺序下载、解压并安装所有这些。在 Windows 上,我将 Android SDK 和 NDK 解压到我的硬盘根目录,并将 JDK 安装在我被提供的默认位置。

设置环境变量

安装 JDK 后,您需要确保已经设置了JAVA_HOME环境变量,指向安装 JDK 的目录。如何设置这一点因平台而异;在 Mac OS X 或 Linux 上,您需要编辑.bashrc.tcshrc或其他文件;在 Windows 上,您需要进入系统属性,点击环境变量…,并添加JAVA_HOME变量。路径应该是 JDK 目录的基础:对我来说,是C:\Program Files\Java\jdk1.7.0_25\,但对您来说,路径将取决于您安装 JDK 的位置和安装的版本。(确保设置路径时带有尾部目录分隔符;Android SDK 对这类事情非常挑剔。)

接下来,您需要更新PATH变量,指向刚刚安装的所有内容。同样,这是一个环境变量,您需要添加以下内容:

  • 您的 JDK 的bin目录

  • android\sdk\tools目录

  • android\sdk\platform-tools目录

对我来说,在我的 Windows 8 电脑上,我的PATH变量现在包括以下内容:

...C:\Program Files\Java\jdk1.7.0_25\bin;C:\adt-bundle-windows-x86_64-20130729\sdk\tools;;C:\adt-bundle-windows-x86_64-20130729\sdk\platform-tools;...

不要忘记分隔符:在 Windows 上是分号(;),在 Mac OS X 和 Linux 上是冒号(:)。

在这一点上,重新启动计算机(如果您使用 Windows),或注销并重新登录以确保所有这些设置生效。如果您使用的是 Mac OS X 或 Linux 系统,您可能可以启动一个新的终端并产生相同的效果(或重新加载您的 shell 配置文件),但我喜欢在这一点上重新启动以确保下次启动时一切都能正常工作。

完成 Android SDK 安装

现在,我们需要使用 Android SDK 工具来确保您至少安装了一个 Android API 级别的完整版本的 SDK。我们需要启动 Eclipse,Android SDK 的开发环境,并运行 Android SDK 管理器。要做到这一点,请按照以下步骤:

  1. 找到 Eclipse。它可能在您安装 Android SDK 的目录的 Eclipse 目录中。如果 Eclipse 无法启动,请检查您的JAVA_HOMEPATH变量;很可能 Eclipse 找不到运行所需的 Java 环境。

  2. 当 Eclipse 提示您选择工作区时,单击OK。这并不重要;除了下载 Android SDK 组件外,您不会使用 Eclipse。

  3. 单击 Eclipse 工具栏中的 Android SDK Manager 按钮(在下一个截图中圈出):外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Eclipse SDK,带有圈出的 Android SDK Manager 按钮

  1. 确保您至少安装了一个 Android API 级别高于 API 级别 10,以及 Google USB 驱动程序(您需要它来在硬件上进行调试)。

  2. 退出 Eclipse。

接下来,让我们看看 Android 调试桥(将可执行文件传输到 Android 设备并支持设备上调试的软件组件)是否正常工作。启动 shell 提示符,然后键入adb。如果您看到大量输出且没有错误,则桥已正确安装。如果没有,请返回并检查您的PATH变量以确保它是正确的。

在此期间,您还应该启用 Android 设备的开发者功能,以便它可以与 ADB 一起使用。请按照bit.ly/1a29sal中给出的步骤进行操作。

配置 Qt Creator

现在,是时候告诉 Qt Creator 您刚刚安装的所有内容了:

  1. 启动 Qt Creator,但不要创建新项目。

  2. 工具菜单下,选择选项…然后选择Android

  3. 填写空白,如下一个截图所示。它们应该是:

  4. SDK 目录的路径,在您安装 Android SDK 的目录中。

  5. 您安装 Android NDK 的路径。

  6. 检查自动为 Android 工具链创建套件

  7. Ant 的路径;在 Mac OS X 和 Linux 平台上是 Ant 可执行文件本身,或者在解压 Ant 的目录的 bin 目录中的ant.bat

  8. 您安装 JDK 的目录(这可能会自动从您的JAVA_HOME目录中获取)。外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Qt Creator Android 配置,设置了我安装各种 Android 组件的路径

  1. 单击OK关闭选项窗口。

现在,您应该能够为 Android 创建新的 Qt GUI 或 Qt Quick 应用程序!这样做,并确保 Android 是向导中的目标选项,如下一个截图所示;确保至少选择一个 ARM 目标,一个 x86 目标,以及一个桌面环境的目标:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

新 Qt Quick 应用程序向导中的 Android 目标

构建和运行您的应用程序

正常编写和构建您的应用程序。一个好主意是先为 Android 构建 Qt Quick“Hello World”应用程序,然后再进行大量更改,并通过为设备编译来测试环境。当您准备好在设备上运行时:

  1. 导航到项目(左侧),然后选择Android for arm套件的运行设置

  2. 包配置下,确保 Android SDK 级别设置为您安装的 SDK 级别。

  3. 确保包名称类似于org.qtproject.example,然后跟上你的项目名称。

  4. 使用 USB 线将你的 Android 设备连接到计算机上。

  5. 选择Android for arm运行目标,然后点击调试运行来在设备上调试或运行你的应用程序。

总结

Qt for Android 为移动开发提供了极大的帮助,但并非万能药。如果你计划面向移动设备开发,你应该确保对应用程序用户的使用模式有很好的理解,以及移动应用程序必须在 CPU、GPU、内存和网络方面的限制下运行。

一旦我们理解了这些,我们所有在 Qt Creator 和 Qt 上的技能都可以应用到移动领域。首先安装 JDK、Android SDK、Android NDK 和 Ant,然后像平常一样开发应用程序,经常在设备上编译和运行,以解决途中出现的任何意外问题。

在我们的最后一章中,我们学习了一些关于 Qt Creator 和 Qt 的杂项知识,这将使软件开发变得更加容易。敬请关注!

第七章:Qt 提示和技巧

在前几章中,我们讨论了 Qt Creator 作为软件开发工具包的优点:如何编辑、编译和调试应用程序;如何对其执行和内存性能进行分析;如何将其本地化为世界各地的不同地区;甚至如何制作在 Android 手机和平板电脑上运行的移动应用程序。在本章中,我们将讨论在使用 Qt Creator 和 Qt 时应该了解的一些提示和技巧的集合,这将使您像专业人士一样编写软件。

使用 Qt Creator 编写控制台应用程序

还记得第一章中的“Hello World”应用程序,开始使用 Qt Creator吗?那是一个控制台应用程序,是您可以编写的最简单的一个。回顾代码,我们创建了一个新的 Qt 控制台应用程序,在main.cpp中编写了:

#include <QCoreApplication>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    cout << "Hello world!";

    return a.exec();
}

在 Qt 应用程序中,任何有效的 C++都是有效的,包括标准模板库(STL)代码。如果您需要用 C++编写一个小工具,但还没有学习很多关于 Qt:您在 Qt Creator 中可以访问您所了解的关于 C++(甚至 C,如果您喜欢)的一切。

尽管 Qt 最广为人知的是作为 GUI 工具包,但值得一提的是QtCore库,它是每个 Qt 应用程序的一部分,包括 Qt 控制台应用程序,其中包括大量的实用程序和模板类,例如:

  • 集合类,包括QListQVectorQStackQQueue,用于保持列表和向量,以及后进先出和先进先出的数据存储

  • 字典类(也称为哈希表),包括QMapQDict

  • 使用QFileQDirectory进行跨平台文件 I/O

  • 使用QString进行 Unicode 字符串支持

为什么会选择 Qt 的类而不是直接使用 C++提供的内容?有几个原因:

  • 内存 性能:与 STL 集合不同,Qt 集合是基于引用的,并使用写时复制来节省内存。Qt 集合通常比其 STL 对应物占用更少的内存。

  • 迭代:使用 Qt 集合进行迭代是安全的,具有受保护的访问,以防止超出集合的末端。

  • 可读性:在整个应用程序中使用 Qt 代码和库提供了统一的外观和感觉,可以使代码更易于维护。

  • 可移植性:在一些嵌入式平台上,Qt 可用,但 STL 可能不可用。(然而,这与 Qt 最初编写时的问题相比已经不是问题了。)

值得注意的是,Qt 的集合通常比其 STL 对应物稍慢:当使用 Qt 类处理数据时,通常会以内存性能换取速度。然而,在实践中,这很少是问题。

QFileQDirectory类值得特别一提,因为有一点:可移植性。甚至目录分隔符也以可移植的方式处理;无论您在 Mac OS X、Linux 还是 Windows 上运行,目录始终由单个/标记,这样可以轻松地以与平台无关的方式编写代码,并确保其在所有平台上运行。在底层,Qt 在访问文件时会将目录字符串转换为使用特定于平台的目录分隔符。

与版本控制系统的集成

几乎所有大型项目都需要某种版本控制来协调不同用户对同一文件所做的更改,并确保对源代码库的更改和谐地进行。即使是单个开发人员也可以通过使用版本控制来受益,因为版本控制提供了开发人员对每个已更改文件的更改记录,并提供了项目随时间变化的宝贵历史记录。Qt Creator 支持以下版本控制系统:

  • Bazaar(在 Qt Creator 2.2 及更高版本中支持)

  • CVS

  • Git

  • Mercurial(在 Qt Creator 2.0 及更高版本中支持)

  • Perforce(支持 Perforce 服务器版本 2006.1 及更高版本)

  • Subversion

您需要做的第一件事是为项目设置版本控制软件。如何做取决于您选择的版本控制系统(例如,可能由您的组织规定,或者您可能有从过去项目中工作中的个人偏好),以及如何执行此操作因系统而异,因此我们不会在这里详细介绍。但是,您需要有一个存储源代码版本的存储库,并且在您的工作站上安装适当的版本控制软件,并且在系统的PATH环境变量中包含包含版本控制二进制文件的适当目录,以便 Qt Creator 可以找到它们。重要的是,您需要从系统的 shell(例如 PowerShell 或本地终端提示符)访问版本控制命令,因为 Qt Creator 以相同的方式访问它们。

完成此操作后,我们可以通过选择工具|选项…|版本控制来配置 Qt Creator 与版本控制的交互方式。有适用于您正在使用的任何版本控制系统的一般配置选项,以及 Qt 支持的每种版本控制的特定选项。一般选项包括:

  • 可以在任何提交消息上运行的脚本,以确保您的消息格式正确或包含正确的信息

  • 源代码控制系统的名称和别名列表

  • 包括在每个提交消息中的字段列表

  • SSH 提示命令用于在使用 SSH 访问版本控制系统时提示您输入 SSH 密码

一些版本控制系统,如 Git 和 Mercurial,支持本地版本控制存储库。如果您在开发项目中独自操作并且只需要一个地方来备份您的更改,这将非常方便(当然,也要记得备份源代码存储库目录!)。如果您使用其中一个系统,可以使用 Qt 直接创建本地存储库目录,方法是导航到工具|创建存储库,或者导航到文件|新文件或项目向导的最后一页。

如果安装和配置版本控制系统,则该系统提供的各种命令将添加到 Qt Creator 的工具菜单的子菜单中。从那里,您可以:

  • 通过导航到窗口|输出窗格|版本控制来查看版本控制命令输出

  • 查看版本控制系统的不同输出,让您看到您正在编辑的文件与存储库中的文件有何不同

  • 通过选择日志文件日志查看文件的变更日志

  • 通过选择提交提交将文件的更改提交到系统

  • 通过选择还原来撤消对文件的更改

  • 通过选择更新,使用当前版本控制系统的内容更新您的工作目录

  • 访问支持分支、存储和远程存储库的其他每个版本控制命令可能也可用

如果您刚开始并需要选择版本控制系统,也许最好的方法是查看维基百科上各种系统的比较,并熟悉其中一个。

提示

就我个人而言,我更喜欢 Git,无论是使用本地存储库还是在 GitHub 等托管存储库中。它是免费的,速度快,对分支有很好的支持,并且得到了 Qt Creator 的良好支持。

配置编码风格和编码格式选项

可读的代码至关重要,Qt Creator 的默认编码风格是大多数人都认为非常易读的。但是,您可能在一个遵循不同编码准则的项目中,或者您可能发现无法忍受 Qt Creator 编辑器处理代码格式的某个特定方面:也许是大括号的位置,或者switch语句的格式。幸运的是,Qt Creator 是非常可配置的。通过导航到工具 | 选项… | C++,您可以配置 Qt Creator 如何格式化您的代码,如下面的屏幕截图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在 Qt Creator 中调整代码格式

基本对话框允许您选择流行的格式样式,例如 Qt 的默认格式,或大多数 GNU 代码使用的格式。您还可以单击编辑…,这将打开编辑代码样式窗口,如下一个屏幕截图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在 Qt Creator 中微调代码格式

您将首先复制一个内置样式,并编辑以适应您的口味;从编辑代码样式对话框中,您可以选择选项卡是表示为制表符字符还是空格或选项卡和每个选项卡停止的空格数,以及如何处理行连续。每个窗格都允许您调整代码格式的特定方面:

  • 内容窗格允许您调整类主体的格式,包括公共、受保护和私有声明的间距

  • 大括号窗格允许您控制与大括号相关的格式

  • “switch”窗格允许您控制 switch 和 case 语句的格式

  • 对齐窗格允许您控制代码在连续行之间的对齐方式

  • 指针和引用窗格允许您控制指针声明周围的间距

使用所有这些选项很容易变得疯狂,但我劝您不要这样做:乍一看好的东西在日复一日看到时通常是无法阅读的混乱。如果您刚开始使用 Qt,请坚持使用默认格式,并记住古老的格言不要伤害别人。在编辑现有代码时,要匹配已有的格式。

从命令行构建

有时,您需要从命令行构建项目。也许您正在使用 Linux,并且您更喜欢在那里工作,或者您在开会时远程连接到桌面。或者,您想要在构建服务器上自动构建,并且需要知道 Qt 如何为您的构建执行其编译魔法。

诀窍在于qmake:Qt 的元构建系统,负责为您已经安装的编译器工具链生成 Make 文件。qmake命令接受.pro文件,您在第二章中首次看到了这些文件,使用 Qt Creator 构建应用程序,并生成您的工具链构建应用程序所需的 Make 或 Nmake 文件。

首先确保您的编译器和make实用程序在系统路径中:如何执行此操作因开发环境而异。接下来,请确保您的路径中包含 Qt 的构建系统命令——如果您在 Linux 上使用软件包管理器安装了 Qt,则默认情况下是这样,如果您在 Mac OS X 或 Windows 上安装了 Qt 工具,则可以通过编辑路径以包括适当的bin目录来轻松完成。

接下来,打开命令窗口并切换到包含您的项目的目录:您的.pro文件应该位于该目录的根目录。键入qmake,然后进行构建(如果您的构建系统使用make),或者进行nmake(如果您使用 Microsoft Windows 工具链)。就是这样!

设置 Qt Quick 窗口显示选项

Qt Quick 非常适合构建非传统计算环境的应用程序,比如机顶盒或汽车电脑。在使用 Qt Quick 时,通常您会希望应用程序在这些设置中不具有所有通常的窗口外观(比如关闭框),因为您试图基于您的 Qt Quick 应用程序而不是主机平台上的窗口工具包来呈现统一的用户界面。

您可以通过编辑 Qt Quick 项目中的main.cpp文件轻松设置不透明度和窗口选项(比如是否显示关闭框)。默认情况下,它看起来是这样的:

#include <QtGui/QGuiApplication>
#include "qtquick2applicationviewer.h"

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    QtQuick2ApplicationViewer viewer;
    viewer.setMainQmlFile(QStringLiteral("qml/QtTranslucent/main.qml"));
    viewer.showExpanded();

    return app.exec();
}

这段代码创建了一个 Qt Quick 应用程序查看器,将其主 QML 文件(要加载的第一个文件)设置为指定的文件,然后在启动应用程序的事件循环之前显示它。幸运的是,QtQuick2ApplicationViewer对象有一个setFlags方法,让您可以传递Qt::Window标志给它初始化的窗口,以显示您的 Qt Quick 应用程序。这些标志包括:

  • Qt::FramelessWindowHint:这表示窗口应该没有边框(在 Linux 系统上有效,在 Windows 上无效)

  • Qt::Popup:这表示一个弹出窗口(您可以在 Windows 上使用这个选项来获得一个几乎没有边框但有轻微阴影的窗口)

  • Qt::WindowStaysOnTopHint:这表示窗口应该始终位于所有其他窗口之上

  • Qt::WindowStaysOnBottomHint:这表示窗口应该位于所有其他窗口下方

  • Qt::Desktop:这表示窗口应该在桌面上运行

Qt 文档中可以找到所有标志的完整列表,网址是bit.ly/17NT0sm

您还可以通过使用QtQuick2ApplicationViewersetOpacity方法来调整窗口的不透明度。

比如,我们想要一个蓝色窗口,没有边框,但是有一个轻微的 75%不透明度的阴影,悬浮在所有其他窗口上,用于我的 Qt Quick 应用程序。我们会修改 QML 以便读取:

import QtQuick 2.0

Rectangle {
    width: 360
    height: 360
    color: "blue"
    Text {
        text: qsTr("Hello World")
        anchors.centerIn: parent
        font.pointSize: 18
    }
    MouseArea {
        anchors.fill: parent
        onClicked: {
            Qt.quit();
        }
    }
}

请注意我们顶层矩形的color: blue声明。接下来,我们将修改main.cpp以便读取:

#include <QtGui/QGuiApplication>
#include "qtquick2applicationviewer.h"

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    QtQuick2ApplicationViewer viewer;
    viewer.setOpacity(0.75);
    viewer.setFlags(Qt::Popup | Qt::WindowStaysOnTopHint);
    viewer.setMainQmlFile(QStringLiteral("qml/QtTranslucent/main.qml"));
    viewer.showExpanded();

    return app.exec();
}

关键的行在viewer.setMainQmlFile之前:setOpacity方法设置主窗口的不透明度,setFlags方法设置主窗口的标志为一个弹出窗口,将位于所有其他窗口之上。通过运行应用程序,我们可以看到类似以下的屏幕截图:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一个半透明的 Qt Quick 窗口位于其他窗口之上

您可以使用这个技巧来产生各种效果,来显示您的 Qt Quick 应用程序。

了解更多关于 Qt

在早期的章节中,我指向了 Qt Creator 的帮助面板,以及编辑代码时自动补全类成员的功能。Qt Creator 的帮助视图实际上是 Qt 助手的一个子视图,包含了 Qt 的完整文档。这些文档的大部分也在网上,但在本地访问速度更快。我们从 Qt SDK 启动 Qt 助手(可以通过命令行使用qtassistant,也可以在已安装的应用程序列表中找到它),我们可以看到类似以下的屏幕截图:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Qt 助手

Qt 助手是学习 Qt 的终极地方。在左侧列中,您会看到一个目录;最好的开始位置是 Qt Core,然后根据您想要编写 GUI 还是 Qt Quick 应用程序选择 Qt GUI 或 Qt Quick。右侧的主视图就像一个浏览器窗口,包括到相关部分的超链接。

在 Qt 助手中,您还可以将常访问的页面添加到书签中,查看文档中所有术语的索引,并通过左侧列的搜索选项卡快速搜索术语。这是一个非常宝贵的资源,使用起来就像使用电子书一样简单。

最后,如果您喜欢通过网络了解事物,请不要忘记 Qt 的广泛在线文档,可在bit.ly/15F11Ok上找到。

总结

Qt 和 Qt Creator 为您的应用程序开发提供了一个很好的环境,无论您是编写控制台、GUI 还是 Qt Quick 应用程序。您可以将标准 C++代码与 Qt 混合使用,从而充分利用您现有的技能。在这样做时,您可以添加诸如版本控制和命令行构建等工具,使您能够在大型团队中工作,并使用 Qt 执行大型项目的无人值守构建。Qt 还有一个很好的文档,既包含在 Qt Creator 中,也可以在网络上找到。通过本书学到的知识和可用的资源,您的应用程序开发目标将不受限制!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值