Qt für VxWorks
Kontaktieren Sie The Qt Company für weitere Informationen: https://www.qt.io/contact-us/
Qt für VxWorks-Lizenzierung
Qt für VxWorks ist unter der Qt for Device Creation Professional (DCP) Lizenz erhältlich. Weitere Informationen finden Sie unter Qt-Preise.
Unterstützte Architekturen und VxWorks-Versionen
Qt 6.8 ist auf VxWorks 24.03 verifiziert.
Unterstützte Architekturen:
- ARM-v7 - getestet auf BD-SL-i.MX6. Verwendetes BSP: fsl_imx6
- x86_64-getestet auf Intel NUC6i3SYH. Verwendetes BSP: itl_generic
Wenn Sie an späteren Qt-Versionen interessiert sind, wenden Sie sich bitte an Qt Professional Services.
Anforderungen für VxWorks
Qt Widgets Anwendungen
- POSIX-Unterstützung
- C++17-Unterstützung
Qt Quick 2 Anwendungen
Alle Funktionen, die für Qt Widgets Anwendungen erforderlich sind, und zusätzlich die folgenden:
- GPU-Gerät (GPUDEV) für OpenGL ES 2.0
Unterstützte Module
Die meisten wesentlichen Qt-Module und einige Zusatzmodule werden unterstützt.
Unterstützte wesentliche Module
Qt-Modul | Unterstützte Funktionen | Hinweise |
---|---|---|
Qt Core | Keine Unterstützung für QProcess. QLocalSocket und QLocalServer unterstützen nur SOCK_SEQPACKET. | |
Qt GUI | ||
Qt Network | ||
Qt Qml | ||
Qt Quick | ||
Qt Quick Controls | ||
Qt Quick Dialogs | ||
Qt Quick Layouts | ||
Qt Quick Test | ||
Qt Test | ||
Qt Widgets |
Unterstützte Add-Ons
Hinweis: Sie können nicht unterstützte oder nicht verwendete Module explizit von der Erstellung ausschließen, indem Sie die Option -skip <module> verwenden, wenn Sie das configure-Tool ausführen.
Plattform-Hinweise
Mit der Veröffentlichung von Qt 5.0 enthält Qt keine eigene Implementierung des Fenstersystems mehr: QWS ist keine unterstützte Plattform mehr. Für Single-Process-Anwendungen ist die Qt Platform Abstraction eine bessere Lösung.
Es gibt ein Plugin, das auf VxWorks verwendbar ist: EGLFS. Die Verfügbarkeit dieses Plugins hängt von der Konfiguration von Qt ab.
Konfigurieren für ein bestimmtes Gerät
Bereiten Sie Ihre Umgebung vor, indem Sie das VxWorks SDK installieren und eine WindRiver-Lizenz erwerben, die vom Installationsprogramm und zum Erstellen von VxWorks-Images benötigt wird. Suchen Sie nach dem entsprechenden Installationsprogramm unter {https://gallery.windriver.com/portal/products}.
Die Erstellung von Qt für ein bestimmtes Gerät erfordert eine Qt 6-Installation für den Kompilierungshost, eine Toolchain und eine Sysroot. Zusätzlich benötigen einige Geräte herstellerspezifischen Anpassungscode für EGL und OpenGL 2.0 Unterstützung.
VxWorks Image Anforderungen
Qt für VxWorks erfordert bestimmte VxWorks-Image-Bundles und -Komponenten, die in die Basissoftware eingebettet werden müssen, damit Qt korrekt kompiliert und funktioniert. Die Liste ist keineswegs vollständig, da sie von den Hardware-, Software- und Systemanforderungen Ihres Projekts abhängt. Die folgende Tabelle enthält jedoch diejenigen, die für das Funktionieren bestimmter Funktionen (einschließlich Touchscreen-Unterstützung) zwingend erforderlich sind. Beachten Sie auch, dass sich diese mit den verschiedenen VxWorks-Versionen ändern können.
Beispiel einer VSB-Konfiguration für die BSPs fsl_imx6 und itl_generic
Sie müssen die folgenden Features zu VSB hinzufügen, damit Qt richtig funktioniert. Für weitere Details lesen Sie bitte die WindRiver VxWorks Dokumentation.
Merkmal | Anmerkungen |
---|---|
DSI_DSI_KERNEL | |
IPNET_COREIP | |
IPNET_DHCPC | |
SDMMC_DEVICE | |
SDMMC_HOST | |
SDMMC_SDHC | |
SDMMC_STORAGE | |
SERVICE_UN | |
SOCKET | |
USB_EHCI | |
USB_KEYBOARD | |
USB_MOUSE | |
USB_STORAGE | |
USB_TOUCHSCREEN | |
EVDEV | |
EVDEV_LIB | |
EVDEV_TI_TSC2004_TS | |
EVDEV_EETI_EXC7200_TS | |
AUDIO | |
GPUDEV_FSLVIVGPU | fsl_imx6 spezifisch |
HASH | |
OPENSSL | |
RANDOM_ENTROPY_INJECT | |
IPNET_SSH | |
USER_MANAGEMENT | |
ICU | |
DRM | itl_generic spezifisch |
ITLI915 | itl_generisch spezifisch |
LIBDRM | itl_generisch spezifisch |
MESA | itl_generisch spezifisch |
Die folgenden Konfigurationsvariablen werden implizit hinzugefügt und Sie müssen sie entfernen:
Variable | Anmerkungen |
---|---|
_WRS_CONFIG_EVDEV_OPTIMIZED_MODE | |
_WRS_CONFIG_EVDEV_DISPLAY_POINT_TRANSLATE | |
_WRS_CONFIG_MESA_MANGLE | itl_generisch spezifisch |
Sie müssen die folgenden Variablen in der Konfiguration hinzufügen:
Variable | Wert | Anmerkungen |
---|---|---|
_WRS_CONFIG_RTP_SSP | y | |
_WRS_CONFIG_RTP_STACK_PROTECTOR | y | |
_WRS_CONFIG_MESA_GPUDEV_INTEL_GEN90 | y | itl_generic spezifisch |
_WRS_CONFIG_EVDEV_COMPATIBLE_MODE | y | Wird benötigt, damit Qt richtig mit einem Touchscreen funktioniert. |
Beispiel VIP Konfiguration für fsl_imx6 und itl_generic BSPs
Für weitere Details lesen Sie bitte die WindRiver VxWorks Dokumentation.
Bündel | Hinweise |
---|---|
BUNDLE_POSIX | Dieses Bundle ist notwendig für die Kompatibilität mit POSIX-bezogenen Funktionalitäten, die Qt benötigt. |
BUNDLE_RTP_DEPLOY | |
BUNDLE_RTP_DEVELOP | |
BUNDLE_STANDALONE_SHELL |
Komponente | Hinweise |
---|---|
INCLUDE_TMP_DIR INCLUDE_RAM_DISK_FORMAT_HRFS | Die Einbindung dieser beiden Komponenten ist notwendig, wenn Sie QTemporaryFile verwenden möchten. Beachten Sie, dass Sie auch in Betracht ziehen sollten, TMP_DIR_SIZE auf einen geeigneten Wert zu setzen. |
DRV_AUDIO_FSL_SSI | |
DRV_AUDIO_FSL_SGTL5000 | |
DRV_FSL_SDHC_CTRL | |
DRV_IMX_SDHC_CTRL | |
INCLUDE_EHCI_INIT | |
INCLUDE_FSL_IMX6Q_SABRELITE | |
DRV_MMCSTORAGE_CARD | |
DRV_SDSTORAGE_CARD | |
INCLUDE_AUDIO_LIB_CORE | |
INCLUDE_AUDIO_LIB_WAV | |
INCLUDE_CUSTOM_ENTROPY_ADD | |
INCLUDE_DEBUG_AGENT_START | |
INCLUDE_DEFAULT_TIMEZONE | |
INCLUDE_DISK_UTIL | |
INCLUDE_DOSFS | |
INCLUDE_DSAPARAM_CMD | |
INCLUDE_END | |
INCLUDE_EVDEV_LIB_CORE | |
INCLUDE_EVDEV_LIB_KBD | |
INCLUDE_EVDEV_LIB_KBD_MAP_US | |
INCLUDE_EVDEV_LIB_PTR | |
INCLUDE_EVDEV_LIB_TS | |
INCLUDE_GENDSA_CMD | |
INCLUDE_GENRSA_CMD | |
INCLUDE_GETADDRINFO | |
INCLUDE_GETNAMEINFO | |
INCLUDE_HRFS | |
INCLUDE_HRFS_ACCESS_TIMESTAMP | |
INCLUDE_HRFS_FORMAT | |
INCLUDE_HRFS_HISPEED_WRITE_MODE | |
INCLUDE_IFCONFIG | |
INCLUDE_IO_REALPATH | Diese Komponente wird benötigt, um die Verwendung der realpath-Funktion zu ermöglichen, die für QFileInfo |
INCLUDE_IPATTACH | |
INCLUDE_IPCOM_SYSLOGD_CMD | |
INCLUDE_IPCOM_SYSVAR_CMD | |
INCLUDE_IPCOM_USE_RAM_DISK | |
INCLUDE_IPCOM_USE_TIME_CMD | |
INCLUDE_IPDHCPC | |
INCLUDE_IPDNSC | |
INCLUDE_IPD_CMD | |
INCLUDE_IPFTPC | |
INCLUDE_IPFTP_CMD | |
INCLUDE_IPIFCONFIG_CMD | |
INCLUDE_IPNETSTAT_CMD | |
INCLUDE_IPNSLOOKUP_CMD | |
INCLUDE_IPPING_CMD | |
INCLUDE_IPROUTE_CMD | |
INCLUDE_IPTRACE_ROUTE_CMD | |
INCLUDE_IPWRAP_GETHOSTBYADDR | |
INCLUDE_IPWRAP_GETHOSTBYNAME | |
INCLUDE_IPWRAP_GETNAMEINFO | |
INCLUDE_IPWRAP_IFNAME | |
INCLUDE_IPWRAP_ROUTECMD | |
INCLUDE_MMAP | |
INCLUDE_PING | |
INCLUDE_PIPES | |
INCLUDE_POSIX_MAPPED_FILES | |
INCLUDE_POSIX_PIPES | |
INCLUDE_POSIX_PTHREAD_SCHEDULER | |
INCLUDE_POSIX_SHM | |
INCLUDE_RAM_DISK | |
INCLUDE_RAM_DISK_FORMAT_HRFS | |
INCLUDE_RANDOM_NUM_GEN | |
INCLUDE_ROMFS | |
INCLUDE_ROUTECMD | |
INCLUDE_SC_PIPE | |
INCLUDE_SC_POSIX_PIPE | |
INCLUDE_SD_BUS | |
INCLUDE_SECURITY | |
INCLUDE_SEC_KEY_STORE_CMD | |
INCLUDE_SHELL | |
INCLUDE_SSH | |
INCLUDE_STANDALONE_SYM_TBL | |
INCLUDE_STARTUP_SCRIPT | |
INCLUDE_TMP_DIR | |
INCLUDE_UN_COMP | |
INCLUDE_USB_GEN2_KEYBOARD | |
INCLUDE_USB_GEN2_MOUSE | |
INCLUDE_USB_GEN2_STORAGE_INIT | |
INCLUDE_USB_TOUCH_SCREEN | |
INCLUDE_USB_TOUCH_SCREEN_INIT | |
INCLUDE_USER_DATABASE | |
INCLUDE_USER_IDENTIFICATION | |
INCLUDE_VRFS | |
INCLUDE_VXBUS_SHOW | |
DRV_TOUCH_SCREEN_TI_TSC2004 | |
DRV_TOUCH_SCREEN_EETI_EXC7200 | |
INCLUDE_FBDEV_FSLIPU_0 | fsl_imx6 spezifisch |
INCLUDE_FBDEV_SPLASH | |
INCLUDE_GPUDEV_FSLVIV_API | fsl_imx6 spezifisch |
INCLUDE_GPUDEV_FSLVIV_API_INIT | fsl_imx6 spezifisch |
INCLUDE_GPUDEV_ITLGMC_2 | itl_generisch spezifisch |
INCLUDE_I915 | itl_generisch spezifisch |
INCLUDE_MESA_FBDEV | itl_generisch spezifisch |
INCLUDE_MESA_GPUDEV_DRI | itl_generisch spezifisch |
INCLUDE_MESA_GPUDEV_DRI_I965 | itl_generisch spezifisch |
Die folgenden Komponenten werden implizit hinzugefügt und Sie müssen sie entfernen:
Ebene | Anmerkungen |
---|---|
INCLUDE_FTP | |
INCLUDE_SHELL_SECURITY |
VIP-Parameter
Sie müssen die folgenden Parameter hinzufügen, damit Qt unter VxWorks korrekt läuft:
Parameter | Beispielwert | Hinweise |
---|---|---|
SEC_VAULT_KEY_ENCRYPTING_PW | '"vxTarget"' | Beispielwert |
UDB_STORAGE_PATH | '"/ram/vxUserDB.txt"' | Beispielwert |
UDB_HASH_KEY | '"123456789"' | Beispielwert |
UDB_HASH_KEY_LEN | 9 | Beispielwert, siehe oben |
FSLVIV_RTP_COMMAND_BUFFER_QUEUE | 32 | Für 'arm' Architektur |
SYS_CLK_RATE | 100 | |
RTP_PTHREAD_STACK_SIZE_DEFAULT | 262144 | Erforderlich, damit die qtquick3d-Beispiele funktionieren. Kann mit der Umgebungsvariablen PTHREAD_STACK_SIZE_DEFAULT überschrieben werden. |
TMP_DIR_SIZE | 614400 | Mindestwert für das Bestehen von Qt internen Tests |
NUM_FILES | 300 | |
RTP_FD_NUM_MAX | 300 | |
HRFS_DEFAULT_MAX_FILES | 300 | |
ITLGMC_FBDEV_RESOLUTION_2 | '"1024x768-32"' | Beispielwert für den Xenarc 706TSA Touchscreen, der über HDMI angeschlossen ist. |
Erstellen von Qt 6 für VxWorks
Erstellung von Qt 6 für Host
Beim Cross-Build von Qt 6 für VxWorks ist es am besten, Host-Tools zu verwenden, die denselben Quellcode wie Cross-Build verwenden. Dies erfordert, dass man zuerst Qt 6 für den Host erstellt, aber nur mit einer begrenzten Anzahl von Submodulen:
- qtbase
- qtdeclarative
- qtquick3d
- qtshadertools
Stellen Sie sicher, dass Sie alle notwendigen Voraussetzungen für die Erstellung von Qt 6 für den Host haben. Prüfen Sie die Details in Erstellen von Qt-Quellen.
Ausführen des Configure-Skripts
Die Befehle zum Konfigurieren, Bauen und Installieren von Qt 6 für den Host sind die folgenden:
./configure \ -cmake-generator "Ninja" \ -extprefix <path/to/Qt6/host/installation/dir> \ -submodules qtbase,qtdeclarative,qtquick3d,qtshadertools \ -nomake tests \ -nomake examples \ -- \ -B <host/build/directory> cd <host/build/directory> ninja ninja install
Diese Befehle installieren Qt 6 für den Host in <path_to_Qt 6_host_installation_dir>
.
Erstellen von Qt 6 für das Zielsystem
Einrichten der Build-Umgebung
Bevor Sie configure ausführen und Qt 6 bauen, müssen Sie die VxWorks Development Shell in der Eingabeaufforderung öffnen.
- Linux:
cd <VxWorks installation directory> ./wrenv.sh -p vxworks export WIND_CC_SYSROOT=<path to VxWorks VSB directory>
- Windows:
cd <VxWorks installation directory> wrenv -p vxworks export WIND_CC_SYSROOT=<path to VxWorks VSB directory>
Vorbereiten der benutzerdefinierten CMake-Toolchain-Datei
Um Grafikbibliotheken aus dem BSP einzubinden, müssen Sie zunächst eine CMake-Toolchain-Datei erstellen. Ein Beispiel für eine CMake-Toolchain-Datei für ein BD-SL-i.MX6-Gerät:
# Copyright (C) 2024 The Qt Company Ltd. # SPDX-License-Identifier: BSD-3-Clause if(QT_VXWORKS_TOOLCHAIN_FILE) set(_original_toolchain_file "${QT_VXWORKS_TOOLCHAIN_FILE}") elseif(DEFINED ENV{QT_VXWORKS_TOOLCHAIN_FILE}) set(_original_toolchain_file "$ENV{QT_VXWORKS_TOOLCHAIN_FILE}") else() message(FATAL_ERROR "QT_VXWORKS_TOOLCHAIN_FILE is not set.") endif() if(NOT EXISTS "${_original_toolchain_file}") message(FATAL_ERORR "${_original_toolchain_file} doesn't exists.") endif() include("${_original_toolchain_file}") unset(_original_toolchain_file) list(APPEND CMAKE_TRY_COMPILE_PLATFORM_VARIABLES QT_VXWORKS_TOOLCHAIN_FILE) set(_common_lib_path "${CMAKE_SYSROOT}/usr/lib/common") set(EGL_INCLUDE_DIR ${CMAKE_SYSROOT}/usr/h/public CACHE PATH "Path to EGL include directory" FORCE) set(EGL_LIBRARY ${_common_lib_path}/libgfxFslVivEGL.so CACHE PATH "Path to EGL lib" FORCE) set(GLESv2_INCLUDE_DIR ${CMAKE_SYSROOT}/usr/h/public CACHE PATH "Path to GLES include directory" FORCE) set(GLESv2_LIBRARY ${_common_lib_path}/libgfxFslVivGLESv2.so CACHE PATH "Path to GLES lib" FORCE) set(VxWorksPlatformGraphics_DEFINES "-D_FSLVIV") set(VxWorksPlatformGraphics_LIBRARIES_PACK "${_common_lib_path}/libgfxFslVivGAL.so" "${_common_lib_path}/libgfxFslVivGLSLC.so" "${_common_lib_path}/libgfxFslVivVDK.so" "${_common_lib_path}/libxml.so" ) set(VxWorksPlatformGraphics_REQUIRED_LIBRARIES ${VxWorksPlatformGraphics_LIBRARIES_PACK} ${EGL_LIBRARY} ${GLESv2_LIBRARY} ) unset(_common_lib_path)
Ein Beispiel für Intel NUC6i3SYH:
# Copyright (C) 2024 The Qt Company Ltd. # SPDX-License-Identifier: BSD-3-Clause if(QT_VXWORKS_TOOLCHAIN_FILE) set(_original_toolchain_file "${QT_VXWORKS_TOOLCHAIN_FILE}") elseif(DEFINED ENV{QT_VXWORKS_TOOLCHAIN_FILE}) set(_original_toolchain_file "$ENV{QT_VXWORKS_TOOLCHAIN_FILE}") else() message(FATAL_ERROR "QT_VXWORKS_TOOLCHAIN_FILE is not set.") endif() if(NOT EXISTS "${_original_toolchain_file}") message(FATAL_ERORR "${_original_toolchain_file} doesn't exists.") endif() include("${_original_toolchain_file}") unset(_original_toolchain_file) list(APPEND CMAKE_TRY_COMPILE_PLATFORM_VARIABLES QT_VXWORKS_TOOLCHAIN_FILE) set(_common_lib_path "${CMAKE_SYSROOT}/usr/lib/common") set(EGL_INCLUDE_DIR ${CMAKE_SYSROOT}/usr/h/public CACHE PATH "Path to EGL include directory" FORCE) set(EGL_LIBRARY ${_common_lib_path}/libgfxMesaEGL.so CACHE PATH "Path to EGL lib" FORCE) set(GLESv2_INCLUDE_DIR ${CMAKE_SYSROOT}/usr/h/public CACHE PATH "Path to GLES include directory" FORCE) set(GLESv2_LIBRARY ${_common_lib_path}/libgfxMesaGL.so CACHE PATH "Path to GLES lib" FORCE) set(VxWorksPlatformGraphics_DEFINES "-D__vxworks -D__VXWORKS") set(VxWorksPlatformGraphics_LIBRARIES_PACK "${_common_lib_path}/libgfxMesaSw.so" "${_common_lib_path}/libgfxMesa.so" "${_common_lib_path}/libgfxMesaDriI965.so" "${_common_lib_path}/libgfxLibDRM.so" "${_common_lib_path}/libxml.so" ) set(VxWorksPlatformGraphics_REQUIRED_LIBRARIES ${VxWorksPlatformGraphics_LIBRARIES_PACK} ${EGL_LIBRARY} ${GLESv2_LIBRARY} ) unset(_common_lib_path)
Ausführen von Qt 6 Configure für das Target
Unten sehen Sie ein Beispiel für eine Build-Konfiguration für das BD-SL-i.MX6. Für die meisten VxWorks-Boards sieht der configure-Befehl sehr ähnlich aus. Standardmäßig ist Qt 6 so konfiguriert, dass es Shared Libraries verwendet. Um Qt 6 statisch zu bauen, fügen Sie die Option -static
zu configure hinzu.
Stellen Sie sicher, dass die Umgebungsvariable {WIND_CC_SYSROOT} auf das VxWorks VSB-Root-Verzeichnis gesetzt ist.
./configure \ -cmake-generator "Ninja" \ -icu \ -eglfs \ -qpa eglfs \ -submodules "qtbase,qtdeclarative,qtmultimedia,qtquick3d,qtgraphs,qtimageformats,qtsvg,qtshadertools,qtvirtualkeyboard" \ -- \ -B <target/build/directory> \ -DQT_VXWORKS_TOOLCHAIN_FILE=<path/to/BDP/toolchain.cmake> \ -DFEATURE_vulkan=OFF \ -DQT_QMAKE_TARGET_MKSPEC=vxworks-clang \ -DQT_HOST_PATH=<path/to/Qt6/host/installation/dir> \ -DCMAKE_STAGING_PREFIX:PATH=<path/to/Qt6/target/installation/dir> \ -DCMAKE_TOOLCHAIN_FILE=<path/to/cmake/for/graphics/file/created/above> \
Falls Sie für DKM und nicht für RTP bauen wollen, verwenden Sie die Option -static
und ändern Sie den Wert CMAKE_TOOLCHAIN_FILE
in "$WIND_CC_SYSROOT/mk/dkm.toolchain.cmake"
Es wird empfohlen, Qt 6 mit einem Shadow-Build zu erstellen. Siehe Qt-Konfigurationsoptionen für weitere Informationen.
Nach der Konfiguration können Sie Qt 6 für VxWorks mit diesen Befehlen erstellen und installieren:
cd <host build directory> ninja ninja install
Plattform-Plugins für VxWorks-Geräte
Qt für VxWorks unterstützt das EGLFS-Plattform-Plugin für eine native Fenstersubstitution. Lesen Sie mehr über seine Konfiguration in EGLFS.
Erstellen von Qt-Anwendungen
Um eine Qt-Anwendung zu erstellen, müssen Sie das QT_VXWORKS_TOOLCHAIN_FILE als Umgebungsvariable oder als Define setzen.
Ein Beispiel für die Erstellung der Qt-Demo clocks:
export WIND_CC_SYSROOT=<path/to/VxWorks/VSB/directory> export QT_VXWORKS_TOOLCHAIN_FILE=<path/to/the/BSP/toolchain.cmake> <path/to/Qt6/target/installation/dir>/bin/qt-cmake -G Ninja -S ~/Qt/Examples/Qt-6.8.0/demos/clocks -B <path/to/build/directory> cd <path/to/build/directory> ninja
Qt-Anwendungen starten
Das folgende Beispiel zeigt, wie man eine Anwendung startet, wenn Qt 6 mit Shared Libraries gebaut wurde. Bei einem statisch erstellten Qt 6 brauchen Sie die Umgebungsvariable LD_LIBRARY_PATH
nicht für die Qt-Bibliotheken zu verwenden, aber sie muss auf den Ort der VxWorks Shared Libraries zeigen (z.B. libc und OpenGL ES 2.0). Für die statischen Qt 6-Bibliotheken wird sie nicht benötigt.
putenv "LD_LIBRARY_PATH=/sd0:1/lib" cd "/sd0:1" rtpSp("<Qt 6_app>", 200, 0x100000, 0, 0x01000000)
Beschränkungen
Video-Speicher
Auf Systemen mit einer bestimmten Menge an dediziertem Videospeicher ist möglicherweise besondere Vorsicht geboten, bevor Qt-Anwendungen, die auf Qt Quick oder Klassen wie QOpenGLWidget basieren, ausgeführt werden. Die Standardeinstellung kann für solche Anwendungen unzureichend sein, insbesondere wenn sie auf einem Bildschirm mit hoher Auflösung (z. B. Full HD) angezeigt werden. In diesem Fall kann es zu unerwarteten Fehlern kommen. Es wird daher empfohlen, dafür zu sorgen, dass mindestens 128 MB GPU-Speicher zur Verfügung stehen. Bei Systemen, bei denen kein fester Speicherplatz für die GPU reserviert ist, stellt dies kein Problem dar.
© 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.