QLowEnergyService 类

QLowEnergyService 类表示蓝牙低功耗设备上的单个服务。 更多...

头文件 #include <QLowEnergyService>
qmakeQT += bluetooth
继承 QObject

公共类型

(since 6.2) 枚举DiscoveryMode { FullDiscovery, SkipValueDiscovery }
枚举ServiceError { NoError, OperationError, CharacteristicReadError, CharacteristicWriteError, DescriptorReadError, …, UnknownError }
枚举ServiceState { InvalidService, RemoteService, RemoteServiceDiscovering, RemoteServiceDiscovered, LocalService, …, ServiceDiscovered }
枚举ServiceType { PrimaryService, IncludedService }
标志ServiceTypes
枚举WriteMode { WriteWithResponse, WriteWithoutResponse, WriteSigned }

公共函数

虚拟~QLowEnergyService()
QLowEnergyCharacteristiccharacteristic(const QBluetoothUuid &uuid) const
QList<QLowEnergyCharacteristic>characteristics() const
boolcontains(const QLowEnergyCharacteristic &characteristic) const
boolcontains(const QLowEnergyDescriptor &descriptor) const
voiddiscoverDetails(QLowEnergyService::DiscoveryMode mode = FullDiscovery)
QLowEnergyService::ServiceErrorerror() const
QList<QBluetoothUuid>includedServices() const
voidreadCharacteristic(const QLowEnergyCharacteristic &characteristic)
voidreadDescriptor(const QLowEnergyDescriptor &descriptor)
QStringserviceName() const
QBluetoothUuidserviceUuid() const
QLowEnergyService::ServiceStatestate() const
QLowEnergyService::ServiceTypestype() const
voidwriteCharacteristic(const QLowEnergyCharacteristic &characteristic, const QByteArray &newValue, QLowEnergyService::WriteMode mode = WriteWithResponse)
voidwriteDescriptor(const QLowEnergyDescriptor &descriptor, const QByteArray &newValue)

信号

voidcharacteristicChanged(const QLowEnergyCharacteristic &characteristic, const QByteArray &newValue)
voidcharacteristicRead(const QLowEnergyCharacteristic &characteristic, const QByteArray &value)
voidcharacteristicWritten(const QLowEnergyCharacteristic &characteristic, const QByteArray &newValue)
voiddescriptorRead(const QLowEnergyDescriptor &descriptor, const QByteArray &value)
voiddescriptorWritten(const QLowEnergyDescriptor &descriptor, const QByteArray &newValue)
(since 6.2) voiderrorOccurred(QLowEnergyService::ServiceError newError)
voidstateChanged(QLowEnergyService::ServiceState newState)

详细描述

QLowEnergyService 类提供了对低功耗蓝牙服务的详细信息的访问。该类简化了服务细节的发现和发布,允许读取和写入包含的数据,并对数据变更进行通知。

服务结构

一个低功耗蓝牙外围设备可以包含多个服务。相应地,每个服务可能包含更多的服务。该类代表外围设备中的一个服务,通过 QLowEnergyController::createServiceObject() 创建。 type() 函数指示该服务是顶级服务还是属于另一个服务的一部分。每个服务可以包含一个或多个特性,每个特性可以包含描述符。结果结构可能如下所示

Structure of a generic peripheral

特性是主要的信息载体。它有 value() 和 properties() 来描述值的访问权限。包含的描述符的一般目的是进一步定义特性的本质。例如,它可以指定值应该如何被解释,或者它是否可以通知值消费者关于值的变化。

服务交互

首次为服务对象创建实例之后,其详细信息尚未被发现。这表明其当前的 state() 为 DiscoveryRequired。只能检索到 serviceUuid() 和 serviceName()。

在其包含的服务、特性和描述符的发现是在调用 discoverDetails() 时触发的。在发现过程中,state() 从 DiscoveryRequired 通过 DiscoveringService 变为最终的 ServiceDiscovered 状态。这个过渡通过 stateChanged() 信号进行广播。一旦知道了详细信息,所有包含的特性、描述符和包含的服务都是已知的,可以被读取或写入。

