pyqt6跨平台便签需分平台处理透明背景、数据库连接、窗口拖动和字体渲染:macos/linux须在setwindowflags后设透明属性并配样式,sqlite需显式open(),拖动需记录全局鼠标偏移,字体要嵌入资源并全局设置。

PyQt6窗口无法在macOS/Linux上正常显示透明背景
macOS和Linux对窗口透明度的支持逻辑和Windows不同,直接设self.setAttribute(Qt.WA_TranslucentBackground)可能无效或导致黑屏。关键不是“设不设”,而是“在哪设”——必须在setWindowFlags()之后、show()之前调用,且需配合setStyleSheet("background: transparent;")和setAttribute(Qt.WA_NoSystemBackground)。
- macOS需额外调用
self.setWindowOpacity(0.98)绕过Metal渲染的全透明限制(完全0.0会失效) - Linux(Wayland)下
Qt.WA_TranslucentBackground基本不可用,建议降级为半透明边框+浅色背景+低opacity模拟效果 - 务必在
__init__末尾检查QApplication.platformName(),按平台分支处理
保存便签内容时SQLite写入失败但无报错
PyQt6的QSqlDatabase默认使用延迟连接,addDatabase()后不显式调用open(),后续exec()会静默失败。常见现象是程序运行无报错,但重启后便签消失。
- 必须在初始化数据库后立即检查
db.open()返回值,失败时打印db.lastError().text() - 路径要用
QStandardPaths.writableLocation(QStandardPaths.AppDataLocation),避免硬编码"./data.db"导致权限问题 - 建表语句中字段名别用
text(SQLite关键字),改用content或note_text - 插入前用
QSqlQuery.prepare()+addBindValue()防SQL注入,别拼接字符串
拖动便签窗口时鼠标卡顿或偏移
PyQt6中重写mousePressEvent/mouseMoveEvent实现拖动时,若未正确记录初始偏移量,会导致窗口“跳动”或跟随迟滞。核心是保存鼠标按下时相对于窗口左上角的坐标差,而非绝对屏幕坐标。
- 在
mousePressEvent里存self._drag_start_position = event.globalPosition().toPoint()(注意用globalPosition(),不是pos()) -
mouseMoveEvent中计算新位置:delta = global_pos - self._drag_start_position,再调用self.move(self.pos() + delta) - 必须在
mouseReleaseEvent里清空_drag_start_position,否则下次拖动起点错乱 - macOS下需额外过滤
event.buttons() == Qt.LeftButton,否则触控板双指滑动会误触发
打包成独立应用后字体渲染模糊或中文乱码
PyQt6默认用系统原生字体渲染,但打包工具(如PyInstaller)可能漏掉字体文件或fontconfig配置,尤其在Linux上表现为方块字,macOS上则出现灰阶模糊。
- 启动时强制加载Noto Sans CJK或思源黑体:
QFontDatabase.addApplicationFont(":/fonts/NotoSansCJKsc-Regular.otf")(资源文件需提前添加到.qrc) - 设置全局字体:
app.setFont(QFont("Noto Sans CJK SC", 12)),避免依赖系统字体列表 - Linux打包时加
--add-binary "/usr/share/fonts/truetype/noto:NotoFonts"(路径按实际调整) - Windows上若用MSVC编译,需确保
qt.conf中[Platforms]指向qwindows.dll,否则字体引擎加载失败
跨平台便签最难的不是功能,是每个平台对“透明”“拖动”“字体”的底层解释完全不同——同一行代码,在三个系统上要准备三套fallback逻辑,漏掉任意一个平台分支,用户就会觉得“这软件做得很糙”。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











