QXmlStreamReader Class

QXmlStreamReader 类提供了一个快速解析器,可通过简单的流式 API 读取格式良好的 XML。更多

Header: #include <QXmlStreamReader>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core

注意:该类中的所有函数都是可重入的

公共类型

enum Error { NoError, CustomError, NotWellFormedError, PrematureEndOfDocumentError, UnexpectedElementError }
enum ReadElementTextBehaviour { ErrorOnUnexpectedElement, IncludeChildElements, SkipChildElements }
enum TokenType { NoToken, Invalid, StartDocument, EndDocument, StartElement, …, ProcessingInstruction }

属性

公共功能

QXmlStreamReader()
QXmlStreamReader(QAnyStringView data)
QXmlStreamReader(QIODevice *device)
QXmlStreamReader(const QByteArray &data)
~QXmlStreamReader()
void addData(QAnyStringView data)
void addData(const QByteArray &data)
void addExtraNamespaceDeclaration(const QXmlStreamNamespaceDeclaration &extraNamespaceDeclaration)
void addExtraNamespaceDeclarations(const QXmlStreamNamespaceDeclarations &extraNamespaceDeclarations)
bool atEnd() const
QXmlStreamAttributes attributes() const
qint64 characterOffset() const
void clear()
qint64 columnNumber() const
QIODevice *device() const
QStringView documentEncoding() const
QStringView documentVersion() const
QStringView dtdName() const
QStringView dtdPublicId() const
QStringView dtdSystemId() const
QXmlStreamEntityDeclarations entityDeclarations() const
int entityExpansionLimit() const
QXmlStreamEntityResolver *entityResolver() const
QXmlStreamReader::Error error() const
QString errorString() const
bool hasError() const
(since 6.6) bool hasStandaloneDeclaration() const
bool isCDATA() const
bool isCharacters() const
bool isComment() const
bool isDTD() const
bool isEndDocument() const
bool isEndElement() const
bool isEntityReference() const
bool isProcessingInstruction() const
bool isStandaloneDocument() const
bool isStartDocument() const
bool isStartElement() const
bool isWhitespace() const
qint64 lineNumber() const
QStringView name() const
QXmlStreamNamespaceDeclarations namespaceDeclarations() const
bool namespaceProcessing() const
QStringView namespaceUri() const
QXmlStreamNotationDeclarations notationDeclarations() const
QStringView prefix() const
QStringView processingInstructionData() const
QStringView processingInstructionTarget() const
QStringView qualifiedName() const
void raiseError(const QString &message = QString())
QString readElementText(QXmlStreamReader::ReadElementTextBehaviour behaviour = ErrorOnUnexpectedElement)
QXmlStreamReader::TokenType readNext()
bool readNextStartElement()
void setDevice(QIODevice *device)
void setEntityExpansionLimit(int limit)
void setEntityResolver(QXmlStreamEntityResolver *resolver)
void setNamespaceProcessing(bool)
void skipCurrentElement()
QStringView text() const
QString tokenString() const
QXmlStreamReader::TokenType tokenType() const

详细说明

QXmlStreamReader 提供了一个简单的流式 API 来解析格式良好的 XML。它是首先将完整的 XML 加载到 DOM 树(参见QDomDocument )的替代方法。QXmlStreamReader 可从QIODevice (参见setDevice()) 或原始QByteArray (参见addData()) 中读取数据。

Qt 提供了用于编写 XML 的QXmlStreamWriter

流阅读器的基本概念是将 XML 文档作为标记流进行报告,类似于 SAX。QXmlStreamReader 与 SAX 的主要区别在于如何报告这些 XML 标记。对于 SAX,应用程序必须提供处理程序(回调函数),以便在解析器方便时从解析器接收所谓的 XML事件。使用 QXmlStreamReader 时,应用程序代码本身会驱动循环,并在需要时一个接一个地从阅读器中提取标记。这是通过调用readNext() 来实现的,阅读器从输入流中读取数据,直到完成下一个标记,然后返回tokenType() 。然后,可以使用包括isStartElement() 和text() 在内的一系列便捷函数来检查标记,以获取有关已读取内容的信息。这种拉取方法的最大优点是可以用它来构建递归下降解析器,这意味着您可以轻松地将 XML 解析代码拆分成不同的方法或类。这样,在解析 XML 时就能轻松跟踪应用程序自身的状态。

