116

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

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

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

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

12 回答 12

44

我们对 Designer 的体验始于 Qt3。

Qt3

那时,Designer 主要用于生成代码,然后将其编译到应用程序中。我们开始为此目的使用所有生成的代码,一旦您编辑它,您就不能再返回并重新生成它而不会丢失您的编辑。我们最终只使用生成的代码并从今以后手工完成所有事情。

Qt4

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

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

自 Qt3 以来,我们还没有回到 Designer,但仍然使用它来制作原型和调试布局。

对于您的问题:

  1. 使用 Qt 提供的标准对话框,您可能会侥幸逃脱。 QInputDialog或者如果您将 QDialog 子类化,请确保使用QButtonDialogBox 以确保您的按钮具有正确的平台布局。

  2. 您可能会做一些更有限的事情,比如带有有限 Designer 功能的 xPad。

  3. 我不认为您可以仅使用 Designer 编写类似 OpenOffice 的东西,但也许这不是重点。

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

于 2008-12-24T04:40:34.917 回答
43

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

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

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

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

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

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

于 2008-12-22T19:39:24.183 回答
8

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

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

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

于 2008-12-22T20:22:32.333 回答
8

只是说我在没有使用 Qt Designer 的情况下在 Qt 中编写和维护了复杂的 GUI——不是因为我不喜欢 Qt Designer,而是因为我从来没有用那种方式工作。

这部分是风格问题和你来自哪里:当我开始使用 Qt 时,我在 Dreamweaver 和 Frontpage 以及其他可视化 HTML 工具方面有过可怕的经历,并且更喜欢使用 HomeSite 编写代码并诉诸 Photoshop 进行复杂的布局问题。

可视化代码 IDE 存在危险,您尝试将其保留在可视化工具中,但最终也不得不调整代码 - 以人们不太了解的方式。

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

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

于 2009-01-05T11:32:26.847 回答
7

我要补充一点,例如,使用图形设计器的原因之一是 Win32 中缺少布局管理器。只有绝对定位是可能的,而手动这样做会很糟糕。

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

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

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

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

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

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

于 2009-01-16T05:01:27.807 回答
7

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

于 2014-02-24T08:23:41.023 回答
5

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

于 2008-12-22T19:58:37.623 回答
4

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

话虽如此,我还是手动完成了主窗口和任何复杂的小部件。我认为这就是奇趣科技的意图。 QFormLayout是他们提供的一个类,可以轻松地以编程方式创建输入对话框。

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

于 2008-12-23T01:09:35.593 回答
4

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

于 2012-05-09T10:20:57.627 回答
3

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

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

于 2015-06-03T13:25:51.667 回答
2

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

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

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

于 2010-10-19T06:02:59.037 回答
0


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

有些事情你不能在 Qt Designer 中做,你只能在代码中做,
所以 Qt Designer 只是工具链的一个(伟大的)部分。

于 2017-02-26T19:52:11.873 回答