Content Table

绘图

阿基米德说:给我一个支点,我将撬起整个地球。给我一个 QPainter,我也能实现整个操作系统的图形界面,看似有点夸张,但说明了一个核心问题,操作系统的界面本质也是画(Hua)出来的。你看到的,未必就是真实存在的,也可以说根本不存在什么按钮、Label 等,他们都是一幅画,有很多人认为按钮就是按钮,Label 就是 Label,是不同的控件,不能互相转换使用,其实我很多时候就会把按钮当 Label 用,例如要求显示左边是图标,右边是文字,不可点击,如果用 Label 来实现就比较麻烦,但用 QPushButton 来做的话很容易,只不过把点击事件给忽略就好,处理 Label 的鼠标点击事件是不是就可化身为按钮了呢?别说按钮等了,其实就是我们生存的空间,都不知道是否真实的存在,还是我们就生活在外星文明的游戏里,谁能说得清呢!

既然操作系统的界面是画出来的,那么为什么 Linux 的图形界面有些人说不好用(我个人觉得 Linux 界面的配色就挺舒服的),Windows 的界面和苹果界面相差那么大呢?难道它们没法把对方的优点出来吗?我认为难用与否更多与组织和管理界面的元素,系统的风格,软件本身的质量,使用者的喜恶等诸多因素有关,界面只是可视化的工具。如果你了解系统美化的话,肯定看过很多把 Windows 的界面模拟成 Mac OS 的界面,甚至把 Mac OS 的界面改成 Windows XP 的,这说明一个系统的界面都可以画成另一个系统界面的样子。为什么每个系统发展成各自现在的界面风格,与每个公司,组织的设计,理念,习惯,对图形化的支持等很多因素有关,而不是说没能力把界面画得更好看,或画得像谁一样,决定都需要考虑性价比,深思熟虑,权衡利弊,最终找到更适合自己的方案。

图形界面的本质都是一样的,就是一张静态的画。画界面的过程是通过绘图命令,操作显卡里的像素数据,每一个像素均由三个颜色分量构成:红、绿、蓝,最后把像素映射到让屏幕上的点,很多点连在一起就看到了不同的控件。QPainter 就是 Qt 里用来发送绘图命令的工具,告诉系统某个像素点要显示什么颜色。

也许你会问,既然说图形界面就是一张静态的画,那为什么播放器里的电影是动的,游戏是动的,点击按钮,看到按钮动了,还发出 clicked() 信号呢?这和静态不就相矛盾了吗?答案还是:没错,它就是静态的画,在每一个时刻,界面就是一张静态的画面。

电影最重要的原理是 “视觉暂留”。科学实验证明,人眼在某个视像消失后,仍可使该物像在视网膜上滞留 0.1-0.4 秒左右。电影胶片以每秒24格画面匀速转动,一系列静态画面就会因视觉暂留作用而造成一种连续的视觉印象,产生逼真的动感。

界面的动态效果和电影的原理是一样的,一定时间内切换显示一系列静态图片,由于视觉暂留让我们感觉到界面是动态的,我们也会用一些简单的例子加以介绍界面的实现原理,不过饭要一口一口的吃,路要一步一步的走,就先从了解基础的绘图知识开始,然后一步步深入。