44

每次我用一些图形工具包开始一个项目时,第一个冲突都会发生在如何处理视觉设计和小部件布局的决定上:图形工具还是手工编码?

这是一个相当棘手/主观的问题,因为大多数人会根据个人喜好做出决定。它还很大程度上取决于图形工具的质量。在这种情况下,我想只关注最新版本的 QT 库。我不打算讨论哪种方法更好。我坚信最好的答案是:取决于项目。

我想要的是参考一篇好的无偏见文章,基于几个项目后的经验。这篇文章应该只描述两种选择的权衡

4

6 回答 6

42

我开始做所有的手工编码,最近已经切换到使用 Qt Designer 来处理大多数表单。以下是每个职位的一些好处:

使用 Qt 设计器

  • 对我来说最大的节省时间是管理复杂的布局;它节省了很多繁琐的编码。只需(非常粗略地)排列您的小部件,选择它们,右键单击,然后将它们放在正确的布局类型中。尤其是当布局变得嵌套时,这容易得多。
  • 它倾向于使您的实现文件更干净,而不是用所有样板布局代码填充它们。我是A型,所以我喜欢。
  • 如果您正在翻译您的应用程序,可以将 .ui 文件发送给您的翻译人员,以便他们可以在您的 GUI 上看到他们正在翻译的文本的位置。(假设他们使用的是 Qt Linguist。)

手工编码

  • 控制。如果您有一个布局,您需要以非常特定的顺序实例化/初始化控件,或者根据其他标准(数据库查找等)动态创建控件,这是最简单的方法。
  • 如果您有自定义小部件,您可以使用设计器,添加最接近您的类派生的内置 QWidget,然后“升级”它。但是,除非您在单独的项目中将其作为设计器插件,否则您不会看到小部件的预览,这对于大多数用例来说工作量太大。
  • 如果您有自定义小部件在其构造函数中接受可选 QWidget 父级之外的参数,则 Designer 无法处理它。您别无选择,只能手动添加该控件。

各种各样的

  • 使用自动连接 SLOTS 和 SIGNALS 功能(基于命名约定,例如“on_my_button_clicked”。)我发现我几乎总是必须在确定的时间建立这个连接,而不是在 Qt 为我做的时候.
  • 对于QWizard表单,我发现我需要为每个页面使用不同的 UI 文件。您可以一次性完成所有操作,但是以任何一种自定义方式在页面之间进行通信都会变得非常尴尬。

总之,我从 Qt Designer 开始,让它尽可能地带我走,然后从那里手动编码。这是 Qt Designer 生成的一件好事——它只是成为您的类的成员的另一个类,您可以根据需要访问和操作它。

于 2012-02-09T17:03:30.427 回答
21

我的答案基于两年来使用 PyQt4(Python 绑定到 Qt 4)和 OpenGL 开发生物化学应用程序。我没有做过 C++ Qt,因为我们只将 C++ 用于性能关键算法。也就是说,PyQt4 API 与 Qt4 非常相似,所以这里仍然适用。

Qt 设计器

  • 好的
    • 勘探。发现可用的小部件、这些小部件的名称、可以为每个小部件设置的属性等。
    • 强制将 UI 逻辑与应用程序逻辑分离。
  • 坏的
    • 如果您需要在运行时添加或删除小部件,则必须在代码中包含该逻辑。我认为将 UI 逻辑放在两个地方是个坏主意。
    • 对嵌套布局进行更改。当布局中没有小部件时,它会折叠,并且很难将小部件拖放到您想要的位置。

手工编码

  • 好的

    • 如果您非常熟悉 Qt,则速度很快。
    • 如果您需要在运行时添加或删除小部件,这是最佳选择。
    • 如果您有自己的自定义小部件,则比 Qt Designer 更容易。
    • 通过纪律,您仍然可以将 UI 布局与行为分开。只需将用于创建和布局小部件的代码放在一个地方,将用于设置信号和插槽的代码放在另一个地方即可。
  • 坏的

    • 如果您是 Qt 新手,请慢一点。
    • 强制将布局与行为分开。

提示

  • 不要只是跳入创建窗口。首先在纸上或使用 Balsamiq Mockups 之类的工具快速绘制几种可能的设计草图。尽管您可以在 Qt Designer 中执行此操作,但我认为在您确定它是否是最佳设计之前,花费大量时间试图让您的窗口看起来恰到好处是太诱人了。

  • 如果您使用 Qt Designer for PyQt,则需要运行 pyuic4 以将 *.ui 文件编译为 Python 源文件的额外步骤。我发现很容易忘记这一步,并想一想为什么我的更改不起作用。

  • 如果您手动编写 UI,我建议您将布局代码放在一个地方,将信号和插槽放在另一个地方。这样做可以更轻松地更改窗口小部件的排列方式,而不会影响任何应用程序逻辑。或者您可以更改一些行为,而无需遍历所有布局代码。

享受Qt!现在我正在使用 Java Swing 工作,我很想念它。

于 2012-02-09T19:41:44.013 回答
4

我倾向于使用设计器来布局对话框,但我在主代码中完成所有事件处理工作。我还在直接代码中完成所有主窗口、工具栏、菜单。

设计师只是令人沮丧 - 遗憾的是,基于拖放大小的设计师已经存在了十多年

于 2010-11-06T18:18:47.207 回答
1

这取决于您的应用程序所需的不同窗口/面板的数量。如果数量很少,请使用图形工具。获得一些完美设计的窗户要快得多。如果数量很大,则图形工具可以(并且应该)仅用于原型。您需要对布局进行编码,以便能够以可接受的成本进行应用程序范围的更改。

这包括创建应用程序 UI 如何工作的模型以及在运行时动态添加和删除小部件。对于这种模型的一个很好的例子(在不同的环境中),看看用于创建对象浏览器的魅力模型。

我反对它是棘手/主观的建议(至少比其他开发选择更多)。很容易提出标准来决定。个人经验和偏好对此很重要,因为它们决定了何时应将不同窗口的数量视为较小。工具质量也是如此。

于 2012-02-15T09:07:33.653 回答
0

我的个人意见(只是个人意见),所有基于 GUI 的开发都让我分心,当我看到 gui 对象时,我的想象力或我的头脑工作得非常糟糕,我大多数时候更喜欢手工编码,因为我的想象力更好,你知道,就像您正在阅读一本没有图像的书...当我只看到代码时,它看起来我完成得更快...

第二个原因,我非常喜欢 c++,所以我看到了手工编码的好处,就是我保持我的 c++ 练习,无论我是否写一些多余的东西......当你只使用文本时,编码技能会得到提高。 . 确实,我可以使用 nano 或 vim,但这对于调试来说太慢了。

在这里手工编码++投票

于 2020-08-12T01:05:08.450 回答
-1

我使用两者的组合:

  1. 我发现 x,y 坐标,Designer 是要走的路。

  2. 可以在您的代码中设置许多其他 UI 属性等。

我认为尝试完全通过手工编码来完成 UI 将是一个非常耗时的项目。它不像设置 HTML 表格那么简单。

是的,版本 4 很糟糕,但是使用过版本 3 的工作人员说它真的很糟糕。很多崩溃。

我和我的 QTers 伙伴们真心希望第 5 版能有所改进。

我知道这是一个老问题,但我希望这会有所帮助!一个人的经历。

于 2012-02-08T19:55:17.660 回答