QDesktopServices Class
Die Klasse QDesktopServices bietet Methoden für den Zugriff auf gängige Desktop-Dienste. Mehr...
Kopfzeile: | #include <QDesktopServices> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Gui) target_link_libraries(mytarget PRIVATE Qt6::Gui) |
qmake: | QT += gui |
Statische öffentliche Mitglieder
bool | openUrl(const QUrl &url) |
void | setUrlHandler(const QString &scheme, QObject *receiver, const char *method) |
void | unsetUrlHandler(const QString &scheme) |
Detaillierte Beschreibung
Viele Desktop-Umgebungen stellen Dienste zur Verfügung, die von Anwendungen genutzt werden können, um allgemeine Aufgaben, wie das Öffnen einer Webseite, auf eine Weise auszuführen, die sowohl konsistent ist als auch die Anwendungspräferenzen des Benutzers berücksichtigt.
Diese Klasse enthält Funktionen, die einfache Schnittstellen zu diesen Diensten bereitstellen und anzeigen, ob sie erfolgreich waren oder nicht.
Die Funktion openUrl() wird verwendet, um Dateien zu öffnen, die sich unter beliebigen URLs in externen Anwendungen befinden. Bei URLs, die Ressourcen im lokalen Ablagesystem entsprechen (bei denen das URL-Schema "Datei" lautet), wird eine geeignete Anwendung zum Öffnen der Datei verwendet; andernfalls wird ein Webbrowser zum Abrufen und Anzeigen der Datei verwendet.
Die Desktop-Einstellungen des Benutzers steuern, ob bestimmte ausführbare Dateitypen zum Durchsuchen geöffnet oder stattdessen ausgeführt werden. Einige Desktop-Umgebungen sind so konfiguriert, dass sie das Ausführen von Dateien, die von nicht-lokalen URLs stammen, verhindern oder den Benutzer vorher um Erlaubnis fragen.
URL-Handler
Das Verhalten der Funktion openUrl() kann für einzelne URL-Schemata angepasst werden, um Anwendungen die Möglichkeit zu geben, das Standardverhalten für bestimmte Arten von URLs außer Kraft zu setzen.
Der Dispatch-Mechanismus erlaubt die Verwendung nur eines benutzerdefinierten Handlers für jedes URL-Schema; dieser wird mit der Funktion setUrlHandler() festgelegt. Jeder Handler ist als Slot implementiert, der nur ein einziges QUrl Argument akzeptiert.
Die vorhandenen Handler für jedes Schema können mit der Funktion unsetUrlHandler() entfernt werden. Dadurch wird das Verhalten für das angegebene Schema auf das Standardverhalten zurückgesetzt.
Dieses System macht es einfach, zum Beispiel ein Hilfesystem zu implementieren. Hilfe könnte in Labels und Textbrowsern unter Verwendung von help://myapplication/mytopic URLs bereitgestellt werden, und durch die Registrierung eines Handlers wird es möglich, den Hilfetext innerhalb der Anwendung anzuzeigen:
class MyHelpHandler : public QObject { Q_OBJECT public: // ... public slots: void showHelp(const QUrl &url); }; QDesktopServices::setUrlHandler("help", helpInstance, "showHelp");
Wenn Sie innerhalb des Handlers entscheiden, dass Sie die angeforderte URL nicht öffnen können, können Sie QDesktopServices::openUrl() einfach erneut mit demselben Argument aufrufen, und es wird versuchen, die URL mit dem geeigneten Mechanismus für die Desktop-Umgebung des Benutzers zu öffnen.
In Verbindung mit plattformspezifischen Einstellungen können die von der Funktion openUrl() registrierten Schemata auch anderen Anwendungen zugänglich gemacht werden, so dass sie für Deep Linking oder einen sehr einfachen URL-basierten IPC-Mechanismus genutzt werden können.
Siehe auch QSystemTrayIcon, QProcess, und QStandardPaths.
Dokumentation der Mitgliedsfunktionen
[static]
bool QDesktopServices::openUrl(const QUrl &url)
Öffnet die angegebene URL url in dem für die Desktop-Umgebung des Benutzers geeigneten Webbrowser und gibt bei Erfolg true
zurück, andernfalls false
.
Wenn die URL ein Verweis auf eine lokale Datei ist (d.h. das URL-Schema ist "file"), wird sie mit einer geeigneten Anwendung anstelle eines Webbrowsers geöffnet.
Im folgenden Beispiel wird eine Datei im Windows-Dateisystem geöffnet, die sich in einem Pfad befindet, der Leerzeichen enthält:
QDesktopServices::openUrl(QUrl("file:///C:/Program Files", QUrl::TolerantMode));
Wenn eine URL mailto
angegeben ist, wird der E-Mail-Client des Benutzers verwendet, um ein Composer-Fenster zu öffnen, das die in der URL angegebenen Optionen enthält, ähnlich wie mailto
Links von einem Webbrowser behandelt werden.
Zum Beispiel enthält die folgende URL einen Empfänger (user@foo.com
), einen Betreff (Test
) und einen Nachrichtentext (Just a test
):
mailto:user@foo.com?subject=Test&body=Just a test
Warnung: Obwohl viele E-Mail-Clients Anhänge senden können und Unicode-fähig sind, kann es sein, dass der Benutzer seinen Client ohne diese Funktionen konfiguriert hat. Außerdem haben bestimmte E-Mail-Clients (z. B. Lotus Notes) Probleme mit langen URLs.
Warnung: Ein Rückgabewert von true
bedeutet, dass die Anwendung das Betriebssystem erfolgreich aufgefordert hat, die URL in einer externen Anwendung zu öffnen. Die externe Anwendung kann dennoch nicht gestartet werden oder die angeforderte URL nicht öffnen. Dieses Ergebnis wird nicht an die Anwendung zurückgemeldet.
Warnung: URLs, die unter iOS an diese Funktion übergeben werden, werden nur dann geladen, wenn ihre Schemata im Schlüssel LSApplicationQueriesSchemes
der Datei Info.plist der Anwendung aufgeführt sind. Weitere Informationen finden Sie in der Apple Developer Documentation für canOpenURL:. Die folgenden Zeilen aktivieren zum Beispiel URLs mit dem HTTPS-Schema:
<key>LSApplicationQueriesSchemes</key> <array> <string>https</string> </array>
Hinweis: Für Android Nougat (SDK 24) und höher werden URLs mit einem file
-Schema mit FileProvider geöffnet, der zuerst versucht, eine freigebbare content
-Schema-URI zu erhalten. Aus diesem Grund definiert Qt für Android einen Dateianbieter mit der Autorität ${applicationId}.qtprovider
, wobei applicationId
der Paketname der App ist, um Namenskonflikte zu vermeiden. Für weitere Informationen siehe auch Einrichten der Dateifreigabe.
Siehe auch setUrlHandler().
[static]
void QDesktopServices::setUrlHandler(const QString &scheme, QObject *receiver, const char *method)
Setzt den Handler für das angegebene scheme auf den Handler method, der durch das Objekt receiver bereitgestellt wird.
Diese Funktion bietet eine Möglichkeit, das Verhalten von openUrl() anzupassen. Wenn openUrl() mit einer URL mit dem angegebenen scheme aufgerufen wird, wird der angegebene method auf dem receiver Objekt aufgerufen, anstatt QDesktopServices eine externe Anwendung zu starten.
Die bereitgestellte Methode muss als Slot implementiert werden, der nur ein einziges QUrl Argument akzeptiert.
class MyHelpHandler : public QObject { Q_OBJECT public: // ... public slots: void showHelp(const QUrl &url); };
Wenn setUrlHandler() verwendet wird, um einen neuen Handler für ein Schema zu setzen, das bereits einen Handler hat, wird der bestehende Handler einfach durch den neuen ersetzt. Da QDesktopServices keine Handler in Besitz nimmt, werden keine Objekte gelöscht, wenn ein Handler ersetzt wird.
Beachten Sie, dass der Handler immer aus demselben Thread aufgerufen wird, der QDesktopServices::openUrl() aufruft.
Sie müssen unsetUrlHandler() aufrufen, bevor Sie das Handler-Objekt zerstören, damit sich die Zerstörung des Handler-Objekts nicht mit gleichzeitigen Aufrufen von openUrl() überschneidet, die es verwenden.
iOS und macOS
Um diese Funktion für den Empfang von Daten aus anderen Apps unter iOS/macOS zu verwenden, müssen Sie auch das benutzerdefinierte Schema zur Liste CFBundleURLSchemes
in Ihrer Datei Info.plist hinzufügen:
<key>CFBundleURLTypes</key> <array> <dict> <key>CFBundleURLSchemes</key> <array> <string>myapp</string> </array> </dict> </array>
Weitere Informationen finden Sie in der Apple Developer Documentation for Defining a Custom URL Scheme for Your App.
Warnung: Es ist nicht möglich, Unterstützung für einige bekannte URL-Schemata, einschließlich http und https, zu fordern. Dies ist nur für Universal Links erlaubt.
Um Unterstützung für http und https zu beanspruchen, ist der obige Eintrag in der Datei Info.plist nicht erlaubt. Dies ist nur möglich, wenn Sie Ihre Domäne zur Entitlements-Datei hinzufügen:
<key>com.apple.developer.associated-domains</key> <array> <string>applinks:your.domain.com</string> </array>
iOS/macOS wird nach /.well-known/apple-app-site-association auf Ihrer Domain suchen, wenn die Anwendung installiert wird. Wenn Sie https://your.domain.com/help?topic=ABCDEF
abhören möchten, müssen Sie dort den folgenden Inhalt angeben:
{ "applinks": { "apps": [], "details": [{ "appIDs" : [ "ABCDE12345.com.example.app" ], "components": [{ "/": "/help", "?": { "topic": "?*"} }] }] } }
Weitere Informationen finden Sie in der Apple Developer Documentation for Supporting Associated Domains.
Android
Um diese Funktion für den Empfang von Daten von anderen Apps unter Android zu verwenden, müssen Sie einen oder mehrere Absichtsfilter zu activity
in Ihrem App-Manifest hinzufügen:
<intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="https" android:host="your.domain.com" android:port="1337" android:path="/help"/> </intent-filter>
Weitere Informationen finden Sie in der Android-Entwicklerdokumentation zu Create Deep Links to App Content.
Um den entsprechenden Inhalt in Ihrer Android-App sofort zu öffnen, ohne dass der Benutzer die App auswählen muss, müssen Sie Ihren Link verifizieren. Um die Verifizierung zu aktivieren, fügen Sie einen zusätzlichen Parameter zu Ihrem Absichtsfilter hinzu:
<intent-filter android:autoVerify="true">
Android wird nach https://your.domain.com/.well-known/assetlinks.json
suchen, wenn die Anwendung installiert ist. Wenn Sie https://your.domain.com:1337/help
anhören möchten, müssen Sie dort den folgenden Inhalt bereitstellen:
[{ "relation": ["delegate_permission/common.handle_all_urls"], "target": { "namespace": "android_app", "package_name": "com.example.app", "sha256_cert_fingerprints": ["14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"] } }]
Weitere Informationen finden Sie in der Android-Entwicklerdokumentation zu Verify Android App Links.
Siehe auch openUrl() und unsetUrlHandler().
[static]
void QDesktopServices::unsetUrlHandler(const QString &scheme)
Entfernt einen zuvor gesetzten URL-Handler für die angegebene scheme.
Rufen Sie diese Funktion auf, bevor das für scheme registrierte Handler-Objekt zerstört wird, um zu verhindern, dass gleichzeitige openUrl()-Aufrufe weiterhin das zerstörte Handler-Objekt aufrufen.
Siehe auch setUrlHandler().
© 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.