21

我目前正在评估QtQuick(Qt 用户界面创建工具包),它将作为 Qt 4.7 的一部分发布。QML是 QtQuick 背后基于 JavaScript 的声明性语言。

这似乎是一个非常强大的概念,但我想知道是否有人广泛使用其他更成熟的声明性 UI 语言,如WPF 或 Silverlight 中的XAML,可以深入了解可以从中获得的实际好处这种编程风格。经常提到各种优点:

  • 发展速度
  • 强制分离表示和逻辑
  • 编码人员和设计师之间更好的集成
  • UI 更改不需要重新编译

另外,有什么缺点吗?一些潜在的关注领域浮现在脑海中:

  • 执行速度
  • 内存使用情况
  • 增加了复杂性

还有其他需要考虑的因素吗?

4

4 回答 4

13

(更新)

对 XAML 的误解是它没有被编译。它确实被编译为 BAML 二进制预标记 XAML。显然有一个 IL 编译版本的 XAML 也称为 CAML。OP 向我指出了这篇解释 XAML/BAML 和 CAML 是什么的好文章。

无论如何,对于为什么要使用它的问题:

XAML 只是 C# 对象的序列化格式,它特别适合描述分层对象结构,如 WPF GUI 中的对象结构。

WPF 可以帮助您编写不那么无聊的 C# 代码,如下所示:

var grid = new Grid();
grid.Content.add(new TextBlock() {Text = "Hello"});
grid.Content.add(new TextBlock() {Text = "World"});

并以更易读的方式表达它,如下所示:

<Grid>
  <TextBlock Text="Hello">
  <TextBlock Text="World">
</Grid>

由于 WPF 对象嵌套(将内容放入其他对象中)可能会变得非常深,因此 WPF 使其比生成的 C# 代码更容易阅读。

至于关注点分离:XAML 在这里也有帮助,因为它只允许您表达对象及其关系/属性,而不是逻辑。这迫使您将逻辑与 UI 布局分开。MVVM 模式非常适合这项任务,并允许简单的可测试性和可互换的视图。

XAML 中增加的复杂性也很容易被忽略,因为 C# 中的相同代码很容易变得比 XAML 标记更复杂。

不过,我无法让您深入了解 QTQuick。对不起

于 2010-04-24T20:58:47.083 回答
9

QtQuick 可以通过 C++ 插件进行扩展,实际上 Qt 的人建议你在 QtQuick/QML 中执行 UI、动画、转换等,而所有业务逻辑都在 C++/Qt 中。因此,通过这种方式,您可以两全其美,您可以像往常一样调试您的 C++ 代码,同时使 UI 变得轻松且极其简单。

关于 QtQuick/XAML 的另一个重要考虑是它们是硬件加速的,因此例如您可以毫不费力地获得相当好的 fps。所以他们对于他们打算完成的事情一点也不慢。

它节省了时间,很多时间。我在 3 天内用代码做了一个 UI,在 2 小时内用 QML 做了同样的事情。

于 2010-06-18T05:16:06.990 回答
7

声明性编码(即 WPF 或 QTQuick)的重点是在开发人员和可能实现应用程序视觉方面的艺术家之间提供分离。关于 WPF,我发现调试变得有点困难。正如我们所说,我正在编译最新的 QT 来查看 QTQuick。(这需要很长时间,我有时间看看 stackoverflow :-))所以,我对此还没有意见。

于 2010-04-25T01:53:19.263 回答
6

QML/XAML 是:

  • 非常适合 MVVM 模式
  • 硬件加速(QML 使用适用于 Windows、MAC、Linux 和手机操作系统的 OpenGL...XAML 使用适用于 Windows 及其手机版本的 DirectX)
  • 更接近艺术家
  • 您可以使用 XAML/QML 创建一个 GREAT 和 NICE UI
  • 更简单的 UI 实现
  • 漂亮的动画是可能的
  • 在 XAML 中,通常只需稍作更改即可创建应用程序的 Silverlight 版本
  • 在 XAML 中有一些很棒的功能,例如模板、触发器(DataTrigger、Trigger、EventTrigger)、绑定(在任何一侧以及同时在两侧)、资源、命令、DependencyProperty 和 Notifiable Properties。

但请注意 XAML:(我是 XAML 程序员,因此我对 QML 没有积分)

  • 无法进行 XAML 调试
  • 对于 XAML 中的任何更改,必须重新编译所有程序
  • 对性能要更加小心。例如,如果您在 XAML 中使用了很多 RoutedCommand,您的应用程序将无法使用!

  • 在 XAML 中,某些功能无法按预期工作。不幸的是,有一些技巧。(应该很清楚......应该按预期工作......不是吗?)

  • 小心一些类似的命名空间,如 BitmapEffect 和 Effect。有不同的功能和成本。(例如 BitmapEffect 对软件渲染有一些效果,Effect 对硬件渲染有一些影响)

  • 在现实世界中,艺术家无法将 WPF 用作 Flash(至少性能良好)。

  • 一些功能适用于特殊的地方。例如,DataTrigger 仅在 Style 标记中工作,而不在 Resource 部分中。

  • XAML 有一些弱点。一些例子:没有任何顺序动画......你不能在 XAML 中进行任何计算(你必须在 C# 中编写一个转换器,即使是为了一点点工作!JavaSript 是 QML 中的一个很好的替代品)......一些属性是重复的。例如 x:Name 和 Name... 从 ViewModel 控制视图尚不清楚。例如从 ViewModel 关闭视图(你需要一些 CodeBehind)

  • 太多的运行时错误。如果你在不好的地方使用了一些标签,它会注意到你的语法错误,但许多错误只是在运行时发生。例如,如果我将 ColorAnimation 的背景属性(而不是 Background.Color)作为目标,它将成功编译,但在运行动画时... BUMP... 运行时错误!!!在 Expression Blend 上的这种情况下,应用程序将崩溃!!!

于 2011-12-01T06:39:56.173 回答