如何制作 Linux 图形用户界面?

27

我的主要经验是C和C++,因此我更愿意继续使用它们。我不想使用类似QT、GTK或wxWidgets这样的工具包。我想学习本地编程,这有点违背了初衷。考虑到这一点,我也想避免使用Java。

我了解gnome、xfce以及KDE等都是Linux的桌面环境,通常安装的基础是X(Xorg)。在为Linux编程时,你是为X还是为桌面环境编码?是否有用于此的标准Linux头文件(就像win32有windows.h)?还是对于每个桌面环境都有不同的编程方法?

非常感谢任何帮助。


我对这些答案感到非常失望(我猜在这里是可以预料的)。有些人想要学习和尝试。人们过于执着地守门,因为他们“更懂”。几年前,我在一个32位微控制器上开发了一个用于小型电阻触摸屏的GUI,通过基本的SPI启用显示驱动程序。它有寄存器调用来绘制基本图形 - 线条、矩形、椭圆,并且我在其之上构建了一个完整的基于菜单的GUI,带有一些基本的图形元素。不要让这些“专家”阻止你学习。 - Kurt E. Clothier
11个回答

67

X是一种难以编程的层级,尽管你想避开Java、QT或任何其他优秀的UI抽象层,但如果你按照这个层级进行编码,你会自欺欺人。我曾经这样做过(在我们使用平台上Motif还处于起步阶段的很久以前),如果有更简单的方法,我绝不会再这样做。

你使用"native programming"这个短语有些令我困惑。如果你想学习本地编程,就要选择调用的API。同样的道理,你也不应该使用C编程,而是选择汇编语言(或直接使用机器语言),因为C提供了对硬件的抽象。

如果你想学习X编程,那也无可厚非。你将会拥有更多控制界面的能力,但几乎所有其他人都将在软件交付方面超过你。就我个人而言,我更喜欢使用可以在许多平台上使用的高级API进行编码——这既可以提高交付速度,还可以增加市场潜力。

建造房子不是用原子,而是用砖头。我的建议是使用工具,它们就是为此而存在的。


1
我不得不直接使用 Motif(只因为我们正在使用内部开发的窗口管理器),这很困难。我宁愿使用其中一个免费可用的 UI 抽象层。 - hhafez
使用Xlib编写用户界面不像使用普通的Win32编写用户界面,更像是在DirectDraw中编写用户界面;它比Win32更低级。 - Ana Betts
6
如果您不愿意经历数个抽象层,Linux开发可能并不适合您。 ;) - jalf
3
现在大多数的开发都是这样。 - Joey

43

我不想使用类似QT、GTK或wxWidgets等工具包。我想学习本地编程,这样做有点违背初衷。

你不需要这样做。在早期的X11版本中,如R1或R2,我仅使用Xlib编写了完整的“Hello,world”程序。

大约700行C代码。

你不想走这条路。


9
在问答网站上经常会出现典型的无聊回复,比如有人问“如何做ABC?”,就会有人回答“你为什么要做ABC?”除非你懂得如何使用Xlib进行编码,否则你永远不可能有机会自己编写Xlib——尤其是为了一个尚未被发明的新操作系统内核。当然,如果你在专业领域按时交付软件,你会选择一个得到广泛支持的高级抽象层。但是,如果你盲目地相信现代程序员,你将永远无法学习如何在需要的时候构建基础组件。 - Mozan Sykol
典型的迂腐无聊之言。他显然是新手。如果他想学习内部机制,他可以这样做,但是——再次强调,在 Xlib 之外几乎没有什么东西的时候,只有傻瓜才会试图这样做,只是为了学习如何编写 X GUI。 - Charlie Martin
在窗口中看到那700行用于简单的“hello world”程序将会非常有趣! - Victor
1
@victor 这是它的链接 https://gist.github.com/whosaysni/5733660 我认为由于 Xutils.h 的存在,它不像40年前那么丑陋了。 - Charlie Martin
只有一只鹅才会认为那些试图传授辛苦学来的智慧的人是个傻瓜 :-) - paxdiablo
显示剩余3条评论

