我正在利用这些假期学习编写 Qt 应用程序。几个小时前,我正在阅读有关 Qt Designer 的文章,这让我想知道:人们在 Qt 中编写现实世界应用程序时使用什么来设计 GUI?事实上,人们一般是如何设计 GUI 的呢?

一方面,我发现手动编写代码在概念上比使用 Qt Designer 更简单,尽管对于复杂的 GUI Designer 可能有意义。使用 Designer 可能可以实现大型 GUI,但随着时间的推移,随着复杂性的增加,它们可能会变得非常难以管理(这只是我的观点)。我还下载了 AmaroK 源代码来看看那些人在做什么,发现了许多对 addWidget() 和朋友的调用,但没有一个是由 Designer 创建的 XML 文件(除了:AmaroK 一定是我在任何平台上最喜欢的应用程序)。

那么,创建 GUI 的“正确”方法是什么?设计师还是代码?在本次讨论中,让我们考虑以下类型的 GUI:

  1. 简单的对话框只需要接受输入、显示一些结果并退出。我们假设一个应用程序获取 YouTube URL 并将视频下载到用户的硬盘上。新手可能会开始使用的应用程序类型。
  2. 中级 GUI,例如带有一些工具栏/菜单项的便签编辑器。我们以 xPad 为例(http://getxpad.com/)。我想说大多数应用程序都属于“实用程序”类别。
  3. 非常复杂的 GUI,例如 AmaroK 或 OpenOffice。当你看到它们时你就知道它们,因为它们让你的眼睛流血。
有帮助吗?

解决方案

我们对 Designer 的体验始于 Qt3。

Qt3

那时,Designer 主要用于生成代码,然后将其编译到应用程序中。我们开始为此目的使用,但对于所有生成的代码,一旦编辑它,您就无法再返回并重新生成它而不丢失您的编辑。我们最终只使用生成的代码并手动完成此后的所有操作。

Qt4

Qt4 在 Designer 上有了显着的改进。它不再只生成代码,而是可以动态加载到设计器文件(xml 中)并 动态地将它们连接到程序中正在运行的对象 -- 没有生成的代码,但是,您必须在设计器中命名项目并坚持使用这些名称,以免破坏您的代码。

我的评估是,它远不如 Mac OS X 上的 Interface Builder 那么有用,但此时,我可以看到直接在程序中使用 Designer 文件。

自 Qt3 以来,我们一直没有回到 Designer,但仍然使用它来进行原型设计和调试布局。

对于您的问题:

  1. 您可能可以不用使用 Qt 提供的标准对话框。Q输入对话框 或者如果您子类化 QDialog,请确保使用 Q按钮对话框确保您的按钮具有正确的平台布局。

  2. 您可能可以做一些更有限的事情,例如具有有限设计器功能的 xPad。

  3. 我不认为你可以只用 Designer 编写像 OpenOffice 这样的东西,但也许这不是重点。

我会使用 Designer 作为另一个工具,就像文本编辑器一样。一旦发现限制,请尝试使用不同的工具来解决新问题。我完全同意 Steve S 的观点,Designer 的一个优点是非程序员的其他人也可以进行布局。

其他提示

根据我使用 Qt Designer 和其他工具包/UI 工具的经验:

  • UI 工具可加快工作速度。
  • UI 工具使以后调整布局变得更加容易。
  • UI 工具使非程序员可以更轻松/可能地进行 UI 设计。

通常可以通过将设计分解为多个 UI 文件来在 UI 工具中处理复杂性。在每个文件中包含组件的小型逻辑组,并将每个组视为用于构建完整 UI 的单个小部件。Qt Designer 的升级小部件概念可以帮助解决此问题。

我还没有发现项目的规模有什么不同。您的体验可能会有所不同。

使用 UI 工具创建的文件(我想如果您确实愿意的话,您可以手动编写它们)通常可以在运行时动态加载(Qt 和 GTK+ 都提供此功能)。这意味着您可以更改布局并对其进行测试,而无需重新编译。

最终,我认为原始代码和 UI 工具都是有效的。这可能在很大程度上取决于环境、工具包/UI 工具,当然还有个人喜好。我喜欢 UI 工具,因为它们可以让我快速启动和运行,并允许以后轻松更改。

我工作的组织几年前已将其 GUI 应用程序移植到 Qt。我认为有几个方面值得一提:

  • 至少在当时,使用 Qt Designer 并不是一个现实的选择:有太多的功能是 Qt Designer 无法完成的;
  • 必须保留的约定和结构阻碍了 Qt Designer 的使用;
  • 一旦您在没有 Designer 的情况下开始使用,可能很难再回到它;
  • 但最重要的方面是,程序员非常习惯使用 vi 或 emacs 进行编程,而不是使用 GUI IDE。

我自己的经历,可以追溯到大约。4年来,使用Qt3.3,对话框中的动态行为在Designer中无法实现。

只是说,我在 Qt 中编写和维护了复杂的 GUI,而没有使用 Qt Designer——不是因为我不喜欢 Qt Designer,而是因为我从来没有抽出时间以这种方式工作。

这在一定程度上是风格和你来自哪里的问题:当我开始使用 Qt 时,我对 Dreamweaver 和 Frontpage 以及其他可视化 HTML 工具有过糟糕的经历,并且更喜欢使用 HomeSite 编写代码并诉诸 Photoshop 来解决棘手的布局问题。

可视化代码 IDE 存在一个危险,您试图将其保留在可视化工具中,但最终也必须以不太容易理解的方式调整代码。

例如,学习 iPhone 开发时,我发现点击“神奇”的视觉内容(“从连接检查器中的空圆圈拖动到 Interface Builder 窗口中的对象......”)会更简单(对于我)用简单的旧代码来理解。

祝 Qt 好运——无论你如何使用它,它都是一个很棒的工具包,而且 Qt Creator 看起来是一个很棒的 IDE。

我想补充一点,例如,使用图形设计器的原因之一是 Win32 中缺乏布局管理器。只能进行绝对定位,而手动进行则很糟糕。

自从我从 Delphi 转向 Java 来开发 GUI 应用程序(早在 2002 年),我就再也没有使用过设计器。我更喜欢布局管理器。是的,您可以获得样板代码,但是在 UI 设计器上移动对象可能需要与更改样板一样多的时间。另外,我会被一个缓慢的 IDE 困住;这是针对 Java/C# 的情况,好的,而对于 Qt(尤其是 Qt4)则不适用。对于 Qt3,我想知道为什么要编辑生成的代码 - 难道不能在其他文件中添加代码吗?出于什么原因?

关于讨论的案例:1) 手工编码的 GUI 可能写起来更快,至少如果你了解你的库的话。如果您是新手并且不了解它们,那么向设计师学习可能会节省时间并减少学习量,因为您不需要学习所使用的 API。但“少学”是关键因素,所以在这两种情况下我都会说手工编码 GUI。

