このページでは

QDesktopServices Class

QDesktopServices クラスは、一般的なデスクトップサービスにアクセスするためのメソッドを提供します。詳細...

ヘッダー: #include <QDesktopServices>
CMake: find_package(Qt6 REQUIRED COMPONENTS Gui)
target_link_libraries(mytarget PRIVATE Qt6::Gui)
qmake: QT += gui

静的パブリックメンバー

bool openUrl(const QUrl &url)
void setUrlHandler(const QString &scheme, QObject *receiver, const char *method)
void unsetUrlHandler(const QString &scheme)

詳細な説明

多くのデスクトップ環境では、アプリケーションが Web ページの表示といった一般的なタスクを、一貫性があり、かつユーザーのアプリケーション設定を考慮した方法で実行するために利用できるサービスを提供しています。

このクラスには、これらのサービスへのシンプルなインターフェースを提供し、成功したか失敗したかを示す関数が含まれています。

openUrl() 関数は、任意の URL にあるファイルを外部アプリケーションで開くために使用されます。ローカルファイルシステム上のリソースに対応する URL(URL スキームが「file」の場合)については、適切なアプリケーションを使用してファイルが開かれます。それ以外の場合は、Web ブラウザを使用してファイルを取得・表示します。

特定の実行可能ファイルの種類を閲覧用に開くか、それとも実行するかは、ユーザーのデスクトップ設定によって制御されます。一部のデスクトップ環境では、ローカル以外の URL から取得したファイルの実行をユーザーに許可しないように設定されていたり、実行前にユーザーの許可を求めるように設定されていたりします。

URLハンドラ

openUrl() 関数の動作は、個々の URL スキーマごとにカスタマイズでき、これによりアプリケーションは特定の種類の URL に対するデフォルトの処理動作を上書きできるようになります。

ディスパッチ機構では、各URLスキームに対して1つのカスタムハンドラのみを使用できます。これはsetUrlHandler()関数を使用して設定されます。各ハンドラは、QUrl 引数を1つだけ受け取るスロットとして実装されます。

各スキームの既存のハンドラは、unsetUrlHandler() 関数を使用して削除できます。これにより、指定されたスキームの処理動作がデフォルトの動作に戻ります。

この仕組みを利用すれば、例えばヘルプシステムを簡単に実装できます。ラベルやテキストブラウザでは、help://myapplication/mytopic URL を使用してヘルプを提供でき、ハンドラを登録することで、アプリケーション内でヘルプテキストを表示することが可能になります:

class MyHelpHandler : public QObject
{
    Q_OBJECT
public:
    // ...
public slots:
    void showHelp(const QUrl &url);
};
QDesktopServices::setUrlHandler("help", helpInstance, "showHelp");

ハンドラ内で、要求されたURLを開くことができないと判断した場合は、同じ引数でQDesktopServices::openUrl()を再度呼び出すだけで、ユーザーのデスクトップ環境に適したメカニズムを使用してURLを開こうとします。

プラットフォーム固有の設定と組み合わせることで、openUrl() 関数によって登録されたスキームを他のアプリケーションにも公開することができ、アプリケーションのディープリンクや、非常に基本的な URL ベースの IPC メカニズムを実現できます。

QSystemTrayIcon 、QProcess 、およびQStandardPathsも参照してください 。

メンバ関数のドキュメント

[static] bool QDesktopServices::openUrl(const QUrl &url)

指定されたurl を、ユーザーのデスクトップ環境に適したWebブラウザで開き、成功した場合はtrue を返し、失敗した場合はfalse を返します。

URLがローカルファイルへの参照である場合(つまり、URLスキーマが「file」である場合)、Webブラウザではなく適切なアプリケーションでファイルが開かれます。

次の例は、スペースを含むパスにある Windows ファイルシステム上のファイルを開きます。

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

mailto の URL が指定された場合、Web ブラウザがmailto リンクを処理するのと同様に、ユーザーの電子メールクライアントを使用して、URL で指定されたオプションを含む作成ウィンドウが開かれます。

たとえば、次の URL には、受信者 (user@foo.com)、件名 (Test)、およびメッセージ本文 (Just a test) が含まれています:

mailto:user@foo.com?subject=Test&body=Just a test

警告: 多くの電子メールクライアントは 添付ファイルの送信が可能で 、Unicodeに対応していますが 、ユーザーがクライアントの設定でこれらの機能を無効にしている可能性があります。また、一部の電子メールクライアント(Lotus Notesなど)では、長いURLの処理に問題が生じることがあります。