属性和描述符的值可以通过分别使用QLowEnergyCharacteristicQLowEnergyDescriptor获取。然而,直接读取或写入这些属性需要服务对象。函数readCharacteristic()尝试重新读取特性的值。即使初始服务发现可能已获取一个值,但在特性值不断变化而没有提供任何通知的情况下,可能仍然需要进行此调用。一个例子是提供连续值的计时特性。如果读取尝试成功,则会发射信号characteristicRead()。读取值失败会触发CharacteristicReadError。函数writeCharacteristic()尝试将新值写入给定的特性。如果写入尝试成功,则发射信号characteristicWritten()。写入失败会触发CharacteristicWriteError。描述符的读取和写入遵循相同的模式。

会尽量读取或写入硬件上的描述符或特性的值。这意味着在读取和写入时通常忽略元信息,例如根据其元数据描述特性的只读特性,仍然可以调用writeCharacteristic()。生成的写入请求转发到连接的设备,设备负责响应可能无效的请求。在这种情况下,结果是返回设备错误响应时发射CharacteristicWriteError。如果无法将请求转发到远程设备,则设置OperationError。可能的原因包括将要写入的特性对象甚至不属于当前服务。总的来说,这两种类型的错误允许快速区分本地和远程错误情况。

所有请求都是基于先进先出原则进行序列化的。例如,在先前的写入请求完成之前,发射第二个写入请求将会延迟。

注意:目前,无法发送签名写入或可靠写入请求。

在某些情况下,外围设备会生成中央设备感兴趣接收的值更新。为了使特性支持此类通知,它必须有QLowEnergyCharacteristic::NotifyQLowEnergyCharacteristic::Indicate属性以及类型为QBluetoothUuid::DescriptorType::ClientCharacteristicConfiguration的描述符。如果满足这些条件,通知可以被启用,如下面的代码段所示

    //PreCondition: service details already discovered
    QLowEnergyCharacteristic batteryLevel = service->characteristic(
                QBluetoothUuid::CharacteristicType::BatteryLevel);
    if (!batteryLevel.isValid())
        return;

    QLowEnergyDescriptor notification = batteryLevel.descriptor(
                QBluetoothUuid::DescriptorType::ClientCharacteristicConfiguration);
    if (!notification.isValid())
        return;

    // establish hook into notifications
    connect(service, SIGNAL(characteristicChanged(QLowEnergyCharacteristic,QByteArray)),
            this, SLOT(characteristicChanged(QLowEnergyCharacteristic,QByteArray)));

    // enable notification
    service->writeDescriptor(notification, QByteArray::fromHex("0100"));

    // disable notification
    //service->writeDescriptor(notification, QByteArray::fromHex("0000"));

    // wait until descriptorWritten() signal is emitted
    // to confirm successful write

例子显示了一个电池等级特性,它在每次值变化时更新中央设备。通知通过characteristicChanged()信号提供。有关此机制的更多详细信息,请参阅蓝牙规范

服务数据共享

每个QLowEnergyService实例都与其服务中相同类型的其他QLowEnergyService实例共享其内部状态和信息。如果一个实例初始化了服务详细信息的发现,则所有剩余的实例将自动跟随。因此以下代码片段总是有效

    QLowEnergyService *first, *second;
    QLowEnergyController control(remoteDevice);
    control.connectToDevice();

    // waiting for connection

    first = control.createServiceObject(QBluetoothUuid::ServiceClassUuid::BatteryService);
    second = control.createServiceObject(QBluetoothUuid::ServiceClassUuid::BatteryService);
    Q_ASSERT(first->state() == QLowEnergyService::RemoteService);
    Q_ASSERT(first->state() == second->state());

    first->discoverDetails();

    Q_ASSERT(first->state() == QLowEnergyService::RemoteServiceDiscovering);
    Q_ASSERT(first->state() == second->state());

其他操作,如调用 readCharacteristic()、readDescriptor()、writeCharacteristic()、writeDescriptor() 或由于相关的 QLowEnergyController 与设备断开连接而使服务失效,都以相同的方式共享。

另请参阅 QLowEnergyControllerQLowEnergyCharacteristicQLowEnergyDescriptor

成员类型文档

[since 6.2] 枚举 QLowEnergyService::DiscoveryMode

此枚举列出服务发现模式。所有模式都会发现服务的特性和特性的描述符。模式的区别在于是否读取特性和描述符的值。

常量描述
QLowEnergyService::FullDiscovery0在完整发现期间,所有特性都会被发现。所有特性和描述符的值都会被读取。
QLowEnergyService::SkipValueDiscovery1在最小发现期间,所有特性都会被发现。不会读取特性和描述符的值。