2)菜单栏编写代码非常烦人。另外,请考虑加速器等细节。不过,这取决于您的习惯。一段时间后,键入样板文件可能比点击设计器来修复所有这些属性更快,但前提是你真的可以像打字机一样键入(就像那些管理员,键入 Unix 命令比键入 Unix 命令更快)使用任何 GUI)。

3)我会将案例#2 的答案扩展到这个案例。请注意,对于 Win32 平台,可能可以使用生成 Win32 资源的设计器 可能 加载速度更快(不知道)。

不过,我想提一下使用 Qt Designer 的一个潜在问题。真实世界案例:加载一个复杂的 Java 对话框(程序员文本编辑器的首选项对话框)需要几秒钟(比如 10 秒),其中包含很多选项。正确的解决方法是仅当程序员想要查看每个选项卡时(我后来意识到),通过向每个首选项集添加一个单独的方法来构建其 GUI,才加载每个选项卡。

如果您与设计师一起设计所有选项卡和选项卡切换器,您可以轻松做到吗?我想可能有一个类似的例子,其中手工编码的 GUI 为您提供了更大的灵活性,并且在如此大的应用程序中,您可能需要它,即使只是为了优化目的。

使用设计器创建 GUI 的主要好处之一是其他程序员可以轻松更改或维护表单和小部件,而无需深入研究复杂的代码。

奇怪的是,您说编写代码比在图形环境中操作对象更简单。这是理所当然的。
设计器的作用是让您的生活更轻松,从长远来看,它使您的代码更易于维护。在设计器中查看 UI 的外观比阅读代码并尝试想象它可能的外观更容易。
使用当前的 Qt,您几乎可以在设计器中完成所有操作,而您不能做的极少数事情,您可以在构造函数中使用很少的代码行来修复。举个最简单的例子——添加信号槽连接。使用设计器就像双击一样简单。如果没有设计器,您需要查找信号的正确签名,编辑 .h 文件,然后在 .cpp 文件中编辑编写代码。设计器使您能够超越这些细节并专注于真正重要的事情 - 您的应用程序的功能。

我喜欢首先请设计师来开发 GUI 小部件。正如其他帖子中提到的,它更快。您还可以获得即时反馈,看看它是否“看起来正确”并且不会让用户感到困惑。设计师是我选择 Qt 而不是其他工具包的主要原因。我主要使用设计器来制作一次性对话框。

话虽如此,我还是手工制作主窗口和任何复杂的小部件。我认为这就是奇趣科技的初衷。 QForm布局 是他们提供的一个类,用于轻松地以编程方式创建输入对话框。

顺便说一句,Qt 4 中的设计器并不是像 Qt 3 中那样的 IDE。它只是一个用于编辑 .ui 文件的编辑器。我喜欢这样。新的跨平台 IDE 将被称为 Qt Creator。

这是一篇旧文章,但我建议您看看 Clementine - 一个音乐播放器(我认为)源自 Amarok。他们使用 Qt4,据我所知,有一个 用户界面 文件夹中的 源代码 项目的文件夹。在里面 用户界面 正如人们所期望的那样,它们包含各种 .ui 文件。如果您编译并启动 Clementine,您会发现 GUI 相当复杂且非常漂亮。

对我来说,这取决于多少 逻辑 封装在小部件/GUI 中。如果只是简单的表单,我更喜欢使用 QtDesigner。

如果它包含复杂的检查或交互,我倾向于对其进行编程。

如果有人需要创建 Gui,我们将使用 Qt Designer。
问题是为某些任务创建一些小部件(就像您在类设计中所做的那样),然后将它们组合在一起形成“父 GUI”。

这样,您的小部件就具有高度可重用性,并且可以以模块化方式用于 Guis。您只需指定每个 Widget 发送哪些信号以及它们提供哪些插槽。

我们还创建了在构建过程中生成的 .ui 文件。到目前为止,还不需要手动编辑这些文件。

构建 UI 的不同部分
使用 QtDesigner 在不同的 .ui 文件中,
然后在代码中将它们组合在一起(并添加复杂性)。

有些事情你无法在 Qt Designer 中完成,只能在代码中完成,
所以 Qt Designer 只是 工具链.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top