玩转Qt 2D绘图之画家
在 Qt 2D 世界中,图形基本都由点、线、矩形、多边形、椭圆、圆、折线、曲线、文本、贴图等基本元素辅以着色而构成,而且 QPainter 类已经提供了这些元素的绘制方法,花点时间掌握这些方法,也就掌握了 Qt 2D 图形控件的制作,余下的就是勤学多练、孰能生巧了。
在 Qt 2D 世界中,图形基本都由点、线、矩形、多边形、椭圆、圆、折线、曲线、文本、贴图等基本元素辅以着色而构成,而且 QPainter 类已经提供了这些元素的绘制方法,花点时间掌握这些方法,也就掌握了 Qt 2D 图形控件的制作,余下的就是勤学多练、孰能生巧了。
软件是对现实世界的抽象,在设计软件接口时通常也会参考现实世界来进行设计。
在现实世界中,画家使用画笔、画刷这些工具在宣纸上作画,而在 Qt 中,画家是 QPainter 对象(画家的大脑则是 QPaintEngine),纸张可以是 QPaintDevice 的任何子类对象,如 QWidget、QImage、QPixmap、QGLPixelBuffer 等;在 QPainter 选好纸张后,就可以使用画笔来勾勒物体的轮廓了,Qt 中的画笔是 QPen 对象;画完轮廓后,可能还需要使用画刷来填充轮廓,Qt 中的画刷是 QBrush 对象。
Qt中提供了强大的 2D 绘图系统,可以使用相同的API在屏幕和绘图设备上进行绘制,主要基于 QPainter、QPaintDevice和 QPaintEngine 这三个类实现,其中:
本篇旨在帮助开发人员回顾在 2D 图形编程中可能会涉及到的数学知识。
有如下结构体:
1 | struct Test { |
在只知道成员变量 y 地址的情况下,如何获取到结构体的首地址?
如果界面所指定的字体在用户系统上未安装,则会自动降级到系统默认字体,这样会导致界面显示异常或达不到预期效果。
对于特殊字体我们通常会集成到软件安装包内,但对于汉字这样的语言,它的文字比较多,因此字体文件比较大,如果集成到安装包内会导致安装包体积变大,所以对于类似中文这样字符比较多的语言字体,我们通常会选择系统自带的字体。
而不同操作系统(如Windows和macOS)所自带的字体不一样,甚至同一操作系统不同的版本(如Windows 7和Windows 11)自带的字体也不一样,因此在选择采用什么字体前,需要弄清我们应用程序支持的操作系统所自带的字体都有哪些,才能更好的做选择。
操作系统的新版本通常只会新增字体,不会移除老的字体。
本文主要介绍如何在 Node-API 中实现不同类型的接口,主要有下面几种类型:
ABI 是 Application Binary Interface 的缩写,当我们以二进制形式(非源码形式)发布我们的动态库时,就需要关心ABI兼容(也称二进制兼容)。
对于静态库,更新静态库始终都需要该库的使用方重新编译,因此不存在ABI兼容的说法。
在使用 Electron 开发客户端时,如果现有 Node 模块所提供的功能无法满足需要,我们可以使用 C++ 开发自定义的 Node 模块,也称插件(addon)。
Node.js 插件的扩展名为 .node,是二进制文件,其本质上是通过动态链接库(.dll 或 .so)重命名而来。
spdlog是一个高性能C++日志库,可以支持仅头文件(header-only)模式使用。
官网地址:
spdlog是线程安全的,但不是进程安全的,可以多个线程同时使用一个spdlog对象输出日志,但不能多个进程同时往一个文件写入日志。
在spdlog内部使用fmt进行字符串的格式化,因此spdlog字符串格式的方式与fmt库相同,如:
1 | spdlog::critical("Support for int: {0:d}; hex: {0:x}; oct: {0:o}; bin: {0:b}", 42); |