手工编码的GUI与Qt Designer GUI

时间:2008-12-22 19:22:43

标签: c++ qt user-interface rad qt-designer

我正在花这些假期学习编写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。当你看到它们时,你就会知道它们,因为它们让你的眼睛流血。

12 个答案:

答案 0 :(得分:41)

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

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

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

我没有发现项目的规模有任何不同。您的经历可能会有所不同。

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

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

答案 1 :(得分:41)

我们在Designer中的经验始于Qt3。

<强> QT3

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

<强>的Qt4

Qt4在Designer上得到了显着改进。它不再仅生成代码,但您可以动态加载Designer文件(在xml中)和dynamically connect them to the running objects in your program - 没有生成的代码,但是,您必须在Designer中命名项目并坚持使用名称而不是打破你的代码。

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

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

对于你的问题:

  1. 您可能可以使用Qt提供的标准对话框。 QInputDialog或者如果你是QDialog的子类,请务必使用QButtonDialogBox 确保您的按钮具有适当的平台布局。

  2. 你可能会做更有限的事情,比如具有有限Designer功能的xPad。

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

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

答案 2 :(得分:8)

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

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

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

答案 3 :(得分:8)

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

部分原因在于风格和你来自哪里:当我开始使用Qt时,我会遇到Dreamweaver和Frontpage以及其他可视化HTML工具的糟糕体验,并且更喜欢使用HomeSite编写代码并使用Photoshop对于棘手的布局问题。

您尝试在可视化工具中保留可视代码IDE存在危险,但最终还是必须以不太清楚的方式调整代码。

学习iPhone开发,例如,我发现打击'魔术'可视化内容('从Connections检查器中的空白圈拖到Interface Builder窗口中的对象......')会很令人沮丧更简单(对我来说)用简单的旧代码来理解。

祝Qt好运 - 它是一个很棒的工具包,但你使用它,Qt Creator看起来像是一个很棒的IDE。

答案 4 :(得分:7)

我想补充一点,使用图形设计器的原因之一是Win32中缺少布局管理器。只有绝对的定位是可能的,手工做就好了。

自从我从Delphi切换到Java for 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为您提供了更大的灵活性,在这么大的应用程序中,您可能需要它,即使只是为了优化目的。

答案 5 :(得分:6)

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

答案 6 :(得分:5)

奇怪的是,你说编写代码比在图形环境中操作对象更简单。这是一个明智的选择 设计师可以让您的生活更轻松,从长远来看,它可以使您的代码更易于维护。在设计人员中更容易看到你的UI看起来像什么,然后阅读代码并试图想象它的样子。
使用当前的Qt,您几乎可以完成设计器中的所有操作以及您无法完成的极少数操作,您可以使用构造函数中的极少数代码进行修复。 以最简单的例子为例 - 添加信号槽连接。使用设计器就像双击一样简单。如果没有设计人员,您需要查找信号的正确签名,编辑.h文件,然后编辑在.cpp文件中编写代码。设计师允许您超越这些细节,并专注于真正重要的事项 - 应用程序的功能。

答案 7 :(得分:4)

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

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

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

答案 8 :(得分:4)

这是一个很老的帖子,但我建议你看看克莱门汀 - 一个音乐播放器(我认为)来自Amarok。他们使用Qt4,我可以看到项目的 src 文件夹中有一个 ui 文件夹。在 ui 文件夹中,人们可能会发现它们有各种各样的.ui文件。如果您编译并启动Clementine,您将看到GUI非常复杂且相当不错。

答案 9 :(得分:3)

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

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

答案 10 :(得分:2)

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

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

我们还创建了.ui-Files,它们可以在构建过程中生成。到目前为止,没有必要手动编辑这些文件。

答案 11 :(得分:0)

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

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