GTK和Qt如何与Linux集成,而不是与Windows和OS X集成?

从我的理解来看,Windows和OS X上的Qt和GTK只是本地GUI库的包装,比如OS X包装Cocoa,Win32包围Windows。 但是,我的问题是,他们如何与Linux集成? 桌面环境开发人员是否必须为Qt或GTK实现特殊的库,或者它是如何工作的? 我环顾四周,但我真的找不到答案。

在Linux(台式机和笔记本电脑)上, X11服务器通常会显示图形屏幕(至少在2015年初就是如此)。 您的GUI应用程序通过套接字与服务器通信,通常在本地位于Unix套接字(如/tmp/.X11-unix/X0 。 X11服务器一般是Xorg 。

对于一些嵌入式设备,如Android手机或一些小工具(汽车,汽车或医疗设备行业的GPS),它是不同的( DirectFB , 帧缓冲设备 ,桌面上的X11服务器使用…)

有些发行版正在转向Wayland (或者也许是和平版 )。 由于我不了解这些,所以我无法解释这些血腥的细节。 AFAIU,还有一些服务器(像Xorg,它是唯一一个和你的显卡交互的用户软件组件)和一些协议,还有一些主要的工具包,比如Qt和GTK。 Qt或GTK,你不关心这些细节,但你应该升级你的工具包)。

图形工具包(Qt,Gtk)通过一些特定的协议与X11服务器(或Wayland的)交互,例如X11的X Window系统协议 。 由于历史的原因,这些协议是相当复杂的,实际上需要遵循一些像EWMH这样的惯例 。

另请参阅相关问题的答案 。 我在那里解释说X11今天不像上个世纪那样使用, 特别是X11的服务器端 绘图功能 (例如Xlib的XDrawLine或XDrawText )目前很少使用,因为工具包正在绘制一个像素映像客户端并将其发送到服务器。

注意,你可能会考虑不给你的应用程序提供一个GUI界面,而是一个Web界面(例如使用libonion , Wt等库); 那么你的应用程序就成为一个专门的Web服务器,用户可以通过他的浏览器(在他的桌面/笔记本电脑/平板电脑/手机上)与你的应用程序进行交互。

实际上, 用户界面非常复杂,您应该使用一些工具包(如果使用C ++进行编码,则为Qt )。 从头开始编码(即使在Xlib或XCB上面)也需要数年的工作。

在X11上面还有其他几个widget工具包 ,例如FOX工具箱 , FLTK (但其中大多数功能比Qt或GTK少得多)。

一些进一步的说明。

GTK +和Qt都不使用Windows和OS X的本机窗口小部件。它们使用本地API 接近外观,但是在内部,所有内容都是自定义的。

GTK +和Qt负责和定义Linux上可用的主题。 桌面环境通常提供了一种全局更改所有应用程序的主题的方式,但GTK +和Qt是如何定义的。 例如,GTK + 3通常使用~/.config/gtk-3.0/settings.ini来存储这些信息( 并且这个文件有一个编程的API )。

Qt通过QGtkStyle为GTK + 2主题搭建了一座桥梁,KDE开发者为GTK + 2和GTK + 3维护了他们的Oxygen主题版本(以前的句子可能在将来会改变,特别是现在GTK + 2已经死了)。

更新1 :Unix系统只提供了一种方法来保留一个矩形区域的屏幕做你想做的,包括绘制(如绘制位图图像)。 绘图(如绘制形状)是通过手工完成的。 GTK +使用一个名为cairo的库来进行绘图; 我相信Qt自己写了(QPainter?)。 Windows和OS X都提供绘图API(Windows有几个; OS X有Core Graphics)。 (X11确实有图元,但是我认为它们没有足够的表现力用于现代2D图形;我不知道…)

字体渲染也是如此,尽管现代Unix系统倾向于将字体渲染放在一些普遍接受的基础库(freetype,fontconfig,fribidi,harfbuzz)上。 GTK +使用Pango进行文本布局(实际上将文本块排列成行和段)和绘图(Pango与cairo集成); 我相信Qt也使用自己的(这一次我不知道)。

我曾经写过X11的功能

没有明确的答案。 Linux上没有本地GUI,就像在Windows和OSX上一样。 X11是Linux上使用的窗口系统(这也适用于Wayland和Mir),它是非常基础和低层次的,主要负责处理输入设备和将窗口分配给应用程序。 它不提供任何GUI组件,如按钮或文本字段。 从这个意义上讲,Qt和GTK +都可以被看作是“本地”Linux GUI库。 更糟糕的是,桌面环境也扮演了一个角色。 在Gnome上,GTK +可以被看作是更“本土化”的,而在KDE上则更加“本土化”。