QDesktopServices Class
QDesktopServices クラスは、一般的なデスクトップ・サービスにアクセスするためのメソッドを提供します。詳細...
Header: | #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スキームが "file "である)ローカル・ファイリング・システム上のリソースに対応するURLの場合、ファイルを開くために適切なアプリケーションが使用され、そうでない場合は、ファイルを取得して表示するために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 をユーザーのデスクトップ環境に適したウェブブラウザで開き、成功すればtrue
を返し、そうでなければfalse
を返す。
URLがローカルファイルへの参照(すなわち、URLスキームが "file")の場合、ウェブブラウザの代わりに適切なアプリケーションで開かれる。
以下の例では、スペースを含むパスにあるWindowsファイルシステム上のファイルを開いている:
QDesktopServices::openUrl(QUrl("file:///C:/Program Files", QUrl::TolerantMode));
mailto
URLが指定された場合、ユーザーの電子メールクライアントは、mailto
リンクがウェブブラウザによって処理される方法と同様に、URLで指定されたオプションを含むコンポーザーウィンドウを開くために使われる。
たとえば、次の URL には受信者(user@foo.com
)、件名(Test
)、メッセージ本文(Just a test
)が含まれています:
mailto:user@foo.com?subject=Test&body=Just a test
警告: 警告:多くの電子メールクライアントは添付ファイルを送信でき、ユニコードに対応していますが、ユーザーはこれらの機能を使わずにクライアントを設定している可能性があります。また、特定の電子メールクライアント(Lotus Notesなど)では、長いURLの扱いに問題があります。
警告 戻り値true
は、アプリケーションが外部アプリケーションでURLを開くようオペレーティング・システムに要求することに成功したことを示します。外部アプリケーションはまだ起動に失敗したり、要求されたURLを開くことができない場合があります。この結果はアプリケーションには報告されません。
警告 iOSでこの関数に渡されたURLは、そのスキームがアプリケーションのInfo.plistファイルのLSApplicationQueriesSchemes
キーにリストされていない限り、ロードされません。詳細については、canOpenURL:のApple Developer Documentationを参照してください。例えば、以下の行はHTTPSスキームのURLを有効にします:
<key>LSApplicationQueriesSchemes</key> <array> <string>https</string> </array>
注意: Android Nougat (SDK 24) 以上の場合、file
スキームの URL は、共有可能なcontent
スキームの URI を最初に取得しようとするFileProviderを使用して開かれます。そのため、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 のみを受け付けるスロットとして実装する必要があります。
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 forDefining a Custom URL Scheme for Your Appを参照してください。
警告 httpやhttpsなど、よく知られているURLスキームのサポートを主張することはできません。これはユニバーサルリンクでのみ許可されます。
Info.plistファイル内の上記のエントリは、httpとhttpsのサポートを要求することはできません。これは、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 forSupporting Associated Domainsを参照してください。
アンドロイド
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 Developer Documentation forCreate Deep Links to App Contentを参照してください。
ユーザーがアプリを選択しなくても、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 forVerify Android App Linksを参照してください。
openUrl() およびunsetUrlHandler()も参照して ください。
[static]
void QDesktopServices::unsetUrlHandler(const QString &scheme)
指定されたscheme に対して以前に設定された URL ハンドラを削除します。
この関数は、scheme に登録されていたハンドラ・オブジェクトが破棄される前に呼び出します。これは、openUrl() の同時呼び出しによって、破棄されたハンドラ・オブジェクトが引き続き呼び出されるのを防ぐためです。
setUrlHandler()も参照 。
©2024 The Qt Company Ltd. 本文書に含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。