【问题标题】:How are GUI frameworks actually developedGUI框架实际上是如何开发的
【发布时间】:2011-08-04 16:22:00
【问题描述】:

我主要从事 Web 开发工作,但偶尔也会做一些 C/C++ 或 Java 编程。我很好奇这些框架实际上是如何生成其 GUI 中使用的图形的。 GUI 元素(标题栏、窗口框架、状态栏、按钮等)是否由设计师在 Photoshop 中设计,然后开发人员将该图形添加到框架中?还是开发人员实际上是按照设计师的指导以编程方式构建元素?

如果有人能给我一个很棒的概述!

【问题讨论】:

    标签: cocoa qt user-interface gtk


    【解决方案1】:

    好问题,云雀!由于我们在 Qt Framework 分支,我会告诉你它是如何在 Qt 中完成的,但我相信你可以应用到类似的框架或库,如 GTK 等。

    因此,Qt 启动了一个框架,该框架将为各种平台提供一个 API,从而可以非常轻松地将您的应用程序从一个平台移植到另一个平台,同时在这些平台上提供 本机 外观和感觉。因此,例如在 MacOSX 上,按钮将具有这种蓝色 Aqua 样式,而在 Windows XP 上,它看起来像 Windows 平台上的按钮。奇趣科技付出了很多努力,并在使 GUI 看起来像原生的方面做得很好。那么它是如何工作的呢?好吧,所有的 Qt 小部件都使用 QStyle 及其衍生工具来呈现自己。根据样式,小部件的外观会有所不同。所有标准小部件都遵循为其设计的那些平台的指南。这背后可能有一些小的图形设计师工作,但我相信它并不那么重要。外观的主要来源是平台指南,这些指南描述了这些平台上的 UI 元素的外观及其行为。

    但 Qt 的发展速度非常快,而巨魔们带来了一项非常有前途的技术,称为 Qt Quick。它是一项了不起的技术,可以让设计师和开发人员紧密合作,提供最好的 UI。它非常注重在代码中使用 Photoshop、GIMP 或类似工具制作的图稿。使用 Qt Quick 设计人员提供的模型比使用 C++/Qt 更容易,因为 Qt Quick 最初就是为此而设计的。

    希望有帮助

    【讨论】:

    • 谢谢巴巴里斯! Qt 框架是否真的绘制元素而不是拉入图形文件(.jpg、.png 等...)?
    • 是的,它使用 QPainter 进行渲染,而 QPainter 又调用依赖于平台的原始函数,例如 drawRect 渲染每个 UI 元素的部分。虽然,正如我所说,使用 Qt Quick,您可以利用开发人员与设计师的合作,通过使用艺术作品代替您使用 API 执行的大多数绘制方法。
    • 平台原语函数(例如drawRect)是Qt应用程序运行的操作系统的一部分吗?例如:Windows 7 有一个 drawRect 可以绘制一个“Windows”样式的矩形,OS X 有一个 drawRect 可以绘制一个“Mac OS X”样式的矩形。如果是这种情况,平台函数(drawRect)是否真的会使用自己的样式在屏幕上绘制像素?
    • 我不相信“drawRect”的结果在你所看到的任何平台上都是不同的。这将是一个线宽为 X、颜色为 Y、尺寸为 AxB 的矩形。 Qt 使用这些 API 来呈现集成 QStyle API 的小部件,从而为开发人员提供更改元素外观的小细节的优势。
    • 你提到的可能是更高层次的东西。我真的不知道用于渲染 UI 元素的平台 API,但我相信它可能存在一些确实提供一些“MacOSX 外观”框架或其他东西的方法。我相信 Qt 的代码是以一种仅在必要时利用它的方式实现的。
    【解决方案2】:

    大多数 GUI 框架的基本低级功能已经很老了,这是早期开发人员使用原语进行大量艰苦工作的结果——实际上是在终端屏幕等上使用 C 或汇编器。慢慢地,用于抽象这些过程的库,以及用于改进和组织它们的框架和类层次结构应运而生。所有 Linux GUI(事实上,几乎所有当代 GUI 框架)都基于 XWindows,例如:

    X 起源于麻省理工学院 (MIT) 1984. 协议版本自 1987 年 9 月以来一直是 X11....X 主要定义协议和图形原语 - 它故意 不包含应用程序用户界面设计的规范,例如 作为按钮、菜单或窗口标题栏样式。相反,应用程序 软件——例如窗口管理器、GUI 小部件工具包和桌面 环境或特定于应用程序的图形用户界面 – 定义并提供此类详细信息。因此,没有典型的 X 界面和几种不同的桌面环境已成为 深受用户欢迎。

    在此处查看更多信息,了解有关此主题的一些有用信息。

    【讨论】:

      猜你喜欢
      • 2021-05-26
      • 1970-01-01
      • 2011-06-25
      • 2016-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-16
      • 1970-01-01
      相关资源
      最近更新 更多