GT: 一个 C++ 图形用户界面库和系统
GT 是一个紧凑、高效且可定制的图形用户界面 (GUI) 库,适用于 Windows 环境。
GT
一个 C++ 图形用户界面库和系统
作者:Anthony Daniels
电子邮件:AnthonyDaniels99@gmail.com
引言
GT 是一个紧凑、高效且可定制的图形用户界面 (GUI) 库,适用于 Windows 环境(最终将支持 Linux 和 Mac)。大部分代码是平台无关的,仅直接依赖于操作系统的图形、线程和剪贴板 API(这些功能已被封装)。随着 GUI 系统的不断涌现,人们可能会问为何还要创建一个新的系统。GT 的创建是为了解决一些主要竞争对手的不足之处,同时保持其高度紧凑的特性(GT 目前约有 90,000 行代码,包括注释)。由于代码行数很少,GT 可以直接嵌入到您的应用程序解决方案或项目文件中。它的主要竞争对手包括 MFC、QT、GIMP Toolkit、wxWidgets、Fox Toolkit。GT 在设计和功能上最接近 QT,但存在一些差异。
与竞争对手的比较
首先,整个 GT 框架构建在 HPC 模板库 (HTL) 之上。HTL 是标准模板库 (STL) 的一个补充,提供了面向多线程和多进程编程的线程安全对象。GT 几乎使用了整个 HTL,其中三个 HTL 包被最频繁地使用。它们是容器、信号与槽以及线程包。GT 在对象库的所有关键函数中只使用线程安全容器。GT 也像 QT 一样是一个基于信号与槽的系统。与 MFC 和 Fox Toolkit 中基于宏的事件 coupling 到代码(无法进行调试跟踪)不同,信号与槽提供了连接事件到代码的更清晰的途径。GT 在信号与槽方面比 QT 有一些改进。首先,您可以拥有公共、保护和私有信号,而 QT 只允许保护信号。其次,连接不是像 QT 那样通过宏进行的。第三,无需 Q_OBJECT
元对象和代码,提供了更简洁的包(无需元对象编译器步骤)。第四,GtObject
中的任何函数都可以附加到具有相同原型的信号(QT 的最新版本也支持这一点,但作者仍想提及);无需声明“slots:”。每个成员函数都是一个潜在的槽。
另一个主要区别是 GT 不绘制原生控件。如果您深入了解其他软件包(例如 QT)的代码,您会发现它们在大多数情况下都在绘制 API 原生控件。这种多层间接调用到一个绘制所有不同控件的单一整体绘制器,与 GT 所采取的方法不同。每个 GtWidget
都有一个 OnPaint()
方法,并且小部件负责绘制自身。图形比大多数当前一代操作系统控件更简单,但这一选择符合 GT 的紧凑性特性。鼓励用户修改绘制算法以获得更复杂的外观。
GT 像 QT 一样,提供了一个抽象项模型系统,用于在 GUI 中显示对象及其数据的集合。QT 的设计理念是列表、表格和树都使用相同的抽象项模型。然而,GT 为列表、表格和树采用了单独的抽象项模型。之所以选择拥有 listmodel
、tablemodel
和 treemodel
,是因为作者认为代码更简单,更容易使用和构建。这种抽象项模型设计的根本性转变是 GT 被创建的原因。作者是 QT 的长期用户和爱好者。
GT 库结构
GT 目前有四个库:GtCore
、GtGui
、GtOpenGL
和 GtChart
。GtCore
包含 GT 系统所有核心类。它包含以下包:GtBase
、GtEvent
、GtGeometry
、GtGraphic
、GtInputOutput
、GtItemModel
、GtMath
、GtProcess
、GtSorting
、GtStateMachine
。这些包及其构成类的描述将在类概述文档中提供。GtGui
包含所有用于基本 GUI 开发的类。它包含以下包:GtBasicControls
、GtGridView
、GtModelView
、GtScientific
、GtTextView
、GtWinForms
。GtOpenGL
包含通过 OpenGL 库进行 3D 对象可视化所需的类。GtChart
包含科学绘图和图表所需的类。
示例 GUI
示例包包含 15 个不同的 GUI 项目,展示了 GT 中各种控件的用法。要构建示例包,请将 GT2013 和 GT_TEST_2013 文件夹放在文件层次结构中的同一级别。将库从 GT2013 的 Debug 或 Release 文件夹复制到示例包的目标文件夹。现在您应该能够构建并运行示例包。应用程序示例如下:
名称 | 描述 |
GtTest_02_Simple | 此应用程序展示了 GT 的大多数基本控件。 |
GtTest_03_ToolBox | 此应用程序展示了工具箱控件的用法。 |
GtTest_04_TabView | 此应用程序展示了标签页视图控件的用法。 |
GtTest_05_ScrollArea | 此应用程序展示了可滚动区域控件的用法。 |
GtTest_06_Modal | 此应用程序展示了模态和非模态对话框的用法。 |
GtTest_07_ListView | 此应用程序展示了抽象项列表视图的用法。 |
GtTest_08_TableView | 此应用程序展示了抽象项表视图的用法。 |
GtTest_09_TreeView | 此应用程序展示了抽象项树视图的用法。 |
GtTest_10_OpenGL | 此应用程序展示了 3D 查看器的用法。 |
GtTest_11_SimpleChart | 此应用程序展示了基本 plot2D 的用法。 |
GtTest_12_LogChart | 此应用程序展示了对数刻度的用法。 |
GtTest_13_BarColumn | 此应用程序展示了条形图和柱状图的用法。 |
GtTest_14_PieChart | 此应用程序展示了饼图的用法。 |
GtTest_15_MultiPlot | 此应用程序展示了通用多图的用法。 |
示例 GUI 屏幕截图
这里是一些示例 GUI 的屏幕截图。

已知问题
任何 bug 请报告给作者,如果您有兴趣参与 GT 开发,请告知我。我打算为该项目设置一个 GitHub 仓库。