此枚举自 Qt 6.2 起引入。

另请参阅 discoverDetails

枚举 QLowEnergyService::ServiceError

此枚举描述了服务存在的所有可能的错误条件。函数 error() 返回最后发生的错误。

常量描述
QLowEnergyService::NoError0未发生错误。
QLowEnergyService::OperationError1在服务尚未就绪的情况下尝试执行操作。例如,可能是尝试在服务尚未进入 ServiceDiscovered 状态() 并由于与外围设备连接丢失而导致服务无效时写入操作。
QLowEnergyService::CharacteristicReadError (since Qt 5.5)5读取特性值尝试失败。例如,它可能在调用 readCharacteristic() 时触发。
QLowEnergyService::CharacteristicWriteError2尝试写入特性的新值失败。例如,它可能在尝试写入只读特性时触发。
QLowEnergyService::DescriptorReadError (since Qt 5.5)6读取描述符值尝试失败。例如,它可能在调用 readDescriptor() 时触发。
QLowEnergyService::DescriptorWriteError3尝试写入描述符的新值失败。例如,它可能在尝试写入只读描述符时触发。
QLowEnergyService::UnknownError (since Qt 5.5)4与该服务交互时发生未知错误。

枚举 QLowEnergyService::ServiceState

此枚举描述了服务对象的 state 状态。

常量描述
QLowEnergyService::InvalidService0当服务失去与底层设备的连接时,服务可能会变得无效。即使连接可能会丢失,它仍然保留其最后的信息。即使重新建立了与设备的连接,无效的服务也不再变为有效。
QLowEnergyService::RemoteService1服务详细信息尚未通过调用discoverDetails()发现。唯一可靠的信息是其serviceUuid()和serviceName()。
QLowEnergyService::RemoteServiceDiscovering2正在发现服务详细信息。
QLowEnergyService::RemoteServiceDiscovered3已发现服务详细信息。
QLowEnergyService::LocalService (自 Qt 5.7)4服务与外围角色中的控制器对象关联。此类服务对象不会改变其状态。
QLowEnergyService::DiscoveryRequiredRemoteService已弃用。已被重命名为RemoteService。
QLowEnergyService::DiscoveringServiceRemoteServiceDiscovering已弃用。已被重命名为RemoteServiceDiscovering。
QLowEnergyService::ServiceDiscoveredRemoteServiceDiscovered已弃用。已被重命名为RemoteServiceDiscovered。

枚举 QLowEnergyService::ServiceType
标志 QLowEnergyService::ServiceTypes

此枚举描述了服务的类型。

常量描述
QLowEnergyService::PrimaryService0x0001该服务是顶级/主要服务。如果未设置此类型标志,则该服务被视为次要服务。每个服务可以被另一个服务包含,这由IncludeService表示。
QLowEnergyService::IncludedService0x0002服务被另一个服务包含。在某些平台上,此标志只能在包含当前服务的其他服务被发现后确定。

ServiceTypes 类型是 ServiceType 的 typedef,用于存储 ServiceType 值的 OR 组合。

枚举 QLowEnergyService::WriteMode

此枚举描述了写入特征值时要使用的模式。特征通过其属性广告其支持的写入模式。

常量描述
QLowEnergyService::WriteWithResponse0如果使用此模式写入特征,外围设备应发送写入确认。如果操作成功,确认将通过characteristicWritten() 信号发出。否则将发出CharacteristicWriteError。必须将特征的QLowEnergyCharacteristic::Write属性设置为支持此写入模式。
QLowEnergyService::WriteWithoutResponse1如果使用此模式写入特征,远程外围设备不应发送写入确认。无法确定操作的成功,有效负载长度不得超过 20 字节。特征必须已设置QLowEnergyCharacteristic::WriteNoResponse属性以支持此写入模式。它的优点是写入操作更快,因为它可能发生在与设备交互之间。
QLowEnergyService::WriteSigned (自 Qt 5.7)2如果使用此模式写入特征,远程外围设备不应发送写入确认。无法确定操作的成功,有效负载长度不得超过 8 字节。必须在两个设备之间存在连接,并且连接不得加密。特征必须已设置QLowEnergyCharacteristic::WriteSigned属性以支持此写入模式。此值目前仅在 Android 上以及 Linux 上(BlueZ 5 和内核版本 3.7 或更高版)受支持。