使用 QXmlStreamReader 的典型循环如下所示:

  QXmlStreamReader xml;
  ...
  while (!xml.atEnd()) {
        xml.readNext();
        ... // do processing
  }
  if (xml.hasError()) {
        ... // do error handling
  }

QXmlStreamReader 是一个格式良好的 XML 1.0 解析器,包含外部解析实体。只要不发生错误,应用程序代码就能确保

  • 流阅读器提供的数据符合 W3C 的 XML 格式化标准、
  • 标记以有效的顺序提供。

除非 QXmlStreamReader 引发错误,否则它将保证以下几点:

  • 所有标记都正确嵌套和关闭。
  • 对内部实体的引用已用正确的替换文本替换。
  • 属性已根据DTD 的内部子集规范化或添加。
  • 除注释和处理指令外,StartDocument 类型的标记出现在所有其他标记之前。
  • 最多出现一个 DOCTYPE 元素(DTD 类型的标记)。
  • 如果出现,除了StartDocument 、注释和处理指令外,DOCTYPE 会出现在所有其他元素之前。

特别是,一旦看到StartElementEndElementCharactersEntityReferenceEndDocument 类型的任何标记,就不会再看到StartDocument 或 DTD 类型的标记。如果输入流中出现了不按顺序排列的令牌,则会引发错误。

注意: 令牌类型CommentProcessingInstruction 可以出现在数据流的任何位置。

如果在解析过程中发生错误,atEnd() 和hasError() 将返回 true,而error() 将返回发生的错误。函数errorString() 、lineNumber() 、columnNumber() 和characterOffset() 用于构建适当的错误或警告信息。为简化应用代码,QXmlStreamReader 包含一个raiseError() 机制,可让您提出自定义错误,触发所述的相同错误处理。

QXmlStream Bookmarks 示例说明了如何使用递归下降技术通过流阅读器读取 XML 书签文件 (XBEL)。

命名空间

QXmlStream 能理解并解析 XML 命名空间。例如,在StartElement 的情况下,namespaceUri() 返回元素所在的命名空间,而name() 返回元素的本地名称。namespaceUri 和名称的组合可唯一标识一个元素。如果在阅读器解析的 XML 实体中没有声明命名空间前缀,则namespaceUri 为空。

如果您解析的 XML 数据没有按照 XML 规范使用命名空间或根本没有使用命名空间,您可以使用元素的qualifiedName() 代替。限定名称是元素的prefix() 后加冒号,然后是元素的本地name() - 与原始 XML 数据中的元素完全一样。由于namespaceUri 与前缀的映射既不是唯一的,也不是通用的,因此符合命名空间的 XML 数据应避免使用qualifiedName()。

为了解析使用未声明命名空间前缀的独立文档,可以使用namespaceProcessing 属性完全关闭命名空间处理。

增量解析

QXmlStreamReader 是一种增量解析器。它能处理因文档分块到达(如来自多个文件或通过网络连接)而无法一次解析完毕的情况。当阅读器在解析完整文档前耗尽数据时,会报告PrematureEndOfDocumentError 。当调用addData() 或通过网络device() 获得更多数据后,阅读器会从PrematureEndOfDocumentError 错误中恢复,并通过下一次调用readNext() 继续解析新数据。

例如,如果您的应用程序使用network access manager 从网络读取数据,您将向管理器发出network request ,并收到network reply 作为回报。由于QNetworkReply 是一个QIODevice ,因此您可以将其readyRead() 信号连接到一个自定义槽,例如,在讨论QNetworkAccessManager 的代码片段中显示的slotReadyRead() 。在这个槽中,您使用readAll() 读取所有可用数据,并使用addData() 将其传递给 XML 流阅读器。然后调用自定义解析函数,从阅读器中读取 XML 事件。

性能和内存消耗

QXmlStreamReader 在设计上比较节省内存,因为它不会在内存中存储整个 XML 文档树,而只会在报告时存储当前标记。此外,QXmlStreamReader 还避免了将 XML 文档映射到方便的 Qt-ish API 时通常需要的许多小字符串分配。为此,它将所有字符串数据报告为QStringView ,而不是真正的QString 对象。对任何这些对象调用toString() 都会返回一个等价的真实QString 对象。

