启动我自己的简单UI工具包

时间:2015-08-27 18:55:49

标签: c++ linux windows qt user-interface

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

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

我研究了一下,我想我应该在Windows上使用GDI +绘制所有内容,也可以在Linux上绘制cairo(不确定这两个)。

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

  1. 需要更多工作
  2. 可能不是最好的事情,因为openGL是一系列针对3D图形而不是2D图形优化的图元
  3. 所以问题是:我应该在Windows和Linux上使用哪个API来启动这个项目? 我希望我把它缩小到足以让它客观地回答。

3 个答案:

答案 0 :(得分:2)

使用任何特定于平台的API绘图都不起作用,因为您希望在多个平台上绘图,并且它们的API不重叠且不起作用。像Qt或WPF这样的工具包不使用原生绘图有一个很好的理由:它不起作用。我的意思是,来吧,即使是微软自己的WPF也没有。

你最有可能想要完成Qt所做的事情:拥有自己的光栅绘制后端。您可以使用cairo或其他一些库来了解其中的细节。如果您想要丰富的计算几何功能(曲线交叉,内部/外部检查等),您可以利用cgal作为其实现细节。它允许您快速实现QPainterPathQPolygon等的等效项,并且可能比Qt中的结果更好。

与Qt相比,你可以做得更好的是小部件组合和多线程。现在,Qt的小部件只是单线程,但它们不一定是。当在顶级后备存储上绘制窗口小部件时,它们将被合成,并且这将按顺序串行发生。但事实并非如此 - 重叠的小部件形成一棵树,并且该树中的多个节点可以并行渲染和合成。这是Qt永远无法修复的一件事,因为小部件模块被认为已经完成,或多或少。你也不需要包括像QPixmap这样的怪物,这些怪物在Qt前4.2天有意义,但现在不再存在了。

最后,您可能应该坚持使用现代C ++ 11及其容器 - 这样就可以避免很多错误。 Qt没有这样做的自由,也不会有一段时间。你可能也想要利用提升。

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

答案 1 :(得分:1)

我不知道Windows,但简单的X11 / Xlib调用应该为Linux做(我写了类似的东西)。它上面的任何东西都已经是一个独立的平台。但是,X11只有一些用于线条的填充图元,填充矩形和矩形。多边形。对于文本使用Xft(FreeType),字体看起来好多了。 X11的事件结构相当简单但优雅;对于文档,我建议https://tronche.com/gui/x/xlib/

我会避免使用Xt,因为它试图在C中用X11创建一个“面向对象”的层,这对IMO来说非常复杂。

答案 2 :(得分:1)

如果您想坚持使用OpenGL - 请尝试查看ImGui

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

我认为,首先,您应该向我们展示您要实施的功能列表。你可以得到一些建议。