我正在花这些假期学习编写Qt应用程序.几个小时前我正在阅读有关Qt Designer的内容,这让我想知道:人们在Qt中编写真实世界的应用程序用于设计他们的GUI是什么?事实上,人们如何设计GUI一般?
我,其中一个,发现手工编写代码在概念上比使用Qt Designer更简单,尽管对于复杂的GUI,Designer可能有意义.使用Designer可以实现大型GUI,但随着时间的推移,随着复杂性的增加,它们可能变得非常难以管理(这只是我的意见).我还下载了AmaroK源代码,看看那些人在做什么,并发现很多调用addWidget()和朋友,但没有一个由Designer创建的XML文件(除了:AmaroK必须是我最喜欢的应用程序)任何平台).
那么,创建GUI的"正确"方式是什么?设计师还是代码?在本次讨论中,让我们考虑以下类型的GUI:
简单的对话框,只需要输入,显示一些结果并退出.我们假设一个应用程序采用YouTube URL并将视频下载到用户的硬盘上.新手很可能会开始使用那种应用程序.
中级GUI,比如说带有一些工具栏/菜单项的便利贴编辑器.我们以xPad为例(http://getxpad.com/).我会说大多数应用程序属于"实用程序"类别.
非常复杂的GUI,如AmaroK或OpenOffice.当你看到它们时,你知道它们,因为它们让你的眼睛流血.
Michael Bish.. 42
我们在Designer中的经验始于Qt3.
QT3
那时,Designer主要用于生成代码,然后将代码编译到应用程序中.我们开始使用这个目的但是使用所有生成的代码,一旦您编辑它,您就不能再返回并重新生成它而不会丢失您的编辑.我们最终只是采用生成的代码并从此手动完成所有操作.
Qt4的
Qt4在Designer上得到了显着改进.它不再只生成代码,但您可以动态加载Designer文件(在xml中)并动态地将它们连接到程序中的运行对象 - 但是,没有生成的代码,您必须在Designer中命名项目并粘贴用名称不破坏你的代码.
我的评估是,它远不如Mac OS X上的Interface Builder那么有用,但在这一点上,我可以看到直接在程序中使用Designer文件.
自Qt3以来,我们还没有回到Designer,但仍然使用它进行原型设计和调试布局.
对于你的问题:
您可能可以使用Qt提供的标准对话框. QInputDialog或者如果你是QDialog的子类,请确保使用QButtonDialogBox 来确保您的按钮具有正确的平台布局.
你可以做一些更有限的事情,比如具有有限Designer功能的xPad.
我不认为你可以单独使用Designer编写类似OpenOffice的东西,但也许这不是重点.
我使用Designer作为另一个工具,就像你的文本编辑器一样.找到限制后,请针对该新问题尝试不同的工具.我完全同意Steve S认为Designer的一个优点是,不是程序员的其他人可以进行布局.
我们在Designer中的经验始于Qt3.
QT3
那时,Designer主要用于生成代码,然后将代码编译到应用程序中.我们开始使用这个目的但是使用所有生成的代码,一旦您编辑它,您就不能再返回并重新生成它而不会丢失您的编辑.我们最终只是采用生成的代码并从此手动完成所有操作.
Qt4的
Qt4在Designer上得到了显着改进.它不再只生成代码,但您可以动态加载Designer文件(在xml中)并动态地将它们连接到程序中的运行对象 - 但是,没有生成的代码,您必须在Designer中命名项目并粘贴用名称不破坏你的代码.
我的评估是,它远不如Mac OS X上的Interface Builder那么有用,但在这一点上,我可以看到直接在程序中使用Designer文件.
自Qt3以来,我们还没有回到Designer,但仍然使用它进行原型设计和调试布局.
对于你的问题:
您可能可以使用Qt提供的标准对话框. QInputDialog或者如果你是QDialog的子类,请确保使用QButtonDialogBox 来确保您的按钮具有正确的平台布局.
你可以做一些更有限的事情,比如具有有限Designer功能的xPad.
我不认为你可以单独使用Designer编写类似OpenOffice的东西,但也许这不是重点.
我使用Designer作为另一个工具,就像你的文本编辑器一样.找到限制后,请针对该新问题尝试不同的工具.我完全同意Steve S认为Designer的一个优点是,不是程序员的其他人可以进行布局.
根据我使用Qt Designer和其他工具包/ UI工具的经验:
UI工具加快了工作速度.
UI工具可以让以后更轻松地调整布局.
UI工具使非程序员更容易/可能在UI设计上工作.
通过将设计分解为多个UI文件,通常可以在UI工具中处理复杂性.在每个文件中包含小的逻辑组件组,并将每个组视为用于构建完整UI的单个窗口小部件.Qt Designer的推广小部件概念可以帮助解决这个问题.
我没有发现项目的规模有任何不同.您的经历可能有所不同
使用UI工具创建的文件(我想你可以手动编写它们,如果你真的想要)通常可以在运行时动态加载(Qt和GTK +都提供此功能).这意味着您可以进行布局更改并测试它们而无需重新编译.
最终,我认为原始代码和UI工具都可以有效.它可能在很大程度上取决于环境,工具包/ UI工具,当然还有个人偏好.我喜欢UI工具,因为它们可以让我快速运行并且以后可以轻松更改.
我工作的组织几年前已将其GUI应用程序移植到Qt.我认为有几个方面值得一提:
至少在那时使用Qt Designer并不是一个现实的选择:有太多的功能无法用Qt Designer完成;
必须保留的约定和结构阻止了Qt Designer的使用;
一旦你没有设计师开始,可能很难回到它;
然而,最重要的方面是程序员非常习惯使用vi或emacs进行编程,而不是使用GUI IDE.
我自己的经验,可以追溯到约 4年,使用Qt3.3,在Designer中无法实现对话框中的动态行为.
只是说我在没有使用Qt Designer的情况下在Qt中编写和维护了复杂的GUI - 不是因为我不喜欢Qt Designer,而是因为我从来没有这样做过.
这部分是风格的问题,你来自哪里:当我开始使用Qt时,我会遇到Dreamweaver和Frontpage以及其他可视化HTML工具的糟糕体验,并且更喜欢使用HomeSite编写代码并使用Photoshop进行棘手的布局问题.
您尝试在可视化工具中保留可视代码IDE存在危险,但最终还是必须调整代码 - 以不太了解的方式.
例如,学习iPhone开发,我发现打击"魔术"视觉材料(从"连接"检查器中的空白圆圈拖到"界面构建器"窗口中的对象......')会更加简单(对于我用普通的旧代码来理解.
祝Qt好运 - 它是一个很棒的工具包,但你使用它,Qt Creator看起来像是一个很棒的IDE.
我想补充一点,使用图形设计器的原因之一是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对话框(程序员文本编辑器的"首选项"对话框)需要几秒钟(比如说10).正确的解决方法是只在程序员想要看到它们时才加载每个选项卡(我意识到之后),通过为每个首选项集添加一个单独的方法来构建其GUI.
如果您将所有标签和标签切换器与设计师一起设计,您可以轻松地完成吗?我想可能有一个类似的例子,手动编码的GUI为您提供了更大的灵活性,在这么大的应用程序中,您可能需要它,即使只是为了优化目的.
使用设计器创建GUI的一个主要好处是,其他程序员可以轻松地更改或维护表单和小部件,而无需深入研究复杂的代码.
奇怪的是,你说编写代码比在图形环境中操作对象更简单.这是一个明智的选择.
设计师可以让您的生活更轻松,从长远来看,它可以使您的代码更易于维护.在设计人员中更容易看到你的UI看起来像什么,然后阅读代码并试图想象它可能是什么样子.
使用当前的Qt,您几乎可以完成设计器中的所有操作以及您无法完成的极少数操作,您可以使用构造函数中的极少数代码进行修复.以最简单的例子为例 - 添加信号槽连接.使用设计器就像双击一样简单.如果没有设计人员,您需要查找信号的正确签名,编辑.h文件,然后编辑在.cpp文件中编写代码.设计师允许您超越这些细节,并专注于真正重要的事项 - 应用程序的功能.