Skip to content

Latest commit

 

History

History
67 lines (53 loc) · 2.48 KB

_GUI是如何实现的.rst

File metadata and controls

67 lines (53 loc) · 2.48 KB

一直以来, 我对GUI是如何实现的很感兴趣, 我们平时电脑上面显示的那些漂亮的窗口界面, 是如何通过程序, 一步步转化成硬件上的操作? 在这里, 我从最上层的Qt图形库开始, 再到linux下面的X, 到内核, 最后到显卡来一个整体的介绍. 鉴于本人水平很差, 也没有多少的实践经验, 文章既不会详细, 也会出现很多错误, 如果你发现了问题, 请联系我.

整体架构

对于用户来说, GUI就是一堆窗口, 但是在下层, 做了非常多复杂的操作, 这些操作是分成很多层来实现的. 不同操作系统的实现方式不同, 我们现在只看采用KDE(Qt图形库)做为图形界面的linux系统. 这里面整理了一下

Qt图形库
--- X协议 ---
X server
--- 系统调用 ---
linux内核
--- IO操作 ---
显卡

整体分为上面几个层次:

  • 最上层是Qt图形库, 应用程序采用Qt图形库开发, 描述窗口, 控件, 以及响应事件的方式.
  • Qt图形库通过X协议, 与进程X server通讯, 然后X server进行生成窗口, 绘制控件的工作.
  • X server通过系统调用, 绘制屏幕, 获取用户键盘鼠标和响应, 包装成事件, 通知X client(就是应用程序).
  • linux内核响应系统调用, 把数据发送给显卡.

那么每层具体是如何实现的呢? 我们来看一个实际的例子. 一个简单的hello world程序.

Qt

Qt是一个图形库, 它让开发者很容易地开发出图形界面的应用. 我们现在写一个很简单的程序: recorder.

代码可以在这里下载到. 分成下面几个部分

main.cpp
recorder.hpp
recorder.cpp

我们先看懂代码是怎么样的. 那么Qt图形库在后面做了什么操作呢? 我们首先得知道Qt下层调用了什么, 必须先介绍一下X协议.

X协议介绍 通讯方式 命令 Qt如何把操作映射到X协议上面? 消息机制 QApplication后面干了什么? Qt是如何把上面的类层次转化到X协议上面的绘制操作的.

Xlib

Xlib到底在下面实现了什么? 做了什么工作能够提供X协议的服务? 绘制窗口 控制窗口的移动 把输入设备映射成事件等等.

linux内核

如何实现系统调用, 鼠标键盘如何转化成xxx, 写显示操作

显卡

显卡的通讯方式, 如何生成输出给显示器的信号

引用材料 .. Qt paint system: http://www.linuxgraphics.cn/qt/paint_system.html