警告:戻り値が `true ` の場合、アプリケーションがオペレーティングシステムに対し、外部アプリケーションでURLを開くよう正常に要求したことを示します。ただし、外部アプリケーションの起動に失敗したり、要求されたURLが開けなかったりする可能性があります。この結果はアプリケーションには報告されません。

警告: iOS において、この関数に渡されたURL は 、そのスキームがアプリケーションの Info.plist ファイルのLSApplicationQueriesSchemes キーにリストされていない限り、読み込まれません。詳細については、Apple 開発者ドキュメントのcanOpenURL: を参照してください。たとえば、以下の行は HTTPS スキームの URL を有効にします:

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

注: Android Nougat(SDK 24)以降では 、file スキームを持つ URL はFileProviderを使用して開かれます。FileProvider は、まず共有可能なcontent スキームの URI を取得しようとします。そのため、Qt for Androidでは 、名前衝突を避けるために、アプリのパッケージ名applicationId を含む権限${applicationId}.qtprovider を持つファイルプロバイダを定義しています。 詳細については、「ファイル共有の設定」も参照してください。

setUrlHandler()も参照してください 。

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

指定されたscheme のハンドラを、receiver オブジェクトによって提供されるmethod に設定します。

この関数は、openUrl() の動作をカスタマイズする方法を提供します。指定されたscheme を含む URL でopenUrl() が呼び出された場合、外部アプリケーションを起動するQDesktopServices の代わりに、receiver オブジェクト上の指定されたmethod が呼び出されます。

指定されたメソッドは、QUrl 引数を1つだけ受け取るスロットとして実装する必要があります。

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

setUrlHandler() を使用して、すでにハンドラが存在するスキームに対して新しいハンドラを設定した場合、既存のハンドラは単に新しいハンドラに置き換えられます。QDesktopServices はハンドラの所有権を取得しないため、ハンドラが置き換えられてもオブジェクトは削除されません。

なお、ハンドラは常にQDesktopServices::openUrl()を呼び出したのと同じスレッド内から呼び出されることに注意してください。

ハンドラオブジェクトを破棄する前に、必ずunsetUrlHandler() を呼び出す必要があります。これにより、ハンドラオブジェクトの破棄と、それを使用するopenUrl() の同時呼び出しが重なることを防ぎます。

iOS および macOS

iOS/macOSでこの関数を使用して他のアプリからデータを受信するには、Info.plistファイル内のCFBundleURLSchemes リストにカスタムスキームを追加する必要があります:

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

詳細については、Apple Developer Documentationの「アプリ用のカスタムURLスキームを定義する」をご覧ください。

警告: http や https を含む、一部のよく知られた URL スキームのサポートを宣言することはできません 。これはユニバーサルリンクでのみ許可されています。

http および https のサポートを宣言する場合、Info.plist ファイルに上記のエントリを記述することは許可されていません。これは、Entitlements ファイルに独自のドメインを追加した場合にのみ可能です:

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

iOS/macOSは、アプリケーションのインストール時に、ドメイン上の「/.well-known/apple-app-site-association」を検索します。https://your.domain.com/help?topic=ABCDEF をリッスンしたい場合は、そこに以下の内容を記述する必要があります:

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

詳細については、Apple Developer Documentationの「関連ドメインのサポート」を参照してください。

Android

Androidで他のアプリからデータを受信するためにこの機能を使用するには、アプリのマニフェスト内のactivity に1つ以上のインテントフィルターを追加する必要があります:

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

詳細については、Android 開発者向けドキュメントの「アプリコンテンツへのディープリンクの作成」を参照してください。

ユーザーがアプリを選択することなく、Android アプリ内で対応するコンテンツをすぐに開くには、リンクの検証を行う必要があります。検証を有効にするには、インテントフィルターに追加のパラメータを追加してください:

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

Androidは、アプリがインストールされている場合、https://your.domain.com/.well-known/assetlinks.json を探します。https://your.domain.com:1337/help を監視したい場合は、そこに以下のコンテンツを指定する必要があります:

[{
  "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"]
  }
}]

詳細については、Android Developer Documentationの「Androidアプリリンクの検証」を参照してください。

「 openUrl()」および「unsetUrlHandler()」も参照してください 。

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

指定されたscheme に対して以前に設定されたURLハンドラを削除します。

scheme に対して登録されたハンドラオブジェクトが破棄される前に、この関数を呼び出すことで、並行して行われるopenUrl()の呼び出しが、破棄されたハンドラオブジェクトを引き続き呼び出すことを防ぐことができます。

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.