手写GUI与Qt Designer GUI的对比

116

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

就我而言,手工编写代码在概念上比使用Qt Designer更简单,尽管对于复杂的GUI,Designer可能是有意义的。使用Designer可以创建大型GUI,但随着复杂性的增加,管理它们可能变得非常困难(这只是我的看法)。我还下载了AmaroK源代码,看看那些家伙在做什么,发现许多调用addWidget()和其他类似方法,但没有Designer创建的那些XML文件(另外:Amarok必须是我最喜欢的任何平台上的应用程序)。

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

  1. 只需要输入、展示一些结果并退出的简单对话框。假设一个应用程序接受YouTube URL并将视频下载到用户的硬盘。这是新手可能开始的应用程序类型。
  2. 中级GUI,例如带有几个工具栏/菜单项的便笺编辑器。以xPad为例(http://getxpad.com/)。我会说大多数属于“实用程序”类别的应用程序都是如此。
  3. 非常复杂的GUI,例如AmaroK或OpenOffice。你看到它们时会知道,因为它们会让你眼花缭乱。
12个回答

44
我们在Qt3中开始使用Designer。
Qt3
那时,Designer主要用于生成代码,然后将其编译到应用程序中。我们开始使用它来实现这个目的,但是对于所有生成的代码,一旦您编辑它,您就不能再返回并重新生成它,否则会丢失您的编辑。因此,我们最终只是采取了生成的代码,并以后都手动完成所有操作。
Qt4
Qt4显着改进了Designer。它不再仅生成代码,而且您可以动态加载您的Designer文件(xml格式),并将它们动态连接到程序中运行的对象 - 没有生成的代码,但是您必须为Designer中的项目命名,并坚持使用名称以避免破坏您的代码。
我的评估是,它远不如Mac OS X上的Interface Builder有用,但是此时,我可以看到直接在程序中使用Designer文件。
自Qt3以来,我们没有回到Designer,但仍在使用它进行原型设计和布局调试。
针对您的问题:
  1. 你可以尝试使用Qt提供的标准对话框,例如 QInputDialog 或者如果你子类化了QDialog,请确保使用 QButtonDialogBox 以确保按钮有适当的平台布局。

  2. 你可能只能像xPad一样使用受限的Designer功能。

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

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


25
绝不应修改由uic(.ui文件编译器)生成的代码。如果需要更多功能,应创建一个新类,该类要么继承自已生成的类,要么将其包含为成员并添加所需的代码。 - Parker Coates
1
值得注意的是,在Qt3和早期的Qt4(约2008年左右),Qt Designer缺少一些可能对某些人来说至关重要的功能,如不支持ButtonGroups、自定义槽、命名QLayouts等。但在过去的5-6年中,所有这些问题都得到了解决。如果可以的话,我更喜欢使用UI文件,因为重新组织布局要容易得多,并且结果需要维护的代码要少得多。 - Brendan Abel

43

就我的使用经验而言,Qt Designer和其他工具包/UI工具的使用:

  • UI工具可以加快工作速度。
  • UI工具可以更轻松地在后期调整布局。
  • UI工具使非程序员更容易参与UI设计。

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

我没有发现项目规模会产生任何区别。您的经验可能有所不同。

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

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


8

我所在的组织几年前将其GUI应用程序移植到Qt。以下是值得一提的几个方面:

  • 使用Qt Designer工作并不现实,至少在那时,因为有太多的功能无法通过Qt Designer完成;
  • 必须保留的约定和结构阻止了使用Qt Designer;
  • 一旦你开始不使用Designer,恢复使用可能会很困难;
  • 最重要的方面是,程序员非常习惯于使用vi或emacs进行编程,而不是使用GUI IDE。

我的经验是,在大约4年前使用Qt3.3时,设计师中无法实现对话框中的动态行为。


8
只是想说,我在Qt中编写和维护了复杂的GUI,而没有使用Qt Designer - 不是因为我不喜欢Qt Designer,而是因为我从未尝试过那种方式。
这部分是风格和你来自哪里的问题:当我开始学习Qt时,我经历了Dreamweaver、Frontpage和其他视觉HTML工具的可怕经历,并且更喜欢使用HomeSite编写代码,并在遇到棘手的布局问题时求助于Photoshop。
视觉代码IDE存在一个危险,即您试图保持在视觉工具内,但最终还是需要调整代码 - 以一种不太容易理解的方式。
例如,在学习iPhone开发时,我发现很难理解“魔法”视觉内容(“从Connections检查器中的空圆圈拖动到Interface Builder窗口中的对象...”),如果用老式的代码来理解会更简单(对我来说)。
祝你在Qt上好运 - 它是一个伟大的工具包,无论你如何使用它,Qt Creator看起来都是一个伟大的IDE。

7
我认为使用图形设计师的原因之一是Win32中缺乏布局管理器。例如,只有绝对定位是可能的,手动完成这项工作会很糟糕。自从我在2002年从Delphi转到Java进行GUI应用程序开发以来,我再也没有使用过设计师了。我更喜欢布局管理器。当然,你会得到样板代码,但是在UI设计师上移动对象可能需要与更改样板代码所需的时间相同。此外,我将被卡在一个慢速IDE上;这适用于Java/C#案例,而对于Qt(特别是Qt4)则不适用。对于Qt3,我想知道为什么要编辑生成的代码-难道不可能在其他文件中添加代码吗?出于什么原因?
关于讨论的情况: 1)手写GUI很可能更快,至少如果你知道你的库。如果你是新手并且不知道它们,那么你可以通过设计师节省时间并学习更少,因为你不需要学习你使用的API。但是,“学习较少”是关键因素,因此在两种情况下我都会选择手写GUI。
2)菜单栏编写代码非常麻烦。此外,请考虑加速器等细节。但是,这取决于您习惯于什么。经过一段时间后,键入样板可能比指向并单击设计师以修复所有这些属性更快,但前提是您确实可以像使用打字机一样输入(就像那些使用Unix命令比使用任何GUI更快的管理员一样)。
3)我将答案扩展到第2种情况。请注意,对于Win32平台,使用生成Win32资源的设计师可能会更快速加载(不清楚)。但是,我想提到在那里使用Qt Designer可能存在的一个潜在问题。现实世界中的案例:加载具有许多选项的复杂Java对话框(程序员文本编辑器的首选项对话框)需要几秒钟(比如10秒)。正确的解决方法应该是仅在程序员想要查看它们时加载每个选项卡,通过为每个首选项集添加单独的方法来构建其GUI(我之后意识到了这一点)。如果你使用设计师设计了所有选项卡和选项卡切换器,你能轻松做到吗?我猜可能有一个类似的例子,其中手写GUI给你更多的灵活性,在这样一个大型应用程序中,即使只是出于优化目的,你也很可能需要它。

