手工编码 GUI 与 Qt 设计器 GUI

我正在利用这些假期学习编写 Qt 应用程序。就在几个小时前,我读到了关于 Qt Designer 的文章,这让我很好奇: 用 Qt 编写真实世界应用程序的人们用什么来设计他们的 GUI?事实上,人们通常是如何设计 GUI 的?

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

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

  1. 简单的对话框,只需要输入,显示一些结果和退出。让我们假设一个应用程序接受 YouTube URL 并将视频下载到用户的硬盘上。新手一开始可能使用的应用程序类型。
  2. 中级图形用户界面,比如说,一个带有一些工具栏/菜单项的便利贴编辑器。让我们以 xPad 为例(http://getxpad.com/)。我认为大多数应用程序都属于“公用事业”的范畴。
  3. 非常复杂的图形用户界面,比如 AmaroK 或者 OpenOffice。当你看到它们的时候你就知道了,因为它们会让你的眼睛流血。
43411 次浏览

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

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

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

我没有发现这个项目的规模有什么不同。你的经验可能会有所不同。

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

最终,我认为原始代码和 UI 工具都是有效的。它可能在很大程度上取决于环境、工具箱/UI 工具,当然还有个人偏好。我喜欢用户界面工具,因为它们能让我快速启动和运行,并允许稍后进行简单的更改。

奇怪的是,你说编写代码比在图形环境中操作对象更简单,这是显而易见的。
设计师的存在是为了使您的生活更加轻松,从长远来看,它使您的代码更易于维护。在设计器中查看 UI 是什么样子比阅读代码并尝试想象它可能是什么样子更容易。
使用当前的 Qt,您可以从设计器内部完成几乎所有的事情,并且只有很少的事情是您不能做的,您可以在构造函数中用很少的代码行来修复这些问题。 例如,最简单的例子-添加一个信号槽连接。使用设计器只需要双击一下。如果没有设计器,则需要查找信号的正确签名,然后编辑。H 文件,然后编辑将代码写入。Cpp 文件。设计器允许您超越这些细节,关注真正重要的东西——应用程序的功能。

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

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

My own experience, which goes back approx. 4 years, using Qt3.3, is that dynamic behavior in dialogs was not possible to realise in Designer.

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

尽管如此,我还是手工完成了主窗口和任何复杂的小部件。 我觉得这就是巨怪科技的初衷。QFormLayout是他们提供的一个类,用于轻松地以编程方式创建输入对话框。

顺便说一下,Qt4中的设计器不是他们在 Qt3中使用的 IDE。只是个编辑器。Ui 文件。我喜欢这样。新的跨平台 IDE 将被称为 Qt Creator。

Our experience with Designer started in Qt3.

Qt3

此时,Designer 主要用于生成代码,然后将其编译到应用程序中。我们开始使用的目的是,但所有生成的代码,一旦你编辑它,你不能再回来,重新生成它而不丢失你的编辑。我们最终只是获取生成的代码,从此手工完成所有工作。

Qt4

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

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

我们从 Qt3开始就没有回到 Designer,但是仍然使用它来原型和调试布局。

For your problems:

  1. 您可以使用 Qt 提供的标准对话框。 QInputDialog 或者如果您继承了 QDialog,请确保使用 < a href = “ https://doc.qt.io/qt-5.7/qdialogbuttonbox.html”rel = “ norefrer”> QButtonDialogBox 确保你的按钮有正确的平台布局

  2. 您可以使用受限的 Designer 功能来做一些更有限的事情,比如 xPad。

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

I'd use Designer as another tool, just like your text editor. Once you find the limitations, try a different tool for that new problem. I totally agree with Steve S that one advantage of Designer is that someone else who's not a programmer can do the layout.

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

It's partly a matter of style and where you're coming from: when I started on Qt, I'd had horrible experiences of Dreamweaver and Frontpage and other visual HTML tools,and far preferred writing code with HomeSite and resorting to Photoshop for tricky layout problems.

使用可视化代码 IDE 存在一个危险,您试图将其保留在可视化工具中,但最终还是不得不以不易理解的方式调整代码。

例如,在学习 iPhone 开发时,我发现点击“魔术”视觉元素(“从 Connections 检查器的空白圆圈拖动到 Interface Builder 窗口的对象... ...”)会让人感到沮丧,因为对我来说,用普通的老代码更容易理解。

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

我要补充的是,使用图形设计器的原因之一是在 Win32中缺乏布局管理器,例如。只有绝对的定位是可能的,而且手工操作只会让人感觉很糟糕。

自从我在 GUI 应用程序上从 Delphi 切换到 Java (回到2002年) ,我再也没有使用过设计器。我更喜欢布局经理。是的,您得到了样板代码,但是在 UI 设计器上移动对象可能需要与更改样板代码一样多的时间。另外,我会被一个慢的 IDE 所困扰; 这是 Java/C # 的情况,好吧,而对于 Qt (特别是 Qt4) ,它不适用。对于 Qt3,我想知道为什么要编辑生成的代码-是不是可以在其他文件中添加代码?为什么?

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

2) Menu bars are quite annoying to write code for. Also, think to details like accelerators and so on. Still, it depends on what you're used to. After some time, it may be faster to type that boilerplate than to point-and-click into designer to fix all those properties, but just if you can really type like into a typewriter (like those admins for which typing Unix commands is faster than using any GUI).

3)我会把情况2的答案推广到这一个。注意,对于 Win32平台,使用能够更快地生成 Win32资源 也许吧的设计器来加载是可能的(不知道这一点)。

However, I'd like to mention a potential problem with using Qt Designer there. Real world case: it took some seconds (say 10) to load a complex Java dialog (the Preferences dialog box for a programmer's text editor) with a lot of options. The correct fix would have been to load each of the tabs only when the programmer wanted to see them (I realized that after), by adding a separate method to each preference set to build its GUI.

If you design all the tabs and the tab switcher together with a designer, can you do that as easily? I guess there might be a similar example where a hand coded GUI gives you more flexibility, and in such a big app, you're likely to need that, even if just for optimization purposes.

我们正在使用 QT 设计器,如果有人需要创建一个桂。
事情就是为特定的任务创建一些小部件(就像你在类设计中做的那样) ,然后把它们放在一起形成一个“父元素”。

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

We additionally are creating .ui-Files which than could be generated during build-process. Until now there was no need to edit those files by hand.

这是一篇老文章,但我建议你看看克莱门汀——一个音乐播放器(我认为)来自 Amarok。他们使用 Qt4和从我可以看到有一个 是的文件夹在 Src文件夹的项目。在 是的文件夹中,正如人们可能期望的那样,它们有各种各样的。Ui 文件。如果您编译并启动 Clementine,您将看到 GUI 是相当复杂和相当好的。

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

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

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

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

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