【问题标题】:How do you make linux GUI's?你如何制作linux GUI?
【发布时间】:2008-12-12 01:37:08
【问题描述】:

我的主要经验是使用 C && C++,所以我更愿意继续使用它们。我不想使用 QT、GTK 或 wxWidgets 或任何工具包之类的东西。我想学习本机编程,这违背了目的。考虑到这一点,我也想避免使用 Java。

我了解 gnome 和 xfce 和 KDE 等都是 Linux 的桌面环境,安装的基础通常是 X (Xorg)。在为 Linux 编码时,您是为 X 编码还是为桌面环境编码?是否有适用于 Linux 的标准 Linux 标头(如 win32 有 windows.h)?还是每个桌面环境都有不同的编码方法?

非常感谢任何帮助。

【问题讨论】:

    标签: c++ c linux native


    【解决方案1】:

    X 是一个可怕的编程层,尽管您打算避免使用 Java、QT 或任何优秀的 UI 抽象层,但如果编码到那个级别,就会对自己造成伤害。我已经做到了(很久以前,当 Motif 在我们使用的平台上还处于起步阶段时),如果有更简单的方法,我不会再做一次。

    您对“本地编程”一词的使用让我有些困惑。如果你想学习原生编程,那就是你选择调用的 API。使用类似的推理,您也不应该使用 C 进行编码,而是选择汇编程序(或直接机器代码),因为 C 提供了对硬件的抽象。

    如果你想学习 X 编程,那很好。您最终将获得对界面的更多控制权,但几乎所有其他人在软件交付方面都将超越您。就我自己而言,我更喜欢编写可以在许多平台上使用的更高级别的 API - 它给了我更快的交付时间和更大的市场潜力。

    你不是用原子建造房子,而是用砖块建造它。我的建议是使用这些工具,这就是它们的用途。

    【讨论】:

    • 我不得不直接使用motif(只是因为我们使用的wm是内部开发的),这并不容易。我宁愿使用免费提供的 UI 抽象层之一
    • 在 Xlib 中编写 UI 不像在普通 Win32 中编写 UI,它更像是在 DirectDraw 中编写 UI;比Win32低级很多
    • 如果你不愿意经历六个抽象层,Linux 开发不适合你。 ;)
    • @jalf:实际上是当今的大多数开发。
    【解决方案2】:

    我不想使用 QT、GTK 或 wxWidgets 或任何工具包之类的东西。我想学习本机编程,但这样就达不到目的了。

    不,你没有。回到 X11 的早期版本,如 R1 或 R2,我仅在 Xlib 中编写了一个完整的“Hello, world”程序。

    大约 700 行 C.

    你不想去那里。

    【讨论】:

    • 这个评论让我笑了
    • -1。在问答网站中发现的典型废话——每当有人问“如何做 ABC?”时,有人回答“你为什么想做 ABC?”。除非您了解如何使用 Xlib 进行编码,否则您将永远无法自己编写 Xlib - 可能用于尚未发明的新 OS 内核。当然,如果您在时间线下专业地交付软件,您将使用支持良好的高级抽象。但是,如果您盲目地相信现代程序员,您将永远无法在需要时学习如何构建原语。
    • 典型的迂腐废话。他显然是新手。如果他想学习内部结构,他可以,但是——再说一次,在 Xlib 之外并没有太多时这样做了——只有傻瓜才会尝试这样做,只是为了学习如何编写一个X 图形用户界面。
    【解决方案3】:

    我猜你可以直接针对 Xlib 编写 C 代码,但你最终会重新创建 GTK+ 或 QT 提供的所有功能,而 X 并不孤单。

    【讨论】:

    • 同意;我认为这是 Linux 世界中一种不同的做事方式。
    • 我知道linux本身最初只是控制台,GUI是由第三方程序添加的。但是在 Linux 中使用所有这些工具包感觉很奇怪,感觉就像获得一个 GUI,你需要使用“黑客”或拐弯抹角。
    • @Mike,当您使用 NVidia 的驱动程序玩 DirectX 游戏时,您是否感觉到“黑客”?它们是第三方软件。
    • @Mike:在 unix 哲学中,每个工作都有一个工具。 Xlib 的级别比您预期的要低,它使您能够显示事物。按钮和东西在工具包中,所以你必须选择一个......
    【解决方案4】:

    Unix(以及扩展,Linux)实际上并没有定义任何与 GUI 相关的内容。 X 是常用的,它没有定义任何与小部件或样式或任何类似性质的东西 - 它主要关注绘图原语和事件处理。本质上,如果您想用纯 X 编写,您将定义屏幕上每个元素的形状和行为。如果您疯狂到放弃 X,您将在图形帧缓冲区级别工作...

    你最好使用 some 工具包 - 如果你正在寻找轻量级,为什么不试试FLTK

    【讨论】:

      【解决方案5】:

      GTK、QT 和 wx 是基于 X 构建的工具包,可提供更友好的 API。

      如果您不使用现有的工具包,您将需要编写非常底层的内容 - 直接处理鼠标和键盘事件。如果你想要一个按钮或一个文本框,你必须使用低级 xlib 原语自己编写。

      在尝试之前,您最好选择您喜欢的桌面环境的工具包并从它开始。

      【讨论】:

        【解决方案6】:

        在这种情况下,根本就没有“原生”这样的东西。 Windows 和 OS X 只有一个官方选项,而 X 没有。

        【讨论】:

        • 嗯,X 确实有一个官方选项,只是一个非常低(丑陋)的级别。
        【解决方案7】:

        Linux 和大多数其他类 Unix 操作系统的“本机”接口是 Xlib,它是 X11 的最低级 C API。

        GTK、Qt 和其他(据我所知)都是以 Xlib 为核心实现的。正如其他人所说,Xlib 为您提供了最大的控制权,但您必须为此努力(其他人可能会在交付产品方面绕着您转圈)。

        作为参考,我个人用 C++ 实现了一个功能相当丰富且现代(即可流动)的跨平台 (Win32 + X11) GUI 库。总计数约为 29 KLOC 的 C++,其中 X11 和 Win32 匀场需要约 2500 行。其余的用于平台中立的 Widget 实现。除非您准备好做出这样的承诺,否则我强烈建议您使用更高级别的库之一(Qt 可能是我的选择,尽管我无法忍受预处理器方法)。

        顺便说一句,Xlib 的一大优点是它的原始可移植性——任何带屏幕的 Unix 机器都可以,而且它也可以在 Windows 和 OS X 上运行。

        【讨论】:

          【解决方案8】:

          我觉得有必要在这里反驳其他答案的一致意见。 X11确实是低级。但要“真正”了解发生了什么,您应该对 X11 的工作原理有所了解。由于所有工具包都在 X 之上工作,因此无论您喜欢与否,您都在使用它。我懒得搜索的地方有很好的在线教程。它指导您构建一个简单的 Hello World。为此,您必须学习如何创建窗口、请求事件、映射窗口以及循环处理事件。你甚至可以在亚马逊上订购一些旧书。 O'Reilly vols 1 和 2(目前获得最便宜的版本,但不早于 X11R4)对于参考和了解这些部件如何协同工作的完整故事至关重要。然而,对于学习来说,最好的书是 Eric Johnson 和 Kevin Reichard 合着的 X Window Applications Programming。

          正如其他人所说,在这段旅程的某个时刻,你会发现你已经受够了。两页代码只是为了选择一个视觉对象,然后您仍然必须填充一个颜色图,然后才能绘制您的自定义位图。然后经过两天的重写和调试,意识到这一切确实工作;你只是忘了XFlush()

          斗争很重要,因为一旦找到你喜欢的工具包,你就会更加欣赏这些工具包。

          【讨论】:

            【解决方案9】:

            我也建议使用 lesstif/motif。它也建立在 X 之上,在我看来,学习曲线不像 GTK 或 Qt 那样陡峭。不过,您使用它构建的 UI 不会像您可以使用 GTK 或 Qt 构建的那样复杂。更多信息可以在here找到。

            正如其他人所提到的,您可能不想 X,这很痛苦。

            【讨论】:

              【解决方案10】:

              为什么不从 Qt、wxWidgets 和 GTK 中选择一种来学习它的内部结构,而不是它的 API?我的意思不仅仅是为了它,而是为了贡献你觉得最吸引人的部分。通过这种方式,您将实现您的目标并为您和他人做一些有用的事情。我认为这比给自己分配相当人为的任务来构建应用程序并使用错误的工具更有意义。

              【讨论】:

                【解决方案11】:

                哦,是的,有这样“原生”的东西:

                FBUI、svgalib、directfb、exa(kdrive)、SDL、Allegro..+Wayland,虽然不是主流。

                http://home.comcast.net/~fbui/

                http://www.svgalib.org/

                http://directfb.org/

                http://xorg.freedesktop.org/wiki/ExaStatus

                + http://wayland.freedesktop.org/

                【讨论】:

                  猜你喜欢
                  • 2023-01-19
                  • 1970-01-01
                  • 2010-10-07
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2023-04-01
                  • 2022-01-10
                  • 2013-06-04
                  相关资源
                  最近更新 更多