Qt从0到1之机制篇 - 信号槽

示例代码

What

Qt提供了很多机制,其中的一个核心机制就是信号槽,信号槽在Qt程序中有着广泛的使用,是Qt有别于其他框架的一个显著特点。信号槽实际上是一种对象间通信的技术,内部使用了观察者模式。

Why

Qt的信号槽主要是为了解决对象间的通信问题。在不使用信号槽时,对象间的通信一般有两种方式,一种是A对象保持B对象的实例,然后在需要的时候调用B对象的方法,另一种是将B对象的方法作为回调函数传入A对象,在合适的时间调用。但前一种方式建立了两个对象间的强耦合关系,而后一种则使用起来比较麻烦,且可能有类型安全问题。Qt的信号槽最突出的作用就是解耦了两个对象。信号所在对象无需关注槽所在对象的信息,反之亦然。同时,Qt信号槽还提供了线程安全性,可以跨线程使用。

Qt从0到1之工具篇:实现一个简陋的播放器

示例代码

Qt提供了相当多的工具方便我们进行开发,但其中有部分工具不便于单独讲解,因此本文将通过实现一个简单的播放器来介绍如何使用这些工具。本文将通过两种途径来完成软件的开发,一种使用Qt的图形化(GUI)工具来完成,另一种主要使用命令行(CLI)工具,两种途径不是绝对独立的,完全可以在不同的步骤中使用命令行或图形化工具,这需要看个人的使用习惯。由于本文重点是让大家对Qt的工具在开发过程中的作用有一个初步了解,因此每一步的具体细节将不会展开,大家可以查阅相关文档深入了解。

我们要实现的播放器主要功能是打开并播放选择的视频文件,并提供暂停和停止播放功能,程序的效果如下图所示
播放器效果图
为了实现这个播放器,我们将使用到一个第三方库VLC-Qt,这个库可以用来播放多种视频格式,性能优秀,相对于Qt自带的QMultiMedia模块要强大很多。这个库需要手动编译,我们可以参考官方文档进行编译,Windows和Macos下我们也可以直接下载已编译好的动态库,这里不再赘述。

Qt从0到1之工具篇:qmake

简介

和cmake类似,qmake也是一个跨平台的构建工具,目前主要用于Qt项目的构建。本文主要基于官方文档和个人的经验做了一些介绍,更加详细的内容可以参考官方手册.

相对于其他的构建工具,qmake有一些特性:

  • 跨平台支持。为了满足Qt的跨平台性,qmake也支持运行在目前绝大部分操作系统,如Windows,Linux和MacOS,Android等。
  • 支持生成主流IDE的工程文件。qmake可以生成Visual StudioXcode的工程项目文件,便于使用IDE提供的工具。
  • 对Qt项目的完美支持。对于Qt项目,qmake可以帮我们自动配置相关编译流程,如MOC预处理,库的链接等。
  • Qt Creator提供了对qmake的良好支持。如果我们使用Qt Creator + qmake来构建一个项目,我们几乎不需要手动去修改qmake的配置文件,Qt Creator可以自动帮我们配置。

目前我们的Qt项目都是使用qmake进行构建管理,而库相关的项目主要使用cmake进行构建管理。执行qmake命令后,qmake会寻找制定路径下的pro文件并生成对应平台的makefile文件,然后我们就可以使用该平台的make工具进行编译。

Vim配置之通用配置

Vim一个最突出的特点就是它强大的可定制性。但过度的自由也为初学者带来了一大困扰,配置太多太杂,网上的各种配置文章良莠不齐,从茫茫的配置项中找出适合自己的配置方案,完全不知道如何下手。
由于不同人有不同的习惯,因此并没有一套通用的适合所有人的配置方案,这里我仅以我常用的通用配置(2018/08/06)为例进行一个讲解。
Vim的通用配置指的是不依赖插件的一些配置,这些配置一般可被IDE等的Vim插件所支持,因此我称之为通用配置。Vim的通用配置主要分为选项,快捷键和自动命令三部分。

Qt从0到1之工具篇:开发环境

由于Qt本身的复杂性,且有一套独特的构建工具qmake,因此并不能像其他C/C++库一样,可以很简单的配置使用。对此,Qt推出了Qt Creator这一对Qt开发有着优秀支持的IDE,简化使用难度。除了Qt Creator,我们也可以借助Visual Studio的插件Qt Visual Studio Toos插件实现对qmake项目的支持。qmake还为我们提供了qmake项目生成VS,XCode对应工程的功能。当然,Vim经过配置,也可以很舒服地进行Qt开发。

Qt跨平台开发框架概览

Qt是什么

很多人一想到Qt,就想到GUI程序开发,将Qt定义为一个C++ GUI库。确实,用Qt可以很方便的进行GUI程序开发,但GUI开发只是Qt的一部分。维基百科中对Qt的定义是

Qt是一个跨平台的C++应用程序开发框架。

