ChatGPT解决这个技术问题 Extra ChatGPT

手工编码的 GUI 与 Qt 设计器 GUI [关闭]

关闭。这个问题是基于意见的。它目前不接受答案。想改进这个问题?更新问题,以便可以通过编辑这篇文章用事实和引用来回答它。 3年前关闭。改进这个问题

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

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

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

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


f
feedc0de

我们对 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,但仍然使用它来制作原型和调试布局。

对于您的问题:

使用 Qt 提供的标准对话框,您可能会侥幸逃脱。 QInputDialog 或者如果您将 QDialog 子类化,请确保使用 QButtonDialogBox 以确保您的按钮具有正确的平台布局。您可能会做一些更有限的事情,比如带有有限 Designer 功能的 xPad。我不认为您可以仅使用 Designer 编写类似 OpenOffice 的东西,但也许这不是重点。

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


永远不需要修改 uic(.ui 文件编译器)生成的代码。如果需要更多功能,请创建一个新类,该类继承自生成的类或将其作为成员包含并添加所需的代码。
值得注意的是,在 Qt3 和早期的 Qt4(大约 2008 年)中,Qt Designer 缺少一些可能对某些人来说可能是阻碍的功能,例如缺乏对 ButtonGroups、自定义插槽、命名 QLayouts 的支持等。但对于最后 5- 6年左右,所有这些问题都得到了解决。如果可以的话,我更喜欢使用 UI 文件,重新组织布局要容易得多,并且需要维护的代码要少得多。
S
Steve S

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

UI 工具加快了工作速度。

UI 工具使以后更容易调整布局。

UI 工具使非程序员更容易/可能进行 UI 设计。

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

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

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

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


a
andreas buykx

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

至少在那时,使用 Qt Designer 并不是一个现实的选择:有太多的功能无法使用 Qt Designer 完成;

必须保留的约定和结构阻止了 Qt Designer 的使用;

一旦您在没有 Designer 的情况下开始使用,可能很难再使用它;

不过,最重要的方面是程序员非常习惯于使用 vi 或 emacs 进行编程,而不是使用 GUI IDE。

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


S
Sam Dutton

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

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

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

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

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


B
Blaisorblade

我要补充一点,例如,使用图形设计器的原因之一是 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 对话框(程序员文本编辑器的 Preferences 对话框)需要几秒钟(比如 10 秒)。正确的解决方法是仅在程序员想要查看它们时才加载每个选项卡(我后来意识到),通过向每个首选项集添加一个单独的方法来构建它的 GUI。

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


布局管理器与 GUI 设计器并不相互排斥。事实上,任何不使用某种布局管理器概念的 GUI 设计器对于 99% 的现代 GUI 应用程序的工作来说都比无用更糟糕。
N
Nejat

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


s
shoosh

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


是的,这对我来说很奇怪,但是大约几年前,当我使用 Qt 超过 1 年时,我意识到我可以通过手写而不是图形设计来完成更快的 ui 工作。手写编码 ui 中缺少的一件事是,在将其执行到屏幕上之前,很难看到它的外观(有时这是合作工作的重要方面)。
和她一样,我不能容忍设计师,手写对我来说更强大更快,这是因为我最初在非常慢的mac上,几乎不能处理拖放,几年后它成了唯一的方法我可以做设计 :) 大约看不到,一年后我不需要执行它,这一切都映射在我的大脑想象层中。
M
Mark Beckwith

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

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

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


s
s5s

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


B
Ben

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

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


我在 MFC 应用程序中有几个非常相似的窗口对话框。最近我尝试将所有控件放在一个对话框中,并根据应用程序的当前模式隐藏和重新定位某些控件。您是说在 Qt 中您可以轻松地以编程方式构建控件吗?我一直想知道在我的情况下这是否会更容易。很想听听你的想法。
Mitch,是的,在 Qt 中,您可以通过编程方式构建控件,而且非常简单。 Qt 还使用动态布局,这意味着您的对话框仍然看起来不错,并且无论您添加一个复选框还是二十个复选框都可以使用。
M
MOnsDaR

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

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

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


d
dave

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

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


哦,正如@MONsDaR 所说