适用于Windows的良好C ++ GUI库

时间:2020-03-06 14:32:29  来源:igfitidea点击:

我正在寻找一个适用于C ++的Windows GUI库。我认为理想的特征应该是:

  • 现代的。 MFC,wxWidgets和Qt是很久以前启动的,它们不使用现代的C ++功能和标准库。
  • 具有功能丰富的控件集。几乎到处都可以删除HTML的能力是我不喜欢wxWidgets的一种幸福。
  • 开源。这是必须的。如果购买后有货源,则认为还可以。
  • 以某种方式有一个表单设计师。是的,那太好了。与Delphi合作多年后,每次必须手动指定控件大小时,我都会哭泣。
  • 免费用于商业用途。但是,如果某个图书馆真的很不错,那么我会考虑购买。
  • 跨平台。该规范只是一个决胜局。我可以没有这个。

请为候选人提出想法。请每个答案一个图书馆。

解决方案

WTL是由ATL团队的Nenad Stefanovic创建的现代GUI框架。它重量轻,但仍支持操作系统的所有现代功能。

Windows模板库

Windows Template Library (WTL) is a
  C++ library for developing Windows
  applications and UI components. It
  extends ATL (Active Template Library)
  and provides a set of classes for
  controls, dialogs, frame windows, GDI
  objects, and more.

非官方文档位于"代码项目"中。

我再来看一下Qt-它不是免费用于商业用途,但是如果我们刚入门,它们会提供很好的入门级许可证。我认为它们的界面相当现代,尽管我不喜欢它们似乎依赖于预处理的语言扩展。

我们在寻找"现代"类别中的具体内容是什么?