成员函数文档

[虚拟 noexcept] QLowEnergyService::~QLowEnergyService()

销毁QLowEnergyService实例。

QLowEnergyCharacteristic QLowEnergyService::characteristic(const QBluetoothUuid &uuid) const

返回与 uuid 匹配的特性;否则返回无效的特性。

返回的特性无效,如果这个服务实例的 discoverDetails() 尚未调用,或者没有与 uuid 匹配的特性。

另请参阅 特性

[信号] void QLowEnergyService::characteristicChanged(const QLowEnergyCharacteristic &characteristic, const QByteArray &newValue)

如果相关控制器对象处于 中心 角色,则在 characteristic 的值由于外围/设备侧的事件而更改时发出此信号。在这种情况下,信号的发出意味着必须在外围事件更改之前通过特性的 客户端特性配置 描述符激活更改通知。有关如何实现的更多详细信息,请参见 以上内容

如果控制器处于 外围 角色,即服务对象是通过 QLowEnergyController::addService 创建的,则当 GATT 客户端使用写入请求或命令写入特性的值时发出信号。

newValue 参数包含 characteristic 的更新值。

[信号] void QLowEnergyService::characteristicRead(const QLowEnergyCharacteristic &characteristic, const QByteArray &value)

当成功地返回 characteristic 的读取请求时,会发出此信号。该信号可能是由调用 characteristicRead() 触发的。如果读取操作不成功,将发出使用 CharacteristicReadError 标志的 errorOccurred() 信号。

注意:此信号仅针对与中心角色相关的用例发出。

另请参阅 readCharacteristic

[信号] void QLowEnergyService::characteristicWritten(const QLowEnergyCharacteristic &characteristic, const QByteArray &newValue)

当成功地更改 characteristic 的值到 newValue 时发出此信号。更改必须是通过调用 writeCharacteristic 触发的。如果写入操作不成功,则通过使用 CharacteristicWriteError 标志的 errorOccurred() 信号发出。

接收到已写入信号的接收可以视为目标设备已接收到要写入的值并报告写入请求的状态的标志。

注意:writeCharacteristic() 使用 WriteWithoutResponse 模式下调用时,从不发出此信号和 errorOccurred()。

注意:此信号仅针对与中心角色相关的用例发出。

另请参阅 writeCharacteristic

QListQLowEnergyCharacteristic QLowEnergyService::characteristics() const

返回与此 <인스턴스> 相关联的所有属性。

如果此服务实例的 discoverDetails() 尚未调出或不存在已知的属性,则返回的列表是空的。

另请参阅characteristic(),state() 和 discoverDetails()。

bool QLowEnergyService::contains(const QLowEnergyCharacteristic &;《characteristic》)const

如果 characteristic 属于此服务,则返回 true;否则返回 false

如果 characteristics() 包含 characteristic,则属性属于服务。

bool QLowEnergyService::contains(const QLowEnergyDescriptor &;《descriptor》)const

如果 descriptor 属于此服务,则返回 true;否则返回 false

[信号] void QLowEnergyService::descriptorRead(const QLowEnergyDescriptor &;《descriptor》),const QByteArray &;《value》)》)

在成功返回 descriptorvalue 时会发出此信号。信号可能由调用 descriptorRead() 触发。如果读取操作不成功,会使用 errorOccurred() 信号通过 DescriptorReadError 标志发出。

注意:此信号仅针对与中心角色相关的用例发出。

另请参阅readDescriptor()。

[信号] void QLowEnergyService::descriptorWritten(const QLowEnergyDescriptor &;《descriptor》)),const QByteArray &;《newValue》)》)

descriptor 的值成功更改为 newValue 时会发出此信号。如果关联的控制器对象处于 central 角色的话,更改必须是由调用 writeDescriptor() 触发的。否则,该信号是来自 GATT 客户端到相应描述符的写入请求或命令的结果。

另请参阅writeDescriptor()。

void QLowEnergyService::discoverDetails(QLowEnergyService::DiscoveryMode mode = FullDiscovery)

启动对服务包含的服务、属性及其关联描述符的发现。

