玩转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 这三个类实现,其中: QPainter执行具体的绘图操作,QPainter 类提供了大量的GUI编程所需的函数,如drawLine、drawImage等。 QPaintDevice 是一个基类,提供绘图设备的抽象接口,它是一个二维空间的抽象,可以使用QPainter在其上进行绘制,常见的继承该类的绘图设备有QImage、QPixmap、QWidget、QOpenGLPaintDevice等。 QPaintEngine 提供了一些抽象接口,用于实现QPainter在不同的设备上进行绘制。QPaintEngine 由 QPaintDevice 创建并管理。
本篇旨在帮助开发人员回顾在2D图形编程中可能会涉及到的数学知识。
有如下结构体: 12345678struct Test { int a; // .... // 还有若干成员 // ... int y; int z;}; 在只知道成员变量y地址的情况下,如何获取到结构体的首地址?
如果界面所指定的字体在用户系统上未安装,则会自动降级到系统默认字体,这样会导致界面显示异常或达不到预期效果。 对于特殊字体我们通常会集成到软件安装包内,但对于汉字这样的语言,它的文字比较多,因此字体文件比较大,如果集成到安装包内会导致安装包体积变大,所以对于类似中文这样字符比较多的语言字体,我们通常会选择系统自带的字体。 而不同操作系统(如Windows和macOS)所自带的字体不一样,甚至同一操作系统不同的版本(如Windows 7和Windows 11)自带的字体也不一样,因此在选择采用什么字体前,需要弄清我们应用程序支持的操作系统所自带的字体都有哪些,才能更好的做选择。 操作系统的新版本通常只会新增字体,不会移除老的字体。
1. 背景在项目开发中时常会遇到需要多个进程间交互/通信的场景,进程间通信(IPC)的方式有很多,比如文件、注册表、网络、管道、共享内存等。 对于简单的交互场景,我们可以随意选择一种合适的方式,如 Google Chrome 使用的是管道的方式。 但在交互场景复杂的情况下,远程过程调用(RPC)的方式则会更新便捷。 目前开源的、功能相对完善的 C++ RPC 框架都是基于网络方式实现的,这种方式存在服务端和客户端的概念,两端相互调用需要各方都启动一个端口监听服务,既然需要监听端口,那就会存在端口被占用的问题,特别是在 Windows 上还会存在端口假可用的问题,端口虽然监听成功,但客户端仍然无法连接的情况。 我一直想找到一个基于共享内存实现的、跨平台的 C++ RPC 框架,但遗憾的是一直没能结缘,于是我决定烹饪一个。
本文主要介绍如何在 Node-API 中实现不同类型的接口,主要有下面几种类型: 同步调用 基于 Napi::AsyncWorker 的异步调用,通过回调函数返回 异步调用,返回 Promise 基于 Napi::ThreadSafeFunction 的异步调用,通过回调函数返回