成员类型文档

enum QXmlStreamReader::Error

该枚举指定了不同的错误情况

常量说明
QXmlStreamReader::NoError0未发生错误。
QXmlStreamReader::CustomError2已通过raiseError() 引发自定义错误。
QXmlStreamReader::NotWellFormedError3由于读取的 XML 格式不正确,解析器内部发生错误。
QXmlStreamReader::PrematureEndOfDocumentError4输入流在解析出格式良好的 XML 文档之前就已结束。如果有更多 XML 到达流中,调用addData() 或等待 XML 到达device() 都有可能从该错误中恢复。
QXmlStreamReader::UnexpectedElementError1解析器遇到了与预期不同的元素或标记。

enum QXmlStreamReader::ReadElementTextBehaviour

该枚举指定了readElementText() 的不同行为。

常量说明
QXmlStreamReader::ErrorOnUnexpectedElement0当遇到子元素时,引发UnexpectedElementError 并返回已读取的内容。
QXmlStreamReader::IncludeChildElements1递归包含子元素的文本。
QXmlStreamReader::SkipChildElements2跳过子元素。

enum QXmlStreamReader::TokenType

该枚举指定阅读器刚读取的标记类型。

常量说明
QXmlStreamReader::NoToken0读取器尚未读取任何内容。
QXmlStreamReader::Invalid1发生错误,在error() 和errorString() 中报告。
QXmlStreamReader::StartDocument2阅读器在documentVersion() 中报告 XML 版本号,在documentEncoding() 中报告 XML 文档中指定的编码。如果文档是独立声明的,isStandaloneDocument() 返回true ;否则返回false
QXmlStreamReader::EndDocument3阅读器报告文档结束。
QXmlStreamReader::StartElement4阅读器通过namespaceUri() 和name() 报告元素的开始。空元素也会报告为 StartElement,然后直接报告为 EndElement。可以调用方便函数readElementText() 来连接所有内容,直到相应的 EndElement。属性在attributes() 中报告,命名空间声明在namespaceDeclarations() 中报告。
QXmlStreamReader::EndElement5阅读器通过namespaceUri() 和name() 报告元素的结束。
QXmlStreamReader::Characters6阅读器在text() 中报告字符。如果这些字符都是空格,isWhitespace() 将返回true 。如果字符来自 CDATA 部分,isCDATA() 返回true
QXmlStreamReader::Comment7读者在text() 中报告注释。
QXmlStreamReader::DTD8读者在text() 中报告 DTD,在notationDeclarations() 中报告符号声明,在entityDeclarations() 中报告实体声明。DTD 声明的详细信息在dtdName(),dtdPublicId() 和dtdSystemId() 中报告。
QXmlStreamReader::EntityReference9阅读器报告了一个无法解析的实体引用。引用名称在name() 中报告,替换文本在text() 中报告。
QXmlStreamReader::ProcessingInstruction10读者在processingInstructionTarget() 和processingInstructionData() 中报告了一条处理指令。

属性文档

namespaceProcessing : bool

该属性表示流阅读器的命名空间处理标志。

该属性控制流阅读器是否处理命名空间。如果启用,阅读器将处理命名空间,否则不处理。

默认情况下,命名空间处理已启用。

访问函数

bool namespaceProcessing() const
void setNamespaceProcessing(bool)

成员函数文档

QXmlStreamReader::QXmlStreamReader()

构造流阅读器。

另请参阅 setDevice() 和addData()。

[explicit] QXmlStreamReader::QXmlStreamReader(QAnyStringView data)

创建一个新的流阅读器,从data 读取数据。

注: 在 6.5 之前的 Qt 版本中,该构造函数被重载为QStringconst char*

另请参阅 addData(),clear() 和setDevice()。

[explicit] QXmlStreamReader::QXmlStreamReader(QIODevice *device)

创建一个新的流阅读器,从device 读取数据。

另请参阅 setDevice() 和clear() 。

[explicit] QXmlStreamReader::QXmlStreamReader(const QByteArray &data)

这是一个重载函数。

创建一个新的流读取器,从data 读取数据。

另请参阅 addData(),clear() 和setDevice()。

[noexcept] QXmlStreamReader::~QXmlStreamReader()

