Auf dieser Seite

QDesktopServices Class

Die Klasse „QDesktopServices“ bietet Methoden für den Zugriff auf gängige Desktop-Dienste. Mehr...

Header: #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)

Ausführliche Beschreibung

Viele Desktop-Umgebungen bieten Dienste an, die von Anwendungen genutzt werden können, um gängige Aufgaben – wie beispielsweise das Öffnen einer Webseite – auf eine Weise auszuführen, die sowohl einheitlich ist als auch die Anwendungseinstellungen des Benutzers berücksichtigt.

Diese Klasse enthält Funktionen, die einfache Schnittstellen zu diesen Diensten bereitstellen und angeben, ob diese erfolgreich waren oder fehlgeschlagen sind.

Die Funktion ` openUrl()` dient dazu, Dateien, die sich unter beliebigen URLs befinden, in externen Anwendungen zu öffnen. Bei URLs, die Ressourcen im lokalen Dateisystem entsprechen (wobei das URL-Schema „file“ lautet), wird eine geeignete Anwendung zum Öffnen der Datei verwendet; andernfalls wird ein Webbrowser verwendet, um die Datei abzurufen und anzuzeigen.

Die Desktop-Einstellungen des Benutzers legen fest, ob bestimmte ausführbare Dateitypen zum Anzeigen geöffnet oder stattdessen ausgeführt werden. Einige Desktop-Umgebungen sind so konfiguriert, dass Benutzer keine Dateien ausführen können, die von nicht-lokalen URLs stammen, oder dass sie zuvor die Erlaubnis des Benutzers einholen müssen.

URL-Handler

Das Verhalten der Funktion ` openUrl()` kann für einzelne URL-Schemas angepasst werden, damit Anwendungen das Standardverhalten für bestimmte URL-Typen überschreiben können.

Der Dispatch-Mechanismus erlaubt die Verwendung von nur einem benutzerdefinierten Handler pro URL-Schema; dies wird über die 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 Verarbeitungsverhalten für das angegebene Schema auf das Standardverhalten zurückgesetzt.

Dieses System erleichtert beispielsweise die Implementierung eines Hilfesystems. Hilfe könnte in Beschriftungen und Textbrowsern mithilfe 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 feststellen, dass Sie die angeforderte URL nicht öffnen können, rufen Sie einfach erneut ` QDesktopServices::openUrl()` mit demselben Argument auf, und die Funktion versucht, die URL mithilfe des für die Desktop-Umgebung des Benutzers geeigneten Mechanismus zu öffnen.

In Kombination mit plattformspezifischen Einstellungen können die von der Funktion ` openUrl()` registrierten Schemata auch anderen Anwendungen zur Verfügung gestellt werden, was Deep-Linking zwischen Anwendungen oder einen sehr einfachen URL-basierten IPC-Mechanismus ermöglicht.

Siehe auch QSystemTrayIcon, QProcess und QStandardPaths.

Dokumentation zu den 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 wird „ false “ zurückgegeben.

Wenn die URL auf eine lokale Datei verweist (d. h., das URL-Schema lautet „file“), wird sie statt in einem Webbrowser mit einer geeigneten Anwendung geöffnet.

Das folgende Beispiel öffnet eine Datei im Windows-Dateisystem, deren Pfad Leerzeichen enthält:

QDesktopServices::openUrl(QUrl("file:///C:/Program Files", QUrl::TolerantMode));

Wird eine URL vom Typ „ mailto “ angegeben, wird der E-Mail-Client des Benutzers verwendet, um ein Verfassen-Fenster mit den in der URL angegebenen Optionen zu öffnen – ähnlich wie bei der Verarbeitung von „ mailto “-Links durch einen Webbrowser.

Die folgende URL enthält beispielsweise 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 versenden können und Unicode-fähig sind, hat der Benutzer seinen Client möglicherweise ohne diese Funktionen konfiguriert. Außerdem haben bestimmte E-Mail-Clients (z. B. Lotus Notes) Probleme mit langen URLs.

Warnung: Ein Rückgabewert von „ true “ zeigt an, dass die Anwendung das Betriebssystem erfolgreich aufgefordert hat, die URL in einer externen Anwendung zu öffnen. Es kann dennoch vorkommen, dass die externe Anwendung nicht gestartet wird oder die angeforderte URL nicht öffnet. Dieses Ergebnis wird nicht an die Anwendung zurückgemeldet.

Warnung: URLs , die unter iOS an diese Funktion übergeben werden, werden nur geladen, wenn ihre Schemata im Schlüssel „ LSApplicationQueriesSchemes “ der Datei „Info.plist“ der Anwendung aufgeführt sind. Weitere Informationen finden Sie in der Apple-Entwicklerdokumentation zu „canOpenURL:“. Die folgenden Zeilen aktivieren beispielsweise URLs mit dem HTTPS-Schema:

<key>LSApplicationQueriesSchemes</key>
<array>
    <string>https</string>
</array>