Qt最鲜明的特点是它的跨平台性。目前Qt几乎支持常见的所有系统,包括Windows,MacOS,Linux,Android,iOS,BSD等等。只要不依赖平台相关的特性和API,一份代码可以在其所支持的所有平台编译运行。我刚解除Qt时对这一点并没有很深的体会,直到有一天我未修改一行代码,便将我的一个Windows程序运行到了Android上,除了由于界面大小未做处理导致看上去有些问题外,功能完全正常。利用Qt强大的跨平台性,我们可以很方便的写出兼容多个平台的软件。

另一个特点就是Qt是一个框架。Qt中提供了大量的模块,其中仅有一部分模块是和GUI开发相关的,其他的模块提供了包括数据库,网络,多线程等在内的功能的跨平台支持。很多人认为学习Qt就是为了GUI开发,但实际上,我们在进行非GUI程序,甚至是用其他C++ GUI库的开发时,都可以考虑使用Qt的这些模块提供的功能。

初识应用软件开发

什么是应用软件开发

要想理解什么是应用软件开发,我们必须理解什么是应用软件。

维基百科上对应用软件的解释是

An application software is computer software designed to perform a group of coordinated functions, tasks, or activities for the benefit of the user.

翻译一下就是 应用软件是被用于完成一系列相互协作的功能,任务或活动来满足用户需求的计算机软件,这句话中有几个关键词,一个是 coordinated,一个是 the benefit of the user

  • coordinated
    coordinated这个单词本意为协调的,这里我想了很久,最终翻译为相互协作的。这个单词想表达的意思是一个应用软件要实现的功能应当是有一定相互关联性的,一个应用软件同时被用于完成n件事,这样不仅会使得应用程序的稳定性降低,也会让程序显得臃肿,不够聚焦。但现在有很多厂商为了商业利益,一个软件提供了多个不相关的功能,给用户的体验十分不好。
  • the benefit of the user
    用户的利益,这里指的也就是用户需求。应用软件开发出来一定是为了满足用户的某个特定需求,可以解决用户的痛点。如果一个应用软件仅仅是开发人员凭空想象出来,并没有去真正的了解过用户是否需要这样的一款软件,那么这个应用软件极有可能就是失败的。

应用软件开发就是应用软件从想法诞生到废弃的整个过程。根据我目前的经验,这个过程被分为了需求获取,开发规划,需求分析和设计,交互和UI设计,编程实现,软件测试,软件发布,维护迭代和最终下线。很多开发人员对软件开发的理解仅仅停留在编程实现这一步上,这是不对的,相反,在整个开发流程中,编程实现仅仅是其中一部分,其他的部分也都需要开发人员的积极参与。这些过程中,限于本人当前的水平,部分过程我里了解不多,因此接下来仅选择和开发人员相关的几个步骤做一些说明,其他过程仅做简单介绍。

Vim, 不仅仅是一个编辑器

Vim是什么

Vim,一款被称之为编辑器之神的上古神器,从出生到现在已经有27年了。程序员普遍是喜新厌旧的,在这个存在着一票有着现代化的UI,各种智能操作的编辑器,IDE的时代,Vim看上去就像是早就应该被抛弃的IE6,但为什么一款这么古老的编辑器却依然有一批坚定地拥护者呢?要回答这个问题,我们必须知道,Vim是什么?
Vim是什么,相信绝大多数听过的人的第一反应都是黑黑的终端下的一个编辑器。是的,Vim是一款广泛应用在类UNIX系统下的文本编辑器,是基于更古老的一款编辑器VI发展而来的。Vim和其他的编辑器最大的差别就在于它的编辑方式。几乎所有其他的编辑器,都或多或少地依赖鼠标操作,但Vim可以说是完全抛弃了鼠标。为了达到离开鼠标的目的,Vim发展出了一套独特的按键操作,这让众多的新手纷纷放弃。在StackOverflow上,关于如何退出Vim的回答有一百万的浏览量。就这样一款让新手退出Vim可以用来生成随机字符串的的按键规则,才是Vim的精髓之所在。Vim发展到现在,早已不仅仅是一款编辑器,它更多的是代表了一套可以摆脱鼠标的按键规则。在文本编辑领域,目前几乎所有的主流编辑器都直接获间接提供了对这一套按键规则的支持;在主流的浏览器上,都可以安装提供这一套按键规则的插件;还有诸如Ranger等CLI程序,均可以使用Vim的按键规则。

自定义QMenu样式

最近工作中需要实现一个自定义外观的菜单,但在网上搜索后发现很少有QMenu的样式自定义相关的深入解析。请教了公司的一位前辈,他提到QMenu自定义样式不方便,于是他一般是自己实现一个菜单控件。但这样未免太过于麻烦,因此经过一番摸索后基本实现了自己所需的样式。

Qt自定义控件之SeekBar

在客户端软件开发中,SeekBar(拖动条)是一种常见的控件,经常用于播放器,控制面板等窗口中。Qt默认提供了QSlider来提供相应的功能,然而QSlider和我们常见(如安卓中的SeekBar)的SeekBar相比,有几处不同

  1. 无法点击跳转,QSlider默认行为是点击后向点击处移动特定长度
  2. 滑块中心无法移动到两端端点
  3. 存在信号冗余(调用setValue方法后会发出valueChanged信号,往往会带来问题)
|