销毁阅读器。

void QXmlStreamReader::addData(QAnyStringView data)

添加更多data 供读者阅读。如果阅读器有device() ,则此函数不起作用。

注: 在 6.5 之前的 Qt XML 版本中,该函数被重载为QStringconst char*

另请参阅 readNext() 和clear()。

void QXmlStreamReader::addData(const QByteArray &data)

这是一个重载函数。

添加更多data 供读者阅读。如果阅读器有device() ,则该函数不起任何作用。

另请参阅 readNext() 和clear()。

void QXmlStreamReader::addExtraNamespaceDeclaration(const QXmlStreamNamespaceDeclaration &extraNamespaceDeclaration)

添加extraNamespaceDeclaration 。该声明对当前元素的子元素有效,如果在读取任何元素之前调用该函数,则对整个 XML 文档有效。

另请参阅 namespaceDeclarations()、addExtraNamespaceDeclarations() 和setNamespaceProcessing()。

void QXmlStreamReader::addExtraNamespaceDeclarations(const QXmlStreamNamespaceDeclarations &extraNamespaceDeclarations)

添加由extraNamespaceDeclarations 指定的声明向量。

另请参见 namespaceDeclarations() 和addExtraNamespaceDeclaration()。

bool QXmlStreamReader::atEnd() const

如果阅读器已读取到 XML 文档的末尾,或出现error() 并中止读取,则返回true 。否则,返回false

当 atEnd() 和hasError() 返回 true,而error() 返回PrematureEndOfDocumentError 时,表示 XML 到目前为止已经格式化,但还没有解析出完整的 XML 文档。如果 XML 是从QByteArray 读取的,则可以使用addData() 添加下一块 XML;如果 XML 是从QIODevice 读取的,则可以等待更多数据到来。无论哪种方式,一旦有更多数据可用,atEnd() 都会返回 false。

另请参阅 hasError()、error()、device() 和QIODevice::atEnd()。

QXmlStreamAttributes QXmlStreamReader::attributes() const

返回StartElement 的属性。

qint64 QXmlStreamReader::characterOffset() const

返回当前字符偏移量,从 0 开始。

另请参阅 lineNumber() 和columnNumber()。

void QXmlStreamReader::clear()

删除阅读器中的device() 或数据,并将其内部状态重置为初始状态。

另请参阅 addData() 。

qint64 QXmlStreamReader::columnNumber() const

返回当前列的编号,从 0 开始。

另请参阅 lineNumber() 和characterOffset()。

QIODevice *QXmlStreamReader::device() const

返回与QXmlStreamReader 关联的当前设备,如果没有分配设备,则返回nullptr

另请参阅 setDevice().

QStringView QXmlStreamReader::documentEncoding() const

如果tokenType() 是StartDocument ,该函数将返回 XML 声明中指定的编码字符串。否则返回空字符串。

QStringView QXmlStreamReader::documentVersion() const

如果tokenType() 是StartDocument ,该函数将返回 XML 声明中指定的版本字符串。否则返回空字符串。

QStringView QXmlStreamReader::dtdName() const

如果tokenType() 是DTD ,该函数将返回 DTD 的名称。否则返回空字符串。

QStringView QXmlStreamReader::dtdPublicId() const

如果tokenType() 是DTD ,该函数将返回 DTD 的公共标识符。否则返回空字符串。

QStringView QXmlStreamReader::dtdSystemId() const

如果tokenType() 是DTD ,该函数将返回 DTD 的系统标识符。否则返回空字符串。

QXmlStreamEntityDeclarations QXmlStreamReader::entityDeclarations() const

如果tokenType() 是DTD ,该函数将返回 DTD 的未解析(外部)实体声明。否则将返回一个空向量。

QXmlStreamEntityDeclarations 类被定义为QXmlStreamEntityDeclarationQList

int QXmlStreamReader::entityExpansionLimit() const

返回允许单个实体扩展的最大字符数。如果单个实体的扩展超过了给定的限制,文档将被视为不完整。

另请参阅 setEntityExpansionLimit

QXmlStreamEntityResolver *QXmlStreamReader::entityResolver() const

返回实体解析器,如果没有实体解析器,则返回nullptr

另请参见 setEntityResolver()。

QXmlStreamReader::Error QXmlStreamReader::error() const