Hinweis: Unter Android Nougat (SDK 24) und höher werden URLs mit dem Schema „ file “ über „FileProvider“ geöffnet, der zunächst versucht, eine freigabebare URI mit dem Schema „ content “ abzurufen. Aus diesem Grund definiert Qt für Android einen Dateianbieter mit der Berechtigung „ ${applicationId}.qtprovider “, wobei „ applicationId “ der Paketname der App ist, um Namenskonflikte zu vermeiden. Weitere Informationen finden Sie auch unter „Einrichten der Dateifreigabe“.

Siehe auch „ setUrlHandler()“.

[static] void QDesktopServices::setUrlHandler(const QString &scheme, QObject *receiver, const char *method)

Legt den Handler für die angegebene „ scheme “ auf den Handler „ method “ fest, der vom Objekt „ receiver “ bereitgestellt wird.

Diese Funktion bietet die Möglichkeit, das Verhalten von ` openUrl()` anzupassen. Wird ` openUrl()` mit einer URL aufgerufen, die das angegebene ` scheme ` enthält, wird anstelle von ` QDesktopServices ` die angegebene ` method ` des ` receiver `-Objekts aufgerufen, wodurch eine externe Anwendung gestartet wird.

Die bereitgestellte Methode muss als Slot implementiert werden, der nur ein einziges Argument vom Typ „ QUrl “ akzeptiert.

class MyHelpHandler : public QObject
{
    Q_OBJECT
public:
    // ...
public slots:
    void showHelp(const QUrl &url);
};

Wird `setUrlHandler()` verwendet, um einen neuen Handler für ein Schema festzulegen, für das bereits ein Handler vorhanden ist, wird der bestehende Handler einfach durch den neuen ersetzt. Da ` QDesktopServices ` keine Eigentumsrechte an Handlern übernimmt, werden beim Ersetzen eines Handlers keine Objekte gelöscht.

Beachten Sie, dass der Handler immer aus demselben Thread heraus aufgerufen wird, der ` QDesktopServices::openUrl()` aufruft.

Sie müssen ` unsetUrlHandler()` aufrufen, bevor Sie das Handler-Objekt vernichten, damit sich die Vernichtung des Handler-Objekts nicht mit gleichzeitigen Aufrufen von ` openUrl()` überschneidet, die dieses Objekt verwenden.

iOS und macOS

Um diese Funktion zum Empfangen von Daten aus anderen Apps unter iOS/macOS zu nutzen, müssen Sie außerdem das benutzerdefinierte Schema zur Liste „ CFBundleURLSchemes “ in Ihrer Info.plist-Datei hinzufügen:

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>myapp</string>
        </array>
    </dict>
</array>

Weitere Informationen finden Sie in der Apple-Entwicklerdokumentation unter „Definieren eines benutzerdefinierten URL-Schemas für Ihre App“.

Warnung: Es ist nicht möglich, Unterstützung für einige bekannte URL-Schemas, darunter http und https, zu beanspruchen. Dies ist nur für Universal Links zulässig.

Um die Unterstützung für http und https zu beanspruchen, ist der oben genannte Eintrag in der Datei „Info.plist“ nicht zulässig. Dies ist nur möglich, wenn Sie Ihre Domain zur Datei „Entitlements“ hinzufügen:

<key>com.apple.developer.associated-domains</key>
<array>
    <string>applinks:your.domain.com</string>
</array>

iOS/macOS sucht bei der Installation der Anwendung auf Ihrer Domain nach der Datei „/.well-known/apple-app-site-association“. Wenn Sie die URL „ https://your.domain.com/help?topic=ABCDEF “ bedienen möchten, müssen Sie dort den folgenden Inhalt bereitstellen:

{
    "applinks": {
        "apps": [],
        "details": [{
            "appIDs" : [ "ABCDE12345.com.example.app" ],
            "components": [{
                "/": "/help",
                "?": { "topic": "?*"}
            }]
        }]
    }
}

Weitere Informationen finden Sie in der Apple-Entwicklerdokumentation zum Thema „Unterstützung zugeordneter Domains“.

Android

Um diese Funktion zum Empfangen von Daten aus anderen Apps unter Android zu nutzen, müssen Sie einen oder mehrere Intent-Filter zum „ 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 unter „Deep Links zu App-Inhalten erstellen“.

Um den entsprechenden Inhalt sofort in Ihrer Android-App zu öffnen, ohne dass der Nutzer die App auswählen muss, müssen Sie Ihren Link verifizieren. Um die Verifizierung zu aktivieren, fügen Sie Ihrem Intent-Filter einen zusätzlichen Parameter hinzu:

<intent-filter android:autoVerify="true">

Android sucht nach „ https://your.domain.com/.well-known/assetlinks.json “, wenn die Anwendung installiert ist. Wenn Sie auf „ https://your.domain.com:1337/help “ reagieren 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 unter „Android-App-Links überprüfen“.

Siehe auch openUrl() und unsetUrlHandler().

[static] void QDesktopServices::unsetUrlHandler(const QString &scheme)

Entfernt einen zuvor festgelegten URL-Handler für die angegebene URL „ scheme “.

Rufen Sie diese Funktion auf, bevor das für ` scheme ` registrierte Handler-Objekt zerstört wird, um zu verhindern, dass gleichzeitige Aufrufe von ` openUrl()` weiterhin das zerstörte Handler-Objekt aufrufen.

Siehe auch setUrlHandler().

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