与 Windows 和 OS X 集成相比,GTK 和 Qt 如何与 Linux 集成?

How do GTK and Qt integrate with Linux in comparison to how they integrate with Windows and OS X?

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

没有明确的答案。 Linux 上没有本机 GUI,而 Windows 和 OSX 上有。 X11 是 Linux 上使用的窗口系统(这也适用于 Wayland 和 Mir),非常基础和底层,主要负责处理输入设备和分配 windows 给应用程序。它不提供任何 GUI 组件,例如按钮或文本字段。从这个意义上说,Qt 和 GTK+ 都可以看作是 "native" Linux GUI 库。更糟糕的是,桌面环境也起着一定的作用。在 Gnome 上,GTK+ 可以看作更多 "native",而在 KDE QT 上更多 "native".

在 Linux(台式机和笔记本电脑)上,图形屏幕通常由 X11 server. Your GUI app is communicating with that server thru sockets, often locally on a Unix socket like /tmp/.X11-unix/X0. The X11 server is generally Xorg.

显示(至少 2015 年初是这种情况)

对于一些嵌入式设备,如 Android 手机或一些小工具(汽车、汽车或医疗设备行业中的 GPS),它是不同的(DirectFB, framebuffer devices - 它被桌面上的 X11 服务器,...)

一些发行版正在切换到 Wayland (or perhaps to Mir)。由于我不太了解这些,我无法解释血淋淋的细节。 AFAIU,仍然涉及一些服务器(像 Xorg 一样,它是唯一与您的图形卡通信的用户级软件组件)和一些协议,并且 Qt 和 GTK 等主要工具包已适应它们(因此,如果您为Qt或GTK,你不关心那些细节,但你应该升级你的工具包)。

图形工具包(Qt、Gtk)通过一些特定的协议与 X11 服务器(或 Wayland 服务器)交互,例如X Window System protocols for X11. For historical reasons, these protocols are quite complex, and practically require to follow some conventions like EWMH

另见this answer to a related question. I explain there that X11 is not used today as it was in the previous century; in particular the server-side drawing abilities of X11 (e.g. Xlib's XDrawLine or XDrawText) are rarely used today, because the toolkit is drawing a pixmap image client side and sending它到服务器。

请注意,您可能会考虑不提供 GUI 界面,而是 Web interface, to your application (e.g. using libraries like libonion, Wt, ....);那么你的应用程序就变成了一个专门的网络服务器,用户会通过他的浏览器(在他的 desktop/laptop/tablet/phone 中)与你的应用程序进行交互。

实际上,user interfaces are so complex that you really should use some toolkit for them (Qt if coding in C++). Coding from scratch (even above Xlib or XCB X11) 需要多年的工作。

还有其他几个 widget toolkits above X11, e.g. FOX toolkit, FLTK(但其中大多数功能比 Qt 或 GTK 少得多)。

一些进一步的说明。

GTK+ 和 Qt 都不使用 Windows 和 OS X 的本地小部件。它们 近似 使用本地 API 的外观和感觉,但在内部一切都是定制的。

GTK+ 和 Qt 负责并定义 Linux 上的程序可用的主题。桌面环境通常提供一种方法来全局更改所有应用程序的主题,但如何完成由 GTK+ 和 Qt 定义。例如,GTK+ 3 通常使用 ~/.config/gtk-3.0/settings.ini 来存储此信息 (and there is a programmatic API to this file)。

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也使用它自己的(这次我不确定)。

I wrote about what X11 does do some time ago.