2010-11-06 49 views
27

每当我用一些图形工具包开始一个项目时,最初的冲突之一就是如何处理视觉设计和小部件布局:图形工具还是手动编码?Qt Designer vs Handcoding

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

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

回答

29

我开始做所有的手工编码,最近已经开始使用Qt Designer来处理大多数表单。下面是每个位置的一些优势:

使用Qt设计

  • 我是管理复杂的布局,最大的节省时间;它节省了繁琐编码的批次。简单地(非常粗略地)安排您的小部件,选择它们,右键单击并将它们放入正确的布局中。特别是随着布局嵌套,这是,所以更容易。
  • 它倾向于保持您的实现文件清洁,而不是用所有的样板布局代码填充它们。我是A型,所以我喜欢那样。
  • 如果您正在翻译您的应用程序,可以向您的翻译人员发送.ui文件,以便他们可以在您的GUI上使用看到,在那里他们翻译的文本将会是。 (假设他们正在使用Qt语言学家。)

手工编码

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

其他

  • 使用自动连接插槽和信号特征(根据命名规则,如“on_my_button_clicked”)。我发现,我几乎总是有在确定的时间建立这个连接,而不是每当Qt为我做。
  • 对于QWizard表单,我发现我需要为每个页面使用不同的UI文件。您可以一次完成所有工作,但以任何类型的自定义方式在页面之间进行通信变得非常尴尬。

总之,我从Qt Designer开始,让它尽可能地带我,然后从那里手工编写代码。这是Qt Designer生成的一件好事 - 它只是成为类的一员的另一个类,您可以根据需要访问它并对其进行处理。

+1

使用手工编码时,如果以正确的方式进行操作,则不存在样板布局代码。这些都隐藏在你的UI构建类中。翻译也很容易,因为您可以使用来自相同UI构建类的文本生成模型。 – 2012-02-15 15:17:45

4

我倾向于使用设计器布局对话框,但我在主代码中执行所有事件处理。我也做直接代码中的所有主窗口,工具栏,菜单。

设计师只是令人沮丧的 - 可惜,因为体面的拖放式分级机基于设计师已经存在了十多年

+0

+1了解。我也在主代码中完成了所有的事件处理工作,但随着时间的推移,这引起了一个巨大的部分,它为“小部件”提供了“连接”语句。最近,我决定尽可能多地(即与非动态控制)与设计师(我承认这是一个痛苦)。至少在这种情况下,GUI和代码有进一步的分离。顺便说一下,对于动态控件,我尝试在设计器中使用虚拟控件,并将其推广到实际的类,所以我可以通过打开ui文件来获得关于GUI的感觉。 – dashesy 2012-02-15 00:55:05

0

我用两者的结合:

  1. 我找到对于x,y坐标,设计师是要走的路。

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

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

是的版本4是坏的,但在工作中使用过版本3的人说这是非常糟糕的。很多的崩溃。

我和我的QTers一起真的希望版本5会有所改进。

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

+1

我从来没有理由使用x,y坐标。 Qt布局功能强大。如果使用x和y坐标,当窗口重新调整大小时会发生什么? HTML在这里是一个很差的类比,因为你不应该使用HTML表格来做布局。将Qt的布局与CSS比较会更有意义。 – 2012-02-09 19:50:58

13

我的答案基于两年来使用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进行PyQt,你需要额外的步骤来运行pyuic4来编译* .ui文件到Python源文件。我发现忘记这一步很容易,并且为了我的更改无法正常工作而搔首弄姿。

  • 如果您手工编写您的用户界面,我建议将您的布局代码放在一个地方,并将您的信号和插槽放在另一个地方。这样做可以更轻松地改变窗口小部件在窗口上的排列方式,而不会影响任何应用程序逻辑。或者你可以改变一些行为,而不必通过所有的布局代码。

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

0

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

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

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