【问题标题】:Qt Designer vs HandcodingQt 设计器与手工编码
【发布时间】:2011-05-06 02:09:52
【问题描述】:

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

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

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

【问题讨论】:

    标签: qt user-interface coding-style widget qt-designer


    【解决方案1】:

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

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

    在这里手工编码++投票

    【讨论】:

      【解决方案2】:

      我的答案基于两年来使用 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 工作,我很怀念它。

      【讨论】:

      • 你的意思是把信号和插槽从布局代码中分离出来,就像把它们放在一个单独的文件中一样?
      • @Alex 如果您的 UI 非常复杂,它可能是一个单独的源文件。我通常在一个顶级方法(可能调用辅助方法)中定义布局,在另一个中定义信号和槽。不过,距离我上次使用 Qt 已经有好几年了。
      【解决方案3】:

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

      这包括创建应用程序 UI 工作方式的模型,以及在运行时动态添加和删除小部件。有关此类模型的出色示例(在不同的环境中),请查看用于创建对象浏览器的 glamour model

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

      【讨论】:

        【解决方案4】:

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

        使用 Qt 设计器

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

        手工编码

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

        杂项

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

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

        【讨论】:

        • 使用手工编码,如果你做对了,就没有样板布局代码。这一切都隐藏在您的 UI 构建类中。翻译也很容易,因为您可以使用来自相同 UI 构建类的文本生成模型。
        【解决方案5】:

        我将两者结合使用:

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

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

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

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

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

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

        【讨论】:

        • 我从来没有理由使用 x,y 坐标。 Qt 布局很强大。如果使用 x 和 y 坐标,当窗口重新调整大小时会发生什么? HTML 在这里是一个糟糕的类比,因为您不应该使用 HTML 表格来进行布局。将 Qt 的布局与 CSS 进行比较会更有意义。
        【解决方案6】:

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

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

        【讨论】:

        • +1 以获得洞察力。我还在主代码中完成了所有事件处理的工作,但随着时间的推移,它导致了一个巨大的部分,其中包含用于琐碎小部件的“连接”语句。最近我决定尽可能多地与设计师一起做(即使用非动态控件)(我承认这很痛苦)。至少这种方式进一步分离了 GUI 和代码。顺便说一句,对于动态控件,我尝试在设计器中使用虚拟控件并将其提升到实际类中,这样我只需打开 ui 文件就可以了解 GUI。
        猜你喜欢
        • 2010-09-28
        • 1970-01-01
        • 1970-01-01
        • 2016-07-27
        • 2017-04-27
        • 1970-01-01
        • 2012-05-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多