16

我想你可以直接使用C代码针对Xlib,但是你最终会重新创建所有GTK+或QT提供的X本身无法提供的功能。


同意;我认为这是在Linux世界中不同的做事方式。 - Sydius
我知道Linux本身最初只是控制台,GUI是由第三方程序添加的。但在Linux中使用所有这些工具包感觉很奇怪,感觉好像需要使用“黑科技”或绕弯路才能获得GUI。 - John T
2
@Mike,你玩NVidia驱动的DirectX游戏时感觉到“黑科技”了吗?它们是第三方软件。 - paxdiablo
4
@Mike:在Unix哲学中,每项工作都有一个相应的工具。Xlib位于比您期望的更低的级别,它使您能够显示内容。按钮等控件位于工具包中,因此您需要选择一个... - Piotr Lesnicki

11

Unix(以及Linux)实际上并没有定义与GUI有关的任何内容。常用的X也不定义与小部件或样式等有关的任何内容,它主要涉及绘图和事件处理。基本上,如果你想要纯粹使用X编写程序,你需要定义屏幕上每个元素的形状和行为。如果你足够疯狂放弃X,那么你将会在图形帧缓冲区级别工作...

如果您要使用一些工具包,最好使用轻量级的工具包,为什么不尝试FLTK呢?


5

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

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

在尝试此操作之前,最好选择首选桌面环境的工具包并从那里开始。


5
我认为有必要对其他答案的一致性提出反驳。X11确实是低级的,但是要“真正”理解其工作原理,您应该对X11有一些了解。由于所有工具包都建立在X之上,所以无论您喜欢与否,都会使用它。有一个很好的在线教程可以指导您构建一个简单的Hello World,但我懒得去找。在此过程中,您将需要学习如何创建窗口,请求事件,映射窗口以及在循环中处理事件。您甚至可以在亚马逊上订购一些二手书籍。O'Reilly的第1卷和第2卷(现在获取最便宜的版本,但不要早于X11R4)是参考资料和全面了解各部分如何协同工作的必备工具。然而,对于学习来说,最好的书籍是Eric Johnson和Kevin Reichard编写的《X Window应用程序编程》。
在这段旅程的某个时候,正如其他人所说,您会发现自己已经足够了。两页的代码仅用于选择视觉效果,然后您仍然需要填充颜色映射才能绘制自定义位图。然后花费两天时间重写和调试才意识到所有东西都能正常工作,只是您忘记了使用XFlush()!
奋斗很重要,因为一旦找到喜欢的工具包,您就会更加欣赏它们。

4

在这种情况下,没有所谓的“本地语言”。Windows和OS X只是有一个官方选项,而X没有。


嗯,X确实有一个官方选项,但它只是一个非常低(丑)级别的选项。 - paxdiablo

4
Linux和大多数其他类Unix操作系统的“本地”接口是Xlib,这是X11的最低级C API。GTK、Qt等都是基于Xlib实现的。正如其他人所说,Xlib可以给你最大的控制力,但你需要为此付出努力(而且其他人可能在交付产品方面比你更有经验)。作为参考,我个人用C++实现了一个相当功能丰富且现代化(即可流动)的跨平台(Win32 + X11)GUI库。总代码行数约为29 KLOC的C++,其中大约2500行分别用于X11和Win32的桥接,其余用于平台中立的Widget实现。除非你准备做出这样的承诺,否则我强烈建议使用更高级别的库(Qt可能是我的选择,尽管我不喜欢预处理器方法)。顺便说一句,Xlib的一个重要优点是它的原始可移植性 - 任何带屏幕的Unix机器都会有它,它也可以在Windows和OS X上运行。

1
我建议使用lesstif/motif。它也是基于X构建的,但在我看来,学习曲线不像GTK或Qt那么陡峭。你用它构建的用户界面可能不会像用GTK或Qt构建的那样复杂。更多信息可以在这里找到。
正如其他人提到的,你可能不想使用X,因为它很麻烦。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接