诞生
本博客诞生起源于……
2025年1月,看到别人的博客,我去,怎么那么帅呢,就想自己也搞一个,不过一直拖到了2026年的1月(=。=)
随念一想,博客现在出来了,本着开源的精神,我可以把笔记(电子垃圾)发出来,还可以发一些处理bug的过程。
电脑网页端观感更佳哦
维护
本博客部署于Cloudflare,仅域名(abinng.com)是在阿里云购买的,总成本
85/年
其他可访问的站点:
cf.abinng.dpdns.org
abinng.github.io
既然部署于Cloudflare,emm,后台不挂东西的话,加载还是会慢的,所以你可以开着进来,体验更佳
内容
本博客主要是编程、生活相关,技术部分都相当基础,主要是因为我本人也比较菜,不过会一直更新的。。(可能吧)
快速找到想看的内容?可以通过首页右上角的搜索或者在标签/分类页进行关键词查看~
关于文章质量,目前我只是将我自己本地给自己看的笔记,微微优化之后发到博客上,再加上博主文笔不好,可能观感不是那么好,不过再怎么说也是真实的技术/bug记录,还是有不少真东西的
图片
关于装饰图, ...
auther: abinng date: 2026-05-18 09:07
createDate:2026-05-18 09:06
复习路线
这篇笔记是一个综合实战——用 Qt
的绘图系统和动画框架,从零实现一个可交互的拟物化时钟控件。
涉及的知识点:
12345QPainter 坐标系变换 → 绘制 60 个刻度 + 三根针(时/分/秒) → Q_PROPERTY + QPropertyAnimation 实现平滑扫秒 → QTimer 驱动时间推进 → 信号/槽连接控件与 LCD 面板 → 日间/夜间主题切换、手动设置时间
建议先读完 015-Qt 的绘图系统 和
016-小项目-仿汽车仪表盘
之后再来看这篇,它们分别覆盖了基础绘图和 Q_PROPERTY
动画模式。
1. 效果描述
实现一个拟物化时钟控件,具备以下功能:
圆形表盘,60 个刻度(每 5 个加粗),时针/分针/秒针
两种走针模式:平滑扫秒(秒针连续转动)和机械跳动(秒针每秒跳一格)
日间/夜间主题切换
右侧控制面板:数字时间显示(LCD)、走针模式、主题、手动设置时间 ...
auther: abinng date: 2026-05-17 18:05
createDate:2026-05-17 18:05
复习路线
这篇笔记要回答的问题是:Qt 如何封装传统的 socket
编程,让我们用信号槽的方式完成 UDP/TCP 通信?
先记住 UDP 和 TCP 两条主线:
123UDP: bind() 绑定端口 → readyRead 信号 → readDatagram() 读取 → writeDatagram() 发送TCP: listen() 开始监听 → newConnection 信号 → nextPendingConnection() 获取 socket → readyRead 信号 → readAll() 读取 → write() 回复
下次忘记时,可以按这个顺序复习:
先看“引入与配置“,回顾传统 socket 编程的痛点,理解 Qt
的封装思路。
看“UDP 网络编程“,先理解 QUdpSocket
的通信模型,再对照完整代码走通发送和接收两条路径。
看“TCP 服务端编程“,先理解 QTcpSe ...
auther: abinng date: 2026-05-14 15:47
createDate:2026-05-14 15:47
复习路线
这篇笔记要回答的问题是:Qt 如何连接数据库、执行
SQL,以及怎样通过模型视图架构将数据库中的数据高效地展示在界面上?
Qt SQL 模块总体上分为 3 层:
12345驱动层(桥接具体数据库) ↓SQL 接口层(QSqlDatabase 连接 + QSqlQuery 执行 SQL) ↓用户接口层(QSqlQueryModel / QSqlTableModel / QSqlRelationalTableModel → QTableView)
下次忘记时,可以按这个顺序复习:
先看“数据库连接“,理解 QSqlDatabase
的分层设计以及如何创建连接。
再看“执行SQL语句“,掌握 QSqlQuery 的增删改查和批量操作。
看“MVD 模型视图架构“,理解 Model / View / Delegate
三个角色的分工与通信。
看“三个SQL模型“,对比 QSqlQueryModel / QSqlTab ...
auther: abinng date: 2026-05-10 18:21
createDate:2026-05-10 18:21
复习路线
这篇笔记是一个综合实战——用 Qt
的绘图系统和动画框架,从零实现一个仿汽车仪表盘的自定义控件。
涉及的知识点:
1234QPainter 坐标系变换(translate/rotate/scale) → 绘制环形刻度盘 + 刻度文字 → QPainterPath 布尔运算(subtract 镂空指针) → Q_PROPERTY + QPropertyAnimation(平滑动画)
建议先读完 015-Qt
的绘图系统,掌握 QPainter 的
translate/rotate/scale 和 drawArc
之后再来看这篇。
1. 效果描述
实现一个汽车速度仪表盘控件,具备以下功能:
速度范围 0 ~ 240 km/h
环形刻度盘,短刻度和长刻度交替,长刻度旁显示速度值
指针采用中间镂空样式
支持设置目标速度,指针以动画平滑滑到对应位置
2. 核心架构
整个项目分为两层:
...
auther: abinng date: 2026-05-10 10:34
createDate:2026-05-10 10:34
基础了解
一个功能强大且灵活的2D图形渲染框架,它使得开发者能够高效地在屏幕、内存或设备上绘制图形、文本和图像,整个绘图系统基于QPainter,
QPainterDevice和QPaintEngine三个类
QPainter(画家):负责执行画线、填充、变换等操作的“执行者”。
QPaintDevice(画布):绘图的二维空间。常见的有QWidget、QPixmap、QImage、QPrinter
QPaintEngine(画笔引擎):这是一个底层抽象类,负责将QPainter的指令翻译成不同设备的绘制代码。
QPainter可以配置的工具有:画笔QPen、画刷QBrush、字体QFont
QPen:线宽、颜色、线型,含有设置接口和读取接口
QBrush:定义了绘制时的填充特性,包括颜色、填充样式、材质填充时的图片等,也支持渐变样式的填充
Qt 的绘图操作大部分发生在 paintEvent 中,什么时候会触发
pa ...
auther: abinng date: 2026-05-09 16:00
createDate:2026-05-09 16:00
我们知道,一些耗时的操作,如文件读写、网络请求、复杂计算等,如果在主线程中执行,可能导致界面无响应,所以Qt也引入了多线程,提供了不依赖平台的管理线程的方法
一些注意事项:
通常主线程负责几乎所有GUI的操作,如果其他线程尝试直接访问这些控件,会导致程序崩溃,此时推荐使用信号和槽机制
从一个错误案例入手
点击展开
main.cppErrorForm.hErrorForm.cpp12345678910#include <QApplication>#include "ErrorForm.h"int main(int argc, char *argv[]) { QApplication a(argc, argv); ErrorForm win; win.show(); return QApplication::exec();}1234567891 ...
auther: abinng date: 2026-05-09 09:36
createDate:2026-05-09 09:36
1. 多功能鼠标操作窗口
目的:了解一下鼠标事件
实现的效果:
启动后,改变鼠标默认显示样式,松开和摁下左键的效果
双击鼠标左键来使其全屏
按着鼠标右键则使指针变为一个自定义的图片
可以在界面上按着鼠标左键来拖动窗口
使用滚轮可以放大或缩小编辑器中的内容
点击展开
main.cppMouswWidget.hMouseWidget.cpp123456789#include <QApplication>#include "MouseWidget.h"int main(int argc, char *argv[]) { QApplication a(argc, argv); MouseWidget win; win.show(); return QApplication::exec();}1234567891011121314151617 ...
auther: abinng date: 2026-03-31 14:49
createDate:2026-03-31 14:49
由于我已经开始实习,所以本篇往后我可能并不会详细进行笔记记录,因为太累了
操作系统本身就有事件系统,但是Qt是跨平台的框架,所以Qt在操作系统上层又封装了一层QEvent,一套代码在不同操作系统上运行
可参考Qt 教程 | 爱编程的大丙
和 Qt应用开发.pdf
复习路线
这篇笔记要回答的问题是:Qt
收到一个外部动作,或者代码主动投递一个事件之后,是怎样把它变成某个对象上的函数调用的?
先记住这条主线:
123OS/Qt 产生事件 -> 事件循环 exec() 取出事件 -> notify() 准备分发-> eventFilter() 可提前拦截 -> event() 按类型分发-> mousePressEvent/keyPressEvent/... 处理 -> 必要时发射 signal
下次忘记时,可以按这个顺序复习:
先看“事件是什么”和 exec(),建立事件循环的概念。
...
auther: abinng date: 2026-03-26 10:01
createDate:2026-03-26 10:01
在银行等私密输入密码的地方,其键盘的排列并不是顺序的123456789,而是九个位置顺序打乱
功能描述
矩阵键盘分为数字键(0~9),功能按键(删除和确认)
输入 6 位数字模拟密码,每次输入 6
位后,键盘数字按键随机变换坐标,功能按键坐标固定
点击确定后,显示清零后数字按键随机变换坐标
矩阵键盘按键尺寸固定,每个按键长宽为 80px * 80px,LCD
显示区长宽为 240px * 80px
双模式:通过强类型枚举 PadMode
一键切换键盘主题。
UI 逻辑解耦:拒绝在 CPP 中硬编码长串样式,所有 UI
渲染均交由独立的 .qss 文件动态加载。
安全防窥输入:输入满 6 位后,数字键位自动通过
std::shuffle 与硬件熵源进行随机重排。
效果演示
项目结构
一个基于 C++17 和 Qt6 开发的现代化虚拟数字键盘组件。 支持“纯代码
QSS”与“图标资源”双模式切换,内置数字键随机 ...

