返回当前错误的类型,如果没有错误发生,则返回NoError

另请参阅 errorString() 和raiseError()。

QString QXmlStreamReader::errorString() const

返回通过raiseError() 设置的错误信息。

另请参阅 error()、lineNumber()、columnNumber() 和characterOffset()。

bool QXmlStreamReader::hasError() const

如果发生错误,则返回true ,否则返回false

另请参阅 errorString() 和error()。

[since 6.6] bool QXmlStreamReader::hasStandaloneDeclaration() const

如果该文档有明确的独立声明,则返回true (可以是 "是 "或 "否");否则返回false

如果未解析 XML 声明,则返回false

此函数在 Qt 6.6 中引入。

另请参阅 isStandaloneDocument() 。

bool QXmlStreamReader::isCDATA() const

如果阅读器报告的字符来自 CDATA 部分,则返回true ;否则返回false

另请参阅 isCharacters() 和text()。

bool QXmlStreamReader::isCharacters() const

如果tokenType() 等于Characters ,则返回true ;否则返回false

另请参见 isWhitespace() 和isCDATA()。

bool QXmlStreamReader::isComment() const

如果tokenType() 等于Comment ,则返回true ;否则返回false

bool QXmlStreamReader::isDTD() const

如果tokenType() 等于DTD ,则返回true ;否则返回false

bool QXmlStreamReader::isEndDocument() const

如果tokenType() 等于EndDocument ,则返回true ;否则返回false

bool QXmlStreamReader::isEndElement() const

如果tokenType() 等于EndElement ,则返回true ;否则返回false

bool QXmlStreamReader::isEntityReference() const

如果tokenType() 等于EntityReference ,则返回true ;否则返回false

bool QXmlStreamReader::isProcessingInstruction() const

如果tokenType() 等于ProcessingInstruction ,则返回true ;否则返回false

bool QXmlStreamReader::isStandaloneDocument() const

如果该文档已在 XML 声明中独立声明,则返回true ;否则返回false

如果未解析 XML 声明,该函数将返回false

另请参见 hasStandaloneDeclaration()。

bool QXmlStreamReader::isStartDocument() const

如果tokenType() 等于StartDocument ,则返回true ;否则返回false

bool QXmlStreamReader::isStartElement() const

如果tokenType() 等于StartElement ,则返回true ;否则返回false

bool QXmlStreamReader::isWhitespace() const

如果阅读器报告的字符仅由空格组成,则返回true ;否则返回false

另请参阅 isCharacters() 和text()。

qint64 QXmlStreamReader::lineNumber() const

返回当前行号,从 1 开始。

另请参阅 columnNumber() 和characterOffset()。

QStringView QXmlStreamReader::name() const

返回StartElementEndElementEntityReference 的本地名称。

另请参阅 namespaceUri() 和qualifiedName()。

QXmlStreamNamespaceDeclarations QXmlStreamReader::namespaceDeclarations() const

如果tokenType() 是StartElement ,该函数将返回元素的命名空间声明。否则将返回一个空向量。

QXmlStreamNamespaceDeclarations 类被定义为QXmlStreamNamespaceDeclarationQList

另请参见 addExtraNamespaceDeclaration() 和addExtraNamespaceDeclarations()。

QStringView QXmlStreamReader::namespaceUri() const

返回StartElementEndElement 的命名空间 Uri。

另请参阅 name() 和qualifiedName()。

QXmlStreamNotationDeclarations QXmlStreamReader::notationDeclarations() const

如果tokenType() 是DTD ,该函数将返回 DTD 的符号声明。否则将返回一个空向量。

QXmlStreamNotationDeclarations 类被定义为QXmlStreamNotationDeclarationQList

QStringView QXmlStreamReader::prefix() const

返回StartElementEndElement 的前缀。

另请参阅 name() 和qualifiedName()。

QStringView QXmlStreamReader::processingInstructionData() const

返回ProcessingInstruction 的数据。

QStringView QXmlStreamReader::processingInstructionTarget() const

返回ProcessingInstruction 的目标值。

QStringView QXmlStreamReader::qualifiedName() const

返回StartElementEndElement 的限定名称;

