【问题标题】:How do GTK and Qt integrate with Linux in comparison to how they integrate with Windows and OS X?与与 Windows 和 OS X 的集成相比,GTK 和 Qt 如何与 Linux 集成?
【发布时间】:2016-02-26 10:01:47
【问题描述】:

据我了解,Windows 和 OS X 端的 Qt 和 GTK 只是原生 GUI 库的包装器,就像 OS X 包装 Cocoa 和 Windows 围绕 Win32 一样。但是,我的问题是,它们如何与 Linux 集成?桌面环境开发人员是否必须为 Qt 或 GTK 实现特殊库,或者它是如何工作的?我环顾四周,但我真的找不到答案。

【问题讨论】:

  • 您确定 Windows 和 MacOSX 具有 native GUI 吗? AFAIU,两者都可以在无屏服务器上运行

标签: c++ c linux qt gtk


【解决方案1】:

没有明确的答案。 Linux 上没有本机 GUI,Windows 和 OSX 上也有。 X11 是 Linux 上使用的窗口系统(Wayland 和 Mir 也一样),非常基础和低级,主要负责处理输入设备和为应用程序分配窗口。它不提供任何 GUI 组件,例如按钮或文本字段。从这个意义上说,Qt 和 GTK+ 都可以被视为“本机”Linux GUI 库。更糟糕的是,桌面环境也发挥了作用。在 Gnome 上,GTK+ 可以被视为更“原生”,而在 KDE QT 上更“原生”。

【讨论】:

  • 我们确定吗? OSX(也许还有 Windows,我不知道)有一个 native GUI? AFAIU,您可以在无屏幕服务器上运行它们。那我就不会把 GUI 称为 native 了!!
  • 您可能还可以从 OSX 和 Windows 中剥离网络、声音等,但仍然有一些功能正常的系统。这是否意味着前面提到的系统没有 native 网络/声音 API? Cocoa 是 OSX 安装不可或缺的一部分,WinAPI 也是如此。这就是我所说的native API
  • 那么 X11 服务器和一些桌面软件是大多数 Linux desktoplaptop 安装的组成部分(但无头 Linux 服务器不会有它们)因此在某种意义上 Qt 和/或 GTK 将是这些 Linux 系统上的本机 API,因此您声称“桌面 Linux 上没有本机 GUI”可能会受到质疑。但我在挑词,没关系
  • 当我们说“本机”时,我们的意思是 OS X 和 Windows 具有 OS 开发人员认可、官方提供且普遍使用的一组控件、对话框等。在 OS X 上,此被称为可可; Windows 没有为此命名(我们称之为 Windows API),但大部分工作在 user32.dll、comctl32.dll 和 comdlg32.dll 之间共享(在资源管理器的帮助下)。 Unix 系统没有这样的东西。 GTK+ 和 Qt 是最接近的,它们都是完全独立的(包括在实现中)。
  • 或者换一种说法,OS X 和 Windows 提供了 X11 的窗口管理功能 GTK+/Qt 的小部件工具包功能作为其原生 API 的一部分; Unix 传统上将两者分开。
【解决方案2】:

在 Linux(台式机和笔记本电脑)上,图形屏幕通常由 X11 服务器显示(至少 2015 年初是这种情况)。您的 GUI 应用程序通过 sockets 与该服务器通信,通常在本地 Unix socket 上,例如 /tmp/.X11-unix/X0。 X11服务器一般为Xorg

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

一些发行版正在切换到Wayland(或者可能是Mir)。由于我不了解这些,我无法解释血淋淋的细节。 AFAIU,仍然涉及一些服务器(像 Xorg 一样,它是唯一与您的显卡对话的用户级软件组件)和一些协议,并且 Qt 和 GTK 等主要工具包已经适应了它们(所以如果你为Qt 或 GTK,你不需要关心这些细节,但你应该升级你的工具包)。

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

另请参阅this answer 的相关问题。我在那里解释说 X11 现在不像上个世纪那样被使用;特别是 服务器端 drawing abilities of X11(例如 Xlib 的 XDrawLineXDrawText)今天很少使用,因为该工具包正在绘制像素图图像客户端并将 sending 绘制到服务器.

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

实际上,user interfaces 非常复杂,您真的应该为它们使用一些工具包(Qt,如果使用 C++ 编码)。从头开始编码(甚至高于 X11 的 XlibXCB)需要多年的工作。

X11 之上还有其他几个widget toolkits,例如FOX toolkitFLTK(但它们中的大多数功能比 Qt 或 GTK 少得多)。

【讨论】:

    【解决方案3】:

    一些进一步的说明。

    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.

    【讨论】:

    • 是的,这就是我的意思,它使用自己的模板生成 GUI,但在 Windows 和 OS X 上使用操作系统提供的 API
    • 我已经更新了我的答案;希望这次更新能回答您的其他问题。
    • 谢谢,确实有帮助:)
    • 错误更新。 X11 有原生的drawing 原语(即使是drawing text...),但它们今天用得不多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-14
    • 2012-09-07
    • 2020-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多