开始我自己的简单UI工具包
Starting my own simple UI toolkit
我希望这个问题不是太主观。我想在c++中开始我自己的简单的 UI工具包,即一个可以通过渲染其所有控件创建跨许多平台UI的库(或多或少是QT基础的一个简化版本)。我这样做是为了学习,所以请不要发布,你不应该重新发明轮子,因为与主要的UI工具包竞争真的不是我的目标。
问题是:我应该在Windows和Linux上使用哪个API来创建我的工具包?
我研究了一下,我想我应该在Windows上用GDI+画所有的东西,也许在Linux上用cairo(不确定这两个)。
用openGL绘制UI可能是可行的,但是
- 将需要更多的工作
- 可能不是最好的事情,因为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上的"面向对象"层,这在我看来相当复杂。
- 在OSX上使用CMake将Adobe的XMP工具包构建为共享库的最简单方法是什么?
- AWS IoT 开发工具包:通过 TCP 端口 443 使用 MQTT
- 使用 AWS C++ 开发工具包分段上传 S3
- 如何使用软化工具包从 OPC UA 服务器异步读取操作回调中的数据值响应中获取 NodeId 详细信息
- 与 AWS 开发工具包的链接问题
- 使用代码在 AWS 开发工具包C++控制台应用程序上设置凭证
- 选择特定版本的 Visual Studio 命令行工具包,并根据特定版本的C++运行时环境编译文件
- 如何使用 AWS C++ 开发工具包在给定的开始和结束日期范围内列出 S3 中的文件
- 错误:必须设置CMake工具才能生成.在工具包选项中配置CMake工具
- 适用于 C++ 的 AWS 开发工具包:对 S3 传输进行完整性检查
- 在 Cloud9 上安装 AWS C++ 开发工具包时出现问题
- 如何为原生UI工具包扩展Ranorex?
- AWS Lambda C++ 开发工具包"Process exited before completing request"
- 无法在Windows 7 64位上安装CUDA工具包9.1.85
- 使用开发工具包将文件上传到 AWS C++
- AWS 开发工具包 C++ 代码不适用于发布版本
- 为什么使用适用于C++的 AWS 开发工具包创建 EC2Client 段错误
- AWS CPP S3 开发工具包是否支持"传输加速"
- 开始我自己的简单UI工具包
- c++自定义UI工具包——跨平台抽象层的选项