发现过程通过 stateChanged() 信号表示。创建后,服务处于 DiscoveryRequired 状态。当调用 discoverDetails() 时,它将转换为 DiscoveringService。完成详细发现后,它会转换为 ServiceDiscovered 状态。在每个转换过程中,都会发射 stateChanged() 信号。根据参数 mode,会执行 FullDiscoverySkipValueDiscovery。无论如何,所有服务和特征都将被发现。一个 FullDiscovery 会继续并读取所有特征值和描述符。一个 SkipValueDiscovery 不会读取特征值和描述符。一个 SkipValueDiscovery 有两个优点。首先,它更快。其次,它可以绕过一些设备中的错误,这些设备错误地声明某些特征或描述符为可读,但仍然不允许它们的读取。这可能会触发不可预测的行为。在进行 SkipValueDiscovery 之后,必须调用 readCharacteristic() / readDescriptor(),并等待它们成功完成,然后再访问特征或描述符的值。

参数 mode 是从 Qt 6.2 中引入的。

另请参阅 state()。

QLowEnergyService::ServiceError QLowEnergyService::error() const

返回最后发生的错误或 NoError

[信号,自 6.2 版起] void QLowEnergyService::errorOccurred(QLowEnergyService::ServiceError newError)

此信号在发生错误时发出。newError 参数描述了发生的错误。

此函数是从 Qt 6.2 版本开始引入的。

QList<QBluetoothUuid> QLowEnergyService::includedServices() const

返回当前服务包含的所有服务的 UUID。

如果此服务实例的 discoverDetails() 尚未调出或不存在已知的属性,则返回的列表是空的。

一个包含的服务可能还包含另一个服务。这些二级包含必须通过它们相关的一级 QLowEnergyService 实例来获取。技术上,这可能会创建循环依赖。

应使用 QLowEnergyController::createServiceObject() 来获取每个 UUID 的服务实例。

另请参阅 createServiceObject

void QLowEnergyService::readCharacteristic(const QLowEnergyCharacteristic &characteristic)

读取 characteristic 的值。如果操作成功,则发射 characteristicRead() 信号;否则设置 CharacteristicReadError。一般来说,如果其 QLowEnergyCharacteristic::Read 属性被设置,则一个 characteristic 是可读的。

所有针对同一远程设备的描述符和特征请求都是序列化的。在同时发出多个请求时,会使用队列。队列不会消除重复的读取特征请求。

如果服务处于ServiceDiscovered状态且属于该服务,则可以读取特征。如果这些条件中的任何一个不真实,则设置QLowEnergyService::OperationError

注意:调用此函数,即使QLowEnergyCharacteristic::properties()报告一个不可读属性,也始终尝试在硬件上读取特征的值。如果硬件返回错误,则设置CharacteristicReadError

另请参阅characteristicRead() 和 writeCharacteristic

void QLowEnergyService::readDescriptor(const QLowEnergyDescriptor &descriptor)

读取descriptor的值。如果操作成功,则发出descriptorRead()信号;否则设置DescriptorReadError

所有针对同一远程设备的描述符和特征请求都是序列化的。在同时发出多个请求时,会使用队列。队列不会消除重复的读取描述符请求。

只有当服务处于ServiceDiscovered状态且描述符属于该服务时,才能读取描述符。如果这些条件中的任何一个不真实,则设置QLowEnergyService::OperationError

另请参阅descriptorRead() 和 writeDescriptor

QString QLowEnergyService::serviceName() const

返回服务名称;否则返回空字符串。

返回的名称只能在serviceUuid()是标准的UUID时检索。

QBluetoothUuid QLowEnergyService::serviceUuid() const

返回服务的UUID;否则返回null UUID。

QLowEnergyService::ServiceState QLowEnergyService::state() const

返回服务的当前状态。

如果设备的服务是第一次实例化,则对象的当前状态是DiscoveryRequired。所有指向外围设备上同一服务的服务对象的当前状态始终相等。这是因为内部对象数据共享的性质导致的。因此,任何在第一个实例之后创建的服务对象实例的状态都将与已有实例的状态相同。

如果QLowEnergyController从远程设备断开连接,服务将无效。无效的服务保留断开事件时的内部状态。这意味着一旦发现服务详情,甚至可以从无效的服务中检索出来。这允许在设备建立连接、检索服务详情后,设备立即断开连接,以允许下一个设备连接到外围设备。

