Qt Designer与手写代码

47

每次我开始使用一些图形工具包启动一个项目时,第一个冲突就是如何处理视觉设计和小部件布局的决定:使用图形工具还是手写代码?

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

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

6个回答

45
我最开始是使用手工编码的方式,但最近我已经开始转向使用Qt Designer来创建大多数表单。以下是每种方法的优劣: 使用Qt Designer
  • 最大的时间节省者是管理复杂布局;它可以避免许多繁琐的编码。只需(非常粗略地)排列您的小部件,选择它们,右键单击,然后将它们放入正确类型的布局中。特别是当布局嵌套时,这样做会更加容易。
  • 它倾向于使您的实现文件更加清洁,而不是填充它们所有的样板式布局代码。我是一个完美主义者,所以我喜欢这点。
  • 如果您正在翻译应用程序,则可以发送您的翻译人员.ui文件,以便他们可以在GUI上看到他们正在翻译的文本。 (假设他们正在使用Qt Linguist。)
手工编码
  • 控制。如果您有一个需要按特定顺序实例化/初始化控件或根据其他标准(数据库查找等)动态创建控件的布局,则这是最简单的方法。
  • 如果您有自定义小部件,则可以使用Designer,从中添加最接近的内置QWidget,然后“升级”它。但是,除非将其作为设计器插件添加到单独的项目中,否则您将无法预览小部件。这对于大多数用例来说太麻烦了。
  • 如果您有自定义小部件,在其构造函数中需要传递参数,而不仅仅是可选的QWidget父项,则Designer无法处理它。您别无选择,只能手动添加该控件。
其他
  • 我不使用基于命名约定(例如“on_my_button_clicked”)的自动连接SLOTS和SIGNALS功能。我发现我几乎总是需要在确定的时间设置此连接,而不是由Qt随时进行。
  • 对于QWizard表单,我发现我需要为每个页面使用不同的UI文件。您可以在一个文件中完成所有操作,但在任何自定义方式之间进行通信会变得非常笨拙。
总之,我从Qt Designer开始,并让它带我走尽可能远的路程,然后再手工编码。这是Qt Designer生成的另一个类的好处--它只是成为您的类的成员的另一个类,您可以访问它并根据需要对其进行操作。

1
使用手写代码,如果你做得正确,就不需要样板式布局代码。所有这些都隐藏在你的UI构建类中。翻译也很容易,因为你可以使用相同的UI构建类生成带有文本的模型。 - Stephan Eggermont

23

我的回答是基于使用PyQt4(Python绑定到Qt 4)和OpenGL开发生物化学应用程序两年的经验。我们只使用C ++进行性能关键算法,因此我没有使用C ++ Qt。尽管如此,PyQt4 API非常类似于Qt4,因此仍然适用于很多内容。

Qt Designer

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

手工编码

  • 好处:

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

    • 如果您是新手,则速度较慢。
    • 不支持强制分离布局与行为。

提示

  • 不要立即开始创建窗口。首先快速草绘几个可能的设计,可以使用纸张或诸如Balsamiq Mockups之类的工具。虽然您可以在Qt Designer中完成此操作,但我认为在您甚至没有确定最佳设计之前,花费大量时间使您的窗口看起来完美太诱人了。

  • 如果你在PyQt中使用Qt Designer,你需要额外运行pyuic4将*.ui文件编译成Python源代码文件。我发现很容易忘记这一步并且为什么我的更改不起作用而感到困惑。

  • 如果你手动编写UI,建议把布局代码和信号槽代码分别放在两个位置。这样做可以更容易地在不影响应用程序逻辑的情况下更改窗口上小部件的排列方式。或者你可以更改某些行为而不必浏览所有的布局代码。

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


    你的意思是将信号和槽从布局代码中分离出来,放在单独的文件中吗? - Alex
    1
    @Alex 如果您的UI非常复杂,它可以是一个单独的源文件。我通常在一个顶级方法中定义布局(可能调用辅助方法),并在另一个方法中定义信号和槽。不过,我已经好几年没有使用Qt了。 - procrastinate_later

    5

    我倾向使用设计师来布置对话框,但是所有事件处理都在主要的代码中完成。我也会用直接的代码创建所有的主窗口、工具栏和菜单。

    设计师只是令人沮丧 - 可惜的是,像拖放调整大小的设计师已有十多年的历史。


    +1 对这个见解表示赞同。我也在主代码中处理了所有的事件处理,但随着时间的推移,它导致了一个巨大的部分,其中包含了针对琐碎小部件的“connect”语句。最近,我决定尽可能多地(即使用非动态控件)使用设计师(我承认这很痛苦)。至少这样可以进一步分离GUI和代码。顺便说一下,对于动态控件,我尝试在设计师中使用虚拟控件,并将其提升为实际类,这样我就可以通过打开ui文件来感受GUI的感觉。 - dashesy

    1

    这取决于您的应用程序需要多少个不同的窗口/面板。如果数量较少,请使用图形工具。这样可以更快地设计出几个完美的窗口。如果数量很大,则图形工具只能(并且应该)用于原型。您需要编写布局代码,以便能够以可接受的成本进行应用程序范围的更改。

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

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


    0

    这是我的个人观点(仅代表个人),所有基于GUI的开发会让我太分心了,当我看到GUI对象时,我的想象力或者思维能力都会变得很差,因此我更喜欢手写代码,因为这样我的想象力更强。你知道的,就像读一本没有图像的书一样……当我只看到代码时,感觉速度更快。

    第二个原因是,我非常喜欢C ++,所以我认为手写代码的好处在于即使我写了一些重复的东西,我也可以保持我的C++实践...... 只有使用文本才能提高编码技巧...... 当然,我可以使用nano或vim,但那太慢了,不适合调试。

    在这里,手写代码++赞成。


    -1

    我使用两者的结合:

    1. 对于x,y坐标,我觉得Designer是最好的选择。

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

    我认为完全手动编码UI会是一个非常耗时的项目。这不像设置HTML表格那么简单。

    是的,第四版很糟糕,但是在工作中使用第三版的人说它真的很糟糕。经常崩溃。

    我和我的QT同事们都真心希望第五版能有所改进。

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


    3
    我从来没有使用过x,y坐标的理由。Qt布局非常强大。如果您使用x和y坐标,当窗口被重新调整大小时会发生什么?在这里,HTML是一个不恰当的比喻,因为您不应该使用HTML表格来进行布局。将Qt的布局与CSS进行比较更有意义。 - procrastinate_later

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接