Thread-Support in Qt Modules
Threads and the SQL Module
连接只能在创建它的线程内使用. 不支持在线程之间移动连接或从不同线程创建查询.
此外, QSqlDrivers 使用的第三方库可以对在多线程程序中使用 SQL 模块施加进一步的限制. 有关详细信息, 请参阅数据库客户端的手册.
Painting in Threads
QPainter 可以在线程中使用, 在 QImage, QPrinter, QPicture 绘图设备上进行绘图. 不支持在 QPixmaps 和 QWidgets 上绘制. 在 macOS 上, 如果你从 GUI 线程外部进行打印, 则不会显示自动进度对话框.
任意数量的线程可以在任何给定时间进行绘制, 但是一次只有一个线程可以在给定的绘制设备上进行绘制. 换句话说, 如果两个线程都绘制到单独的 QImage 上, 则两个线程可以同时绘制, 但两个线程不能同时绘制到同一个 QImage 上.
Threads and Rich Text Processing
QTextDocument, QTextCursor, 及 所有相关类 是可重入的.
注意: 在 GUI 线程中创建的 QTextDocument 实例可能包含 QPixmap 图像资源. 使用 QTextDocument::clone() 创建文档的副本, 并将副本传递给另一个线程进一步处理 (如打印).
Threads and the SVG Module
QtSvg 中的 QSvgGenerator 和 QSvgRenderer 是可重入的.
Threads and Implicitly Shared Classes
Qt 对许多值类 ( 特别是 QImage 和 QString) 使用一种称为 隐式共享 的优化. 从 Qt 4 开始, 隐式共享类可以像任何其他值类一样安全地跨线程复制. 它们是完全 可重入的. 隐式共享确实是隐式的.
在许多人看来, 隐式共享和多线程是不兼容的概念, 因为引用计数通常是这样完成的. 然而, Qt 使用原子引用计数来确保共享数据的完整性, 避免引用计数器的潜在损坏.
注意, 原子引用计数并不能保证 线程安全. 在线程之间共享隐式共享类的实例时, 应使用适当的锁定. 这与所有 可重入的 类(共享与否)的要求相同. 然而, 原子引用计数确实可以保证在隐式共享类的自己的本地实例上工作的线程是安全的. 我们建议使用 信号和槽 在线程之间传递数据, 因为这不需要任何显式锁定即可完成.
综上所述, Qt 4 中的隐式共享类确实是隐式共享的. 即使在多线程应用程序中, 你也可以安全地使用它们, 就像它们是普通的, 非共享的, 可重入的基于值的类一样.