然而,在正常情况下,连接应该保持,以避免重复发现服务和它们的详细信息。发现可能需要一段时间,客户端可以订阅持续的更改通知。

参见:stateChanged()。

[信号] void QLowEnergyService::stateChanged(QLowEnergyService::ServiceState newState)

当服务状态改变时,会发出此信号。可以通过 state() 函数获取 newState

另请参阅 state()。

QLowEnergyService::ServiceTypes QLowEnergyService::type() const

返回服务的类型。

注意:无法依赖此类型属性直到服务达到 ServiceDiscovered 状态。此字段使用 PrimaryService 进行初始化。

注意:在 Android 上,无法确定服务是主服务或辅助服务。因此,所有服务都设置了 PrimaryService 标志。

void QLowEnergyService::writeCharacteristic(const QLowEnergyCharacteristic &characteristic, const QByteArray &newValue, QLowEnergyService::WriteMode mode = WriteWithResponse)

newValue 作为 characteristic 的值写入。确切的语义取决于关联控制器对象的当前角色。

中心角色

此调用会产生向远程外围设备发送的写入请求或命令。如果操作成功,会发出 characteristicWritten() 信号;否则会设置 CharacteristicWriteError。调用此函数不会触发 characteristicChanged() 信号,除非外围设备在当前写入请求后再次更改值。

mode 参数确定远程设备是否应该发送写入确认。即将写入的 characteristic 必须支持相关写入模式。特性支持的写入模式由其 QLowEnergyCharacteristic::WriteQLowEnergyCharacteristic::WriteNoResponse 属性指示。

对同一远程设备的所有描述符和特性写入请求都是序列化的。在同时发出多个写入请求时,会使用队列。队列不会消除针对同一特性的重复写入请求。例如,如果相同描述符先设置为值 A,然后立即设置为值 B,则两个写入请求会按顺序执行。

注意:目前,无法使用蓝牙规范定义的签名或可靠写入。

只有当此服务处于 ServiceDiscovered 状态且属于该服务时,才可以写入特性。如果这些条件中有一个不成立,则设置 QLowEnergyService::OperationError

注意:即使 QLowEnergyCharacteristic::properties() 报告了一个不可写入的属性,调用此函数也会尝试写入硬件。同样,尽管特性可能只支持 WriteWithResponse,也会向硬件发送 WriteWithoutResponse。如果硬件返回错误,则会设置 CharacteristicWriteError

外围角色

此调用会导致特性值在本地数据库中更新。

如果一个客户端当前已连接并且启用了对特征的通告或指示,则将发送相应信息。如果一个设备已启用了对特征的通告或指示,但该设备当前未连接,但与本地设备之间存在配对关系,则通告或指示将在下次重新连接时发送。

如果对特征值的长度有约束,且新值 newValue 不符合该约束,则行为将未定义。

注意: 在外围模式中忽略 mode 参数。

另请参阅QLowEnergyService::characteristicWritten() 和 QLowEnergyService::readCharacteristic

void QLowEnergyService::writeDescriptor(const QLowEnergyDescriptor &descriptor, const QByteArray &newValue)

newValue 写为 descriptor 的值。确切语意取决于相关控制器对象所扮演的角色。

中心角色

调用此函数将导致向远程设备发出写请求。如果操作成功,则发出 descriptorWritten() 信号;否则发出 DescriptorWriteError 信号。

对同一远程设备的所有描述符和特性请求都是串行的。在同时发出多个写请求时使用队列。队列不会消除对同一描述符重复的写请求。例如,如果相同的描述符首先设置为值 A,然后立即设置为 B,则两个写请求将按给定顺序执行。

只有在服务处于 ServiceDiscovered 状态、属于该服务的情况下,才可以写入描述符。如果这些条件之一不成立,则设置 QLowEnergyService::OperationError

外围角色

将值写入本地服务数据库。如果 newValue 的内容对于 descriptor 无效,则行为将是未定义的。

另请参阅descriptorWritten() 和 readDescriptor

© 2024 Qt 公司有限。包含在此的文档贡献是各自所有者的版权。本提供的文档是根据自由软件基金会发布的 GNU 自由文档许可证版本 1.3 的条款许可的。Qt 以及相关的标志是芬兰的 Qt 公司及其在全球的其他国家和地区的商标。所有其他商标均为其各自所有者的财产。