Qt 模块中的线程支持
线程与 SQL 模块
数据库连接只能在创建它的线程中使用。可以使用QSqlDatabase::moveToThread() 将连接转移到另一个线程中。
此外,QSqlDrivers 使用的第三方库会对在多线程程序中使用 SQL 模块施加更多限制。更多信息请查阅数据库客户端手册
在线程中绘制
QPainter 可在一个线程中用于绘制到 , , 和(对于大多数平台) 绘画设备上。QImage QPrinter QPicture QPixmap 不支持绘制到 QWidgets 上。在 macOS 上,如果从 GUI 线程外打印,则不会显示自动进度对话框。
在任何给定时间内,任意数量的线程都可以绘制,但一次只能有一个线程在给定的绘制设备上绘制。换句话说,如果两个线程分别在不同的 QImages 上打印,它们可以同时打印,但两个线程不能同时在同一个QImage 上打印。
线程和富文本处理
QTextDocument 、QTextCursor 以及所有相关类都是可重入的。
请注意,在图形用户界面线程中创建的QTextDocument 实例可能包含QPixmap 图像资源。请使用QTextDocument::clone() 创建文档副本,并将副本传递给另一个线程进行进一步处理(如打印)。
线程和 SVG 模块
QtSvg 模块中的QSvgGenerator 和QSvgRenderer 类是可重入的。
线程和隐式共享类
Qt 对其许多值类(尤其是QImage 和QString )使用了一种称为隐式共享的优化方法。从 Qt 4 开始,隐式共享类可以像其他值类一样安全地跨线程复制。它们是完全可重入的。隐式共享确实是隐式的。
在很多人的印象中,隐式共享和多线程是不相容的概念,因为引用计数通常是这样进行的。然而,Qt 使用原子引用计数来确保共享数据的完整性,避免了引用计数器的潜在损坏。
请注意,原子引用计数并不能保证线程安全。在线程间共享隐式共享类的实例时,应使用适当的锁定。这是对所有重入类的相同要求,无论是否共享。不过,原子引用计数可以保证在隐式共享类的本地实例上工作的线程是安全的。我们建议使用信号和槽在线程间传递数据,因为这样做无需任何显式锁定。
总而言之,Qt 4 中的隐式共享类确实是隐式共享的。即使在多线程应用程序中,您也可以像使用普通、非共享、基于值的可重入类一样安全地使用它们。
© 2025 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.