wxWidgets免费,可用于具有许多可用设计器的商业应用程序(http://wxdsgn.sourceforge.net/、http://www.dialogblocks.com/、http://wxformbuilder.org/、http://wxglade.sourceforge 。网/ ... )。

我个人从零开始编写了许多小部件,但这并非总是可行的。

那么Smartwin ++呢?

他们的Wiki现在似乎已关闭。样本Hello World! Smartwin ++文档中的代码

我认为我们写Qt的速度太快了。它并没有太多使用标准库,但是与过时相比,与具有不同的优先级关系不大。 QT容器使用迭代器,模板算法等,但是具有不同的迭代器模型。 Qt迭代器指向元素之间而不是它们之间。这使正向和反向遍历对称,并清除了一些边沿情况,以便在遍历时插入和删除元素,尽管效率略低。而且它们也提供STL样式的迭代器。这对于GUI库IMO是一个有效的选择。容器的性能不太可能成为关键因素。

至于预处理器(moc),可以将其更多地看作是IDL编译器,它知道如何读取C ++头文件,而无需使用自己的语言。它不会对代码进行预处理,而是直接对其进行编译。它只是生成一个包含信号/插槽回调封送处理的添加cpp文件,当它们越过线程边界并需要同步时,该文件可能会变得很混乱。

如果我们可以发布资源(甚至用于商业用途;实际上需要专有的内部工具数量),则Qt是免费的;如果我们不能发布,则价格不会不合理(没有按单元使用费或者任何特别令人讨厌的东西)

我们是否看过Fox工具包?

我们应该看看gtkmm。它使用现代c ++编写,使用stl,遵循其约定,包括对utf-8的支持。而且,它是开源的,跨平台的,并在lgpl下获得了许可。从他们的网站:

Features:
  
  
  Use inheritance to derive custom widgets.
  Type-safe signal handlers, in standard C++.
  Polymorphism.
  Use of Standard C++ Library, including strings, containers, and iterators.
  Full internationalisation with UTF8.
  Complete C++ memory management
  
  
  Object composition
  Automatic deallocation of dynamically allocated widgets.
  
  Full use of C++ namespaces.
  No macros.
  Cross-platform: Linux (gcc), FreeBSD (gcc), NetBSD (gcc), Solaris (gcc, Forte), Win32 (gcc, MSVC++.Net 2003), MacOS X (gcc), others
  Free software and free of cost for both Open Source and proprietary development.
  Discussed, designed and implemented in public.

wx和QT都可以使用标准库。
从几年前(当编译器对STL的支持不完善的时候)开始,它们就包含了自己的集合类(与MFC一样)。 STL中还没有一些添加功能,例如写时复制字符串。

他们都可以将模板用于由macros(wx)或者precompiler(QT)完成的某些调度机制,但是除了可读性较低的代码外不会有任何收获。

看一下eGUI ++,它有一个不错的现代对象模型。我们可以看到MDN文章将Windows窗体的简化带入本机应用程序,并且可以从John Torjo的网站上下载代码

我极力推荐JUCE,它是一款非常干净的现代c ++,其中有很好的记录,并带有doxy注释。它具有各种各样的gui类,并且扩展现有类非常简单。该库不仅涵盖gui,还包含许多用于声音处理和生成,线程,读/写现代图像格式,基本联网等的代码。它看起来也不错(默认情况下具有OS X的感觉)并且是跨平台的。

不利的一面:尽管对于非商业用途它是免费的(从两种意义上来说都是免费的),但是商业用途需要商业许可证,这是非常昂贵的。

总而言之,绝对值得一看,我已经将它用于几个业余项目,其中一个我打算在某个时候发布。它实际上使使用C ++进行GUI编码变得有趣,这是在说些什么!

如果我们正在寻找现代的C ++ GUI库,那么来自Adobe Source Library(ASL)的Adam&Eve是正确的选择(它很大程度上依赖于Boost库)。

我真正喜欢的是,布局的设计与代码完全脱钩了。布局定义可以在外部文件中,以便用户可以更改布局而无需重新编译程序。

该站点的一个示例:

layout clipping_path
{
    view dialog(name: "Clipping Path")
    {
        column(child_horizontal: align_fill)
        {
            popup(name: "Path:", bind: @path, items:
            [
                { name: "None", value: empty },
                { name: "Path 1", value: 1 },
                { name: "Path 2", value: 2 }
            ]);
            edit_number(name: "Flatness:", digits: 9, bind: @flatness);
        }
        button(name: "OK", default: true, bind: @result);
    }
}

会产生:

除此之外,ASL还具有其他一些有用的实用程序类。

编辑:但是(还)还没有表单设计师。

我必须对Qt表示敬意。我们是Qt的商业许可证持有者,尽管价格昂贵,但它却物有所值。 Qt代码库非常扎实。 GUI设计器是那种更好的工具之一。不久前,我们评估了一组可用于Windows的GUI工具包,彼此相对,并且Qt在各个方面都遥遥领先,因此我看到了其中一些其他工具包。

如果我们想要子弹,这是我的...

  • 面向对象的Qt具有非常好的OO架构,在整个类层次结构中非常一致
  • 信号和插槽为我们提供了一种很好的方式来处理在开发UI时始终存在的回调问题
  • 虽然有点过于复杂,但它会引导我们转向显示数据的MVC架构,这不是一件坏事。
  • 除了大量的UI类之外,还有几乎更多的其他类集支持数据库操作,线程,网络和其他任务。

是Qt内部使用非STL容器和非STL字符串。但是,不要让那成为取消Q​​T资格的标准。 QT容器都具有像迭代器一样的STL,并且String类具有很多功能。最后但并非最不重要的一点是,它具有良好的多平台支持。

自从我们命名Delphi:我们知道Borland C ++ Builder也像Delphi一样进行VCL吗?我们可以免费分发它,并获得源代码。

那winx呢?

一次,我对Ultimate ++产生了兴趣。尼斯许可证(BSD)是一种IDE,它支持各种编译器,并在许多现实世界中的复杂应用程序中使用(非常重要!)等。
我从来没有时间在那儿投资,但我仍然将其视为一种有趣的选择。

我投票支持WTL。轻巧而原生。从我的角度来看,我们不能超过这两个标准。我用stl c ++编写模型层,并在每个操作系统上使用本机库。这样可以确保应用看起来不像驴子,并允许我们在每个操作系统上使用最广泛的功能。

对于WTL GUI设计师,我建议使用优秀的WTLBuilder,但出于大多数WTLBuilder完全不知道的原因:www.wtlbuilder.com。

迟到总比没有好,但是我们可能会发现这很有趣。它满足的唯一要求是"开源"和"免费"。它确实做了我们没有要求的事情

  • 将源代码减少一个数量级
  • 使我们可以完全控制布局,数据绑定,控件的可变数组等。

看到其工作原理后,我们可以轻松添加自己的控件。

顺便说一句,它还有一个弊端就是令人上瘾。