开始我自己的简单UI工具包

Starting my own simple UI toolkit

本文关键字:UI 工具包 简单 自己的 我自己 开始      更新时间:2023-10-16

我希望这个问题不是太主观。我想在c++中开始我自己的简单的 UI工具包,即一个可以通过渲染其所有控件创建跨许多平台UI的库(或多或少是QT基础的一个简化版本)。我这样做是为了学习,所以请不要发布,你不应该重新发明轮子,因为与主要的UI工具包竞争真的不是我的目标。

问题是:我应该在Windows和Linux上使用哪个API来创建我的工具包?

我研究了一下,我想我应该在Windows上用GDI+画所有的东西,也许在Linux上用cairo(不确定这两个)。

用openGL绘制UI可能是可行的,但是

  1. 将需要更多的工作
  2. 可能不是最好的事情,因为openGL是一系列为3D图形优化的原语,而不是2D的

所以问题是:我应该在Windows和Linux上使用哪个API来启动这个项目?我希望我把范围缩小到足够客观。

使用任何平台特定的API都无法工作,因为您希望在多个平台上绘制,并且它们的API不重叠且工作方式不同。像Qt或WPF这样的工具包不使用本机绘图有一个很好的理由:它不起作用。我的意思是,拜托,连微软自己的WPF都没有。

最有可能你会想做Qt做什么:有自己的栅格绘图后端。您可以使用cairo或其他库来解决这个问题。如果您想要丰富的计算几何功能(曲线相交,内部/外部检查等),您可以利用cgal作为实现细节。它可以让你实现等价的QPainterPath, QPolygon等快速,可能比在Qt更好的结果。

与Qt相比,你还可以做得更好的是小部件组合和多线程。现在,Qt的小部件都是单线程的,但它们不必如此。当在顶级后台存储中绘制小部件时,它们将被组合,并且以Z顺序连续进行。不过,情况并非一定如此——重叠的小部件形成了一个树,该树中的多个节点可以并行地呈现和合成。这是Qt永远无法解决的问题,因为widgets模块或多或少被认为已经完成了。你也不需要包括像QPixmap这样的怪物,在qt 4.2之前的日子里是有意义的,但现在不需要了。

最后,你可能应该坚持使用现代c++ 11和它的容器——这样你可以避免很多乱七八糟的东西。Qt过去没有这样做的自由,未来一段时间也不会。您可能还需要利用boost。

在任何一个平台上,您将用于用户交互的api都是使用您自己的图像位图和事件循环更新窗口内容所需的任何api。因此,Windows上的WINAPI, X11屏幕上的XCB(优先于Xlib), VNC本身,OS x上的Cocoa。Qt在X11系统上重用glib作为其事件循环,但我对它的了解不够,无法提出建议。

如果你想坚持使用OpenGL -试着看看ImGui。

对于简化的Qt,您可以查看wxWidgets。

我认为,首先,你应该向我们展示你想要实现的特性列表。然后你可以得到一些建议。

我不知道Windows,但是简单的X11/Xlib调用应该可以在Linux上完成(我写过类似的东西)。高于它的任何东西本身都是一个平台。然而,X11只有一些绘制原语的线条,填充矩形&多边形。对于文本使用Xft (FreeType),字体看起来好多了。X11的事件结构相当简单但优雅;对于文档,我推荐https://tronche.com/gui/x/xlib/

我会避免Xt,因为它试图在C中创建X11上的"面向对象"层,这在我看来相当复杂。