Qt 模块中的线程支持
线程与 SQL 模块
数据库连接必须仅在创建该连接的线程内部使用。可通过调用 `QSqlDatabase::moveToThread()` 将连接转移到另一个线程。
此外,QSqlDrivers所使用的第三方库可能会对在多线程程序中使用SQL模块施加进一步的限制。有关更多信息,请参阅您的数据库客户端手册
线程中的绘制操作
QPainter 可在线程中使用QImage 、QPrinter 、QPicture 以及(在大多数平台上)QPixmap 等绘图设备进行绘制。不支持在QWidgets上绘制。在macOS上,若从GUI线程外部进行绘制,系统将不会显示自动进度对话框。
在任意给定时刻,任意数量的线程都可以进行绘制,但同一绘制设备上每次只能由一个线程进行绘制。换言之,如果两个线程分别在不同的 QImage 上进行绘制,则它们可以同时绘制;但如果两个线程同时在同一个QImage 上进行绘制,则无法同时进行。
线程与富文本处理
QTextDocument 、QTextCursor 以及所有相关类都是可重入的。
请注意,在 GUI 线程中创建的QTextDocument 实例可能包含QPixmap 图像资源。请使用QTextDocument::clone() 创建文档的副本,并将该副本传递给另一个线程以进行进一步处理(例如打印)。
线程与 SVG 模块
QtSvg 模块中的QSvgGenerator 和QSvgRenderer 类是可重入的。
线程与隐式共享类
Qt 对其许多值类(尤其是QImage 和QString )使用了一种名为“隐式共享”的优化机制。从 Qt 4 开始,隐式共享类可以像其他任何值类一样安全地在不同线程间复制。它们完全是可重入的。这种隐式共享确实是隐式的。
在许多人看来,由于引用计数通常的实现方式,隐式共享与多线程是相互矛盾的概念。然而,Qt 使用原子引用计数来确保共享数据的完整性,从而避免了引用计数器可能出现的损坏。
请注意,原子引用计数并不能保证线程安全。当在线程之间共享隐式共享类的实例时,应使用适当的锁定机制。这是对所有可重入类(无论是否共享)的共同要求。 不过,原子引用计数确实能保证,单独处理隐式共享类本地实例的线程是安全的。我们建议使用信号与槽在线程之间传递数据,因为这样无需任何显式锁定即可实现。
总而言之,Qt 4 中的隐式共享类确实是隐式共享的。即使在多线程应用程序中,您也可以安全地使用它们,就好像它们是普通的、非共享的、可重入的基于值的类一样。
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.