限定名称是 XML 数据中元素的原始名称。它由命名空间前缀、冒号和元素的本地名称组成。由于命名空间前缀不是唯一的(相同的前缀可以指向不同的命名空间,不同的前缀也可以指向相同的命名空间),因此不应使用 qualifiedName(),而应使用解析后的namespaceUri() 和属性的本地name()。

另请参阅 name()、prefix() 和namespaceUri()。

void QXmlStreamReader::raiseError(const QString &message = QString())

引发带有可选错误message 的自定义错误。

另请参阅 error() 和errorString()。

QString QXmlStreamReader::readElementText(QXmlStreamReader::ReadElementTextBehaviour behaviour = ErrorOnUnexpectedElement)

在读取StartElement 时调用的便利函数。读取直到相应的EndElement ,并返回两者之间的所有文本。在不出错的情况下,调用该函数后的当前标记(见tokenType()) 为EndElement

该函数在读取CharactersEntityReference 标记时,会连接text() ,但会跳过ProcessingInstructionComment 。如果当前标记不是StartElement ,则返回空字符串。

behaviour 定义了在读取到EndElement 之前读取到其他内容时的情况。该函数可以包含子元素的文本(例如对 HTML 很有用),忽略子元素,或引发UnexpectedElementError 并返回到目前为止已读取的内容(默认)。

QXmlStreamReader::TokenType QXmlStreamReader::readNext()

读取下一个标记并返回其类型。

但有一个例外,即一旦 readNext() 报告了error() 之后,就无法继续读取 XML 流。然后,atEnd() 返回truehasError() 返回true ,本函数返回QXmlStreamReader::Invalid

例外情况是error() 返回PrematureEndOfDocumentError 。当到达一个格式良好的 XML 块的末尾,但该块并不代表一个完整的 XML 文档时,就会报告该错误。在这种情况下,当数据流从QByteArray 读取时,可以调用addData() 添加下一个 XML 块,或者当数据流从device() 读取时,可以等待更多数据到达,从而恢复解析。

另请参阅 tokenType() 和tokenString()。

bool QXmlStreamReader::readNextStartElement()

读取当前元素内的下一个起始元素。当读取到起始元素时,返回true 。当读取到结束元素或发生错误时,返回 false。

当前元素是与最近解析的起始元素相匹配的元素,尚未到达匹配的结束元素。当解析器解析到结束元素时,当前元素将成为父元素。

当您只关注 XML 元素的解析时,这是一个方便的函数。QXmlStream Bookmarks 示例中广泛使用了该函数。

另请参见 readNext().

void QXmlStreamReader::setDevice(QIODevice *device)

将当前设备设置为device 。设置设备会将数据流重置为初始状态。

另请参阅 device() 和clear()。

void QXmlStreamReader::setEntityExpansionLimit(int limit)

将允许单个实体扩展的最大字符数设置为limit 。如果单个实体的扩展超过了给定的限制,则文档将被视为不完整。

设置该限制是为了防止在加载未知 XML 文档时发生 DoS 攻击,因为递归实体扩展可能会耗尽所有可用内存。

此属性的默认值为 4096 个字符。

另请参见 entityExpansionLimit

void QXmlStreamReader::setEntityResolver(QXmlStreamEntityResolver *resolver)

使resolver 成为新的entityResolver() 。

流读取器拥有解析器的所有权。调用者有责任确保解析器在流阅读器对象的整个生命周期内有效,或直到设置了另一个解析器或nullptr

另请参见 entityResolver().

void QXmlStreamReader::skipCurrentElement()

读取到当前元素的末尾,跳过任何子节点。该函数适用于跳过未知元素。

当前元素是与最近解析的起始元素相匹配的元素,该元素尚未到达匹配的结束元素。当解析器解析到结束元素时,当前元素将成为父元素。

QStringView QXmlStreamReader::text() const

返回Characters,Comment,DTDEntityReference 的文本。

QString QXmlStreamReader::tokenString() const

以字符串形式返回阅读器的当前标记。

另请参阅 tokenType().

QXmlStreamReader::TokenType QXmlStreamReader::tokenType() const

返回当前标记的类型。

当前标记还可通过方便函数isStartDocument(),isEndDocument(),isStartElement(),isEndElement(),isCharacters(),isComment(),isDTD(),isEntityReference() 和isProcessingInstruction() 查询。

另请参见 tokenString()。

© 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.