警告

本节包含自动从C++翻译到Python的片段,可能包含错误。

隐式共享#

快速复制的引用计数。

Qt中的许多C++类使用隐式数据共享来最大化资源使用并最小化复制。隐式共享类在作为参数传递时既安全又高效,因为只传递数据的指针,并且数据只有在函数写入时才复制,即写时复制

概述#

共享类由指向共享数据块的指针组成,该数据块包含引用计数和数据。

创建共享对象时,它将引用计数设置为1。每当新的对象引用共享数据时,引用计数会增加,当对象取消引用共享数据时减少。当引用计数变为零时,共享数据将被删除。

处理共享对象时,有两种复制对象的方法。我们通常谈论深度复制浅度复制。深度复制意味着复制一个对象。浅度复制是引用复制,即指向共享数据块的指针。深度复制可能会在内存和CPU方面非常昂贵。浅度复制非常快,因为它只涉及设置指针并增加引用计数。

隐式共享对象的赋值(使用operator=())是通过浅度复制实现的。

共享的好处是程序无需不必要地复制数据,从而降低内存使用并减少数据复制。对象可以轻松赋值、作为函数参数发送和从函数返回。

隐式共享主要在幕后进行;程序员很少需要担心它。但是,Qt的容器迭代器与STL的迭代器行为不同。请参阅隐式共享迭代器问题

在多线程应用程序中,隐式共享与在“线程和隐式共享类”中解释的方式相同。

实现自己的隐式共享类时,请使用QSharedDataQSharedDataPointer类。

隐式共享的详细说明#

当对象即将更改并且引用计数大于1时,隐式共享会自动将对象从共享块中分离出来(这通常被称为写时复制值语义)。

隐式共享类控制其内部数据。在任何修改其数据的成员函数中,它自动在修改数据之前分离出来。但是请注意,容器迭代器有一个特殊情况;请参阅隐式共享迭代器问题

使用隐式共享的QPen类在所有更改内部数据的成员函数中从共享数据中分离出来。

代码片段

def setStyle(self, style):

    detach() # detach from common data
    d.style = style # set the style member

def detach(self):

    if d.ref != 1:
        ... // perform a deep copy

类列表#

以下列出的类在对象即将改变时将自动与公共数据分离。程序员甚至不会注意到对象是被共享的。因此,你应该将这些类的单独实例视为单独的对象。它们始终表现出独立的对象行为,但同时在可能的情况下共享数据。因此,你可以将此类类的实例作为按值传递给函数的参数,而不用担心复制的开销。

示例

p1, = QPixmap()
p1.load("image.bmp")
p2 = p1 # p1 and p2 share data
paint = QPainter()
paint.begin(p2) # cuts p2 loose from p1
paint.drawText(0,50, "Hi")
paint.end()

在这个示例中,由于调用 p2 的 QPainter::begin() 将修改它,因此 p1p2 在调用前共享数据。

警告

在使用 STL-style iterator 时小心处理隐式共享容器(QMapQList 等)。请参阅 隐式共享迭代器问题

QDebug

QDebug 类提供了一个调试信息的输出流。

PySide6.QtCore.QDir

QDir 类提供对目录结构和内容的访问。

PySide6.QtCore.QFileInfo

QFileInfo 类提供一种在文件系统中检索条目信息的 OS 专用 API。

PySide6.QtCore.QProcessEnvironment

QProcessEnvironment 类用于保存可传递给程序的环命令。

PySide6.QtCore.QStorageInfo

提供有关当前挂载的存储和驱动器的信息。

PySide6.QtCore.QUrl

QUrl 类提供了一个处理 URLs 的便捷接口。

PySide6.QtCore.QUrlQuery

QUrlQuery 类提供了一种处理 URL 查询中键值对的方法。

PySide6.QtCore.QPersistentModelIndex

QPersistentModelIndex 类用于在数据模型中定位数据。

PySide6.QtCore.QVariant

QVariant 类类似于最常见 Qt 数据类型的联合体。

PySide6.QtCore.QMimeType

QMimeType 类用 MIME 类型字符串表示文件的类型。

PySide6.QtCore.QJsonArray

QJsonArray 类封装了 JSON 数组。

PySide6.QtCore.QJsonDocument

QJsonDocument 类提供了一个读写 JSON 文档的方法。

PySide6.QtCore.QJsonObject

QJsonObject 类封装了 JSON 对象。

PySide6.QtCore.QJsonParseError

QJsonParseError 类用于报告 JSON 解析过程中的错误。

PySide6.QtCore.QJsonValue

QJsonValue 类封装了 JSON 中的值。

PySide6.QtCore.QByteArray

QByteArray 类提供了一个字节数组。

QByteArrayList

QByteArrayList 类提供了一个字节数组的列表。

PySide6.QtCore.QByteArrayView

QByteArrayView 类提供了一个在字节数组上的视图,具有只读子集的 QByteArray API。

PySide6.QtCore.QCollator

QCollator 类根据局部化排序算法比较字符串。

PySide6.QtCore.QCollatorSortKey

QCollatorSortKey 类可用于加快字符串排序速度。

PySide6.QtCore.QLocale

QLocale 类在多种语言之间转换数字及其字符串表示形式。

PySide6.QtCore.QRegularExpression

QRegularExpression 类提供了使用正则表达式进行模式匹配的功能。

PySide6.QtCore.QRegularExpressionMatch

QRegularExpressionMatch 类提供了将 QRegularExpression 与字符串匹配的结果。

PySide6.QtCore.QRegularExpressionMatchIterator

QRegularExpressionMatchIterator 类提供了在字符串上对 QRegularExpression 对象全局匹配结果的迭代器。

PySide6.QtCore.QString

QString 类提供了一个 Unicode 字符串。

PySide6.QtCore.QStringList

QStringList类提供字符串列表。

PySide6.QtCore.QTextBoundaryFinder

QTextBoundaryFinder类提供了一种在字符串中查找Unicode文本边界的方法。

PySide6.QtCore.QDateTime

QDateTime类提供日期和时间函数。

PySide6.QtCore.QBitArray

QBitArray类提供位数组。

QCache

QCache类是一个提供缓存的模板类。

PySide6.QtCore.QCommandLineOption

QCommandLineOption类定义了一个可能的命令行选项。

QContiguousCache

QContiguousCache类是一个提供连续缓存的模板类。

QHash

QHash类是一个提供基于哈希表字典的模板类。

QMultiHash

QMultiHash类是一个提供多值哈希的便捷QHash子类。

QList

QList类是一个提供动态数组的模板类。

QMap

QMap类是一个提供关联数组的模板类。

QMultiMap

QMultiMap类是一个提供具有多个等价键的关联数组的模板类。

QQueue

QQueue类是一个提供队列的通用容器。

QSet

QSet类是一个提供基于哈希表集的模板类。

QStack

QStack类是一个提供堆栈的模板类。