手工编码的GUI与Qt Designer的GUI [关闭]


115

我花这些假期学习编写Qt应用程序。几个小时前,我正在阅读有关Qt Designer的文章,这使我感到奇怪:用Qt编写现实世界应用程序的人会使用什么来设计其GUI?实际上,人们通常如何设计GUI?

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

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

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

Answers:


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. 您可能会做一些更受限的事情,例如xPad,而Designer的功能有限。

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

我将使用Designer作为另一个工具,就像您的文本编辑器一样。找到限制后,请针对该新问题尝试其他工具。我完全同意Steve S的观点,Designer的一个优点是其他人(不是程序员)可以进行布局。


23
永远不需要修改uic(.ui文件编译器)生成的代码。如果需要更多功能,请创建一个新类,该类从生成的类继承或将其作为成员包括在内,并添加所需的代码。
Parker Coates

1
值得注意的是,在Qt3和早期的Qt4(大约2008年)中,Qt Designer缺少一些可能对某些应用最流行的功能,例如,不支持ButtonGroup,自定义插槽,命名QLayouts等。但对于最后5个功能, 6年左右,所有这些问题都已解决。如果可以的话,我更喜欢使用UI文件,重组布局要容易得多,并且可以减少代码维护。
布伦丹·亚伯

42

根据我在Qt Designer和其他工具箱/ UI工具方面的经验:

  • 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进行编程。

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


8

只是说我在不使用Qt Designer的情况下用Qt编写和维护了复杂的GUI,这不是因为我不喜欢Qt Designer,而是因为我从来没有那样做。

这部分取决于样式和您的来源:当我开始使用Qt时,我曾有过Dreamweaver和Frontpage以及其他可视HTML工具的可怕经历,并且更喜欢使用HomeSite编写代码,并借助Photoshop进行棘手的布局问题。

您试图将可视化代码IDE保留在可视化工具中存在危险,但是最终还不得不以一种尚未被很好理解的方式来调整代码。

例如,在学习iPhone开发时,我发现击中“魔术”视觉内容(“从Connections检查器中的空圈拖到Interface Builder窗口中的对象...”)令人沮丧(对于我)以普通的旧代码理解。

Qt祝您好运-这是一个很棒的工具包,但是您可以使用它,而且Qt Creator看起来像是一个很棒的IDE。


7

我要补充一点,例如,使用图形设计器的原因之一就是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可以为您提供更大的灵活性,而在如此大的应用程序中,即使只是出于优化目的,您可能也需要这样做。


5
布局管理器与GUI设计器并不相互排斥。实际上,任何不使用某种布局管理器概念的GUI设计器对于在99%的现代GUI应用程序上进行工作都比没有用处更糟糕。
史蒂夫S

7

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


5

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


3
是的,这对我来说简直是天方夜谭,但是大约几年前,当我使用Qt超过一年时,我意识到我可以通过手写完成比图形设计更快的ui工作。缺乏手写的ui编码的一件事是,直到将其执行到屏幕上之前,它的外观还是很难被看到(这有时是合作作品的重要方面)。
Joonhwan 2012年

1
和她一样,我不能容忍设计师,对我而言,手工书写要强大得多,而且速度更快,这是因为最初我使用的是非常慢的Mac,几乎无法处理拖放,并且几年后它成为唯一的方法我可以做设计:)大约看不到,一年以后我不需要执行它,所有这些都映射在我的大脑想象层中。
ColdSteel

4

我想先请设计师开发GUI小部件。如其他帖子所述,其速度更快。您还会立即得到反馈,以查看它是否“看起来正确”并且不会给用户造成混淆。设计师是我选择Qt而不是其他工具箱的主要原因。我主要使用设计器创建一次性对话框。

话虽如此,我手工完成了主窗口和所有复杂的小部件。我认为这就是Trolltech的意图。 QFormLayout是他们提供的一个类,可轻松以编程方式创建输入对话框。

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


4

这是一篇旧文章,但我建议您看看Clementine-我认为是Amarok衍生的音乐播放器。他们使用Qt4,从我可以看到的项目的src文件夹中有一个ui文件夹。正如人们所期望的那样,在ui文件夹中,它们具有各种各样的.ui文件。如果编译并启动Clementine,您将看到GUI相当复杂且相当不错。


3

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

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


我在MFC应用程序中有几个非常相似的Windows对话框。最近,我尝试将所有控件放在单个对话框中,并根据应用程序的当前模式隐藏并重新定位某些控件。您是说在Qt中可以轻松地以编程方式构建控件吗?我一直在想这对我来说是否更容易。很想听听您的想法。
米奇

Mitch,是的,在Qt中,您可以以编程方式构建控件,这非常容易。Qt还使用动态布局,这意味着您的对话框仍然看起来不错,并且无论您添加一个复选框还是二十个复选框都可以使用。
乔治Y。

2

如果有人需要创建Gui,我们将使用Qt Designer。
事情是只为某些任务创建小部件(就像您在类设计中所做的那样),然后将它们放在一起成为“ parent-gui”。

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

另外,我们正在创建.ui文件,该文件可能会在构建过程中生成。到现在为止,无需手动编辑这些文件。


0


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

有些事情在Qt Designer中是无法做的,只能在代码中完成,
因此Qt Designer只是工具链中的一小部分。


哦,正是因为@MOnsDaR说
戴夫
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.