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) |
상세 설명
많은 데스크톱 환경은 애플리케이션이 웹 페이지 열기와 같은 일반적인 작업을 일관된 방식으로, 또한 사용자의 애플리케이션 기본 설정을 고려하여 수행할 수 있도록 지원하는 서비스를 제공합니다.
이 클래스에는 이러한 서비스에 대한 간단한 인터페이스를 제공하며, 작업의 성공 또는 실패 여부를 알려주는 함수들이 포함되어 있습니다.
openUrl() 함수는 임의의 URL에 위치한 파일을 외부 애플리케이션에서 여는 데 사용됩니다. 로컬 파일 시스템의 리소스에 해당하는 URL(URL 스키마가 "file"인 경우)의 경우, 해당 파일을 여는 데 적합한 애플리케이션이 사용되며, 그렇지 않은 경우 웹 브라우저를 사용하여 파일을 가져와 표시합니다.
사용자의 데스크톱 설정에 따라 특정 실행 파일 유형이 열려 열람되도록 할지, 아니면 대신 실행되도록 할지가 결정됩니다. 일부 데스크톱 환경은 사용자가 로컬이 아닌 URL에서 가져온 파일을 실행하지 못하도록 설정되어 있거나, 실행하기 전에 사용자의 허가를 요청하도록 구성되어 있습니다.
URL 핸들러
openUrl() 함수의 동작은 개별 URL 스키마에 맞게 사용자 정의할 수 있으며, 이를 통해 애플리케이션이 특정 유형의 URL에 대한 기본 처리 동작을 재정의할 수 있습니다.
디스패치 메커니즘은 각 URL 스키마에 대해 하나의 사용자 정의 핸들러만 사용할 수 있도록 허용하며, 이는 ` setUrlHandler()` 함수를 사용하여 설정됩니다. 각 핸들러는 단일 ` QUrl ` 인자만 받아들이는 슬롯으로 구현됩니다.
각 스키마에 대한 기존 핸들러는 ` 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 키에 나열되어 있지 않으면 로드되지 않습니다. 자세한 내용은 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}.qtprovider 권한을 가진 파일 제공자를 정의하며, 여기서 applicationId 은 앱의 패키지 이름입니다. 자세한 내용은 ‘파일 공유 설정’을 참조하십시오.
setUrlHandler()도 참조하십시오 .
[static] void QDesktopServices::setUrlHandler(const QString &scheme, QObject *receiver, const char *method)
지정된 ` scheme `에 대해 ` receiver ` 객체가 제공하는 핸들러 ` method `를 핸들러로 설정합니다.
이 함수는 openUrl()의 동작을 사용자 정의할 수 있는 방법을 제공합니다. openUrl()가 지정된 scheme 를 가진 URL로 호출될 경우, receiver 객체의 method 가 호출되며, QDesktopServices 가 외부 애플리케이션을 실행하는 대신 이 함수가 호출됩니다.
제공된 메서드는 단일 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 개발자 문서의 ‘앱용 사용자 정의 URL 스킴 정의’를 참조하십시오.
경고: http 및 https를 비롯한 일부 잘 알려진 URL 스킴에 대한 지원을 선언할수 없습니다 . 이는 유니버설 링크(Universal Links)에서만 허용됩니다.
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 개발자 문서의 ‘연관 도메인 지원’ 항목을 참조하십시오.
Android
Android에서 다른 앱으로부터 데이터를 수신하기 위해 이 기능을 사용하려면, 앱 매니페스트의 ` activity `에 하나 이상의 인텐트 필터를 추가해야 합니다:
<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 개발자 문서의 ‘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.