6
布局管理器与GUI设计师并不是互相排斥的。事实上,任何不使用某种布局管理器概念的GUI设计师,在现代GUI应用程序的99%工作中都比无用更糟糕。 - Steve S

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

5

说写代码比在图形环境中操纵对象更简单真是奇怪。这很简单明了。
设计师的存在是为了让你的生活更轻松,长期来看,它可以使你的代码更易于维护。在设计师中查看您的用户界面比阅读代码并试图想象它可能是什么样子要容易得多。
在当前的Qt中,几乎可以从设计师中完成所有事情,而您无法完成的极少数事情可以在构造函数中用非常少的行代码进行修复。 以最简单的示例为例-添加信号槽连接。使用设计师是双击即可完成。如果没有设计师,则需要查找信号的正确签名,编辑.h文件,然后在.cpp文件中编写代码。设计师使您能够超越这些细节,专注于真正重要的东西-应用程序的功能。


3
是的,这对我来说很奇怪,但自从几年前使用Qt一年多以来,我意识到手写UI比图形设计更快。手写代码UI缺少的一个东西是,除非将其执行到屏幕上(有时这是合作工作的重要方面),否则无法轻松地看到其外观。 - Joonhwan
1
同样的情况在这里,我无法容忍设计师,对我来说手写更加强大和快速,这是因为最初我使用的是非常慢的 Mac,几乎无法处理拖放操作,几年后这成为我进行设计的唯一方式 :) 至于看不见的部分,一年后我就不需要再执行它了,因为它已经被映射到我脑海中的想象层了。 - Coldsteel48

4

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


4
我喜欢首先向设计师开发GUI小部件。正如其他帖子中提到的那样,这更快。您还可以立即得到反馈,以查看它是否“看起来正确”并且不会让用户感到困惑。设计师是我选择Qt而不是其他工具包的主要原因之一。 我主要使用设计师制作一次性对话框。
话虽如此,我会手动完成主窗口和任何复杂的小部件。 我认为这就是Trolltech的初衷。QFormLayout是他们提供的一个类,可轻松地通过编程方式创建输入对话框。
顺便说一句,在Qt 4中的设计师不像Qt 3中的那个IDE。它只是用于编辑.ui文件的编辑器。我喜欢这种方式。新的跨平台IDE将被称为Qt Creator。

3

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

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


我在一个MFC应用程序中有几个非常相似的窗口对话框。最近,我尝试将所有控件放在单个对话框上,并根据应用程序的当前模式隐藏和重新定位某些控件。你是说在Qt中你可以很容易地通过编程构建控件吗?我一直在想这是否会更容易解决我的问题。很想听听你的想法。 - mitch
Mitch,是的,在Qt中你可以通过编程方式构建控件,而且非常容易。此外,Qt使用动态布局,这意味着无论你添加一个复选框还是二十个,你的对话框仍然看起来很好,并且可用。 - George Y.

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