파이썬 PySide Qt for Python 클립보드·데이터교환 네이티브 드래그 복사 붙여넣기 포맷 호환성 가이드
🧩 서로 다른 앱과 완벽히 맞물리는 PySide 클립보드와 드래그 앤 드롭 호환 전략
윈도와 맥, 리눅스에서 같은 코드로 자연스럽게 복사와 붙여넣기, 드래그 앤 드롭이 이어지면 업무 흐름이 놀랄 만큼 가벼워집니다.
PySide(Qt for Python)로 데스크톱 앱을 만들다 보면 네이티브 포맷과의 호환성에서 작은 차이가 큰 사용성 차이로 번지곤 하죠.
특히 텍스트와 HTML, 이미지, 파일 경로, URL 같은 데이터 유형을 어떤 MIME 타입으로 주고받아야 하는지, 운영체제별로 어떤 제약이 있는지 모호하게 느껴질 수 있습니다.
이 글은 그런 막연함을 줄이고 바로 적용 가능한 기준선을 제공하려는 목적에서 정리되었습니다.
실무에서는 다른 앱에서 복사한 내용을 우리 앱이 올바르게 해석해야 하고, 반대로 우리 앱에서 복사한 데이터가 외부 앱에서도 문제없이 붙여넣어져야 합니다.
또한 파일 탐색기에서 끌어온 항목을 드롭했을 때 경로가 정확히 전달되는지, 브라우저나 오피스 프로그램과 주고받는 HTML 서식이 깨지지 않는지, 이미지가 손실 없이 오가는지도 중요합니다.
PySide의 QClipboard와 QMimeData, QDrag, 드롭 이벤트 처리만 잘 이해하면 대부분의 호환성 이슈를 조기에 차단할 수 있습니다.
아래 목차를 통해 핵심 요소를 체계적으로 짚어보겠습니다.
📋 목차
🧭 PySide 클립보드와 데이터교환 기본 개념
파이썬 PySide(Qt for Python)의 데이터교환은 QClipboard와 QMimeData, 그리고 드래그 앤 드롭을 담당하는 QDrag의 상호작용으로 이뤄집니다.
운영체제의 네이티브 클립보드와 포맷을 그대로 활용해 외부 애플리케이션과 호환되도록 설계되어 있기 때문에, 올바른 MIME 타입을 담아 넣고 꺼내는 흐름을 이해하는 것이 핵심입니다.
텍스트, HTML, 이미지, URL, 파일 경로 같은 범용 타입은 표준화된 키로 주고받으며, 호환성을 높이기 위해 가능한 한 여러 표현을 함께 넣는 폴리필 전략이 잘 통합니다.
클립보드는 크게 세 가지 동작으로 요약됩니다.
첫째, 애플리케이션이 데이터를 설정합니다.
둘째, 외부 또는 내부에서 복사된 내용을 가져와 해석합니다.
셋째, 포맷이 여러 개인 경우 우선순위를 정해 가장 풍부한 표현에서 더 단순한 표현으로 단계적으로 폴백합니다.
이때 QMimeData는 다양한 타입을 한 번에 담을 수 있어, 예를 들어 HTML과 순수 텍스트를 동시에 넣고, 그림과 함께 텍스트 대체 값을 제공하는 식의 다중 포맷 구성이 가능합니다.
🗂️ 데이터 모델과 책임 범위
QClipboard는 시스템 클립보드에 대한 단일 진입점이며, mode(Clipboard, Selection 등)별 접근을 제공합니다.
QMimeData는 실제 페이로드와 MIME 타입 문자열을 관리합니다.
드래그 앤 드롭 경로에서는 QDrag가 씬에서 포인터 이동과 투영을 담당하고, 드롭 수신 위젯은 dragEnterEvent, dropEvent 등 이벤트에서 event.mimeData()를 조회해 적합한 타입을 소비합니다.
결국 “무엇을 어떤 키로 넣고, 우선순위를 어떻게 정할지”를 명확히 정의하는 것이 호환성의 출발점입니다.
🧱 최소 보장 규칙과 폴백 전략
가장 풍부한 포맷을 먼저 제공하고, 동시에 범용 포맷을 함께 제공하는 것이 실전 규칙입니다.
예를 들어 HTML을 제공할 때는 동일한 내용의 평문 텍스트도 함께 넣어 브라우저 외 앱에서 깨지지 않도록 합니다.
이미지를 제공할 때는 내부 비트맵과 함께 클립보드가 이해하기 쉬운 표준 이미지 포맷을 병행합니다.
URL과 파일 경로는 QUrl 리스트를 활용하고, 텍스트 대체를 추가해 검색 가능성과 접근성을 동시에 확보합니다.
- 🗒️텍스트는 plain text와 함께 HTML이 있으면 둘 다 제공
- 🖼️이미지는 QImage와 표준 포맷의 바이트도 고려
- 🔗URL/파일은 QUrl 리스트와 대체 텍스트를 동시 제공
- 🧪외부 앱에 붙여넣기 테스트를 자동화 스크립트로 반복 검증
from PySide6.QtWidgets import QApplication
from PySide6.QtGui import QClipboard, QGuiApplication, QImage, QPixmap
from PySide6.QtCore import QMimeData, QUrl
app = QApplication([])
# 1) 복합 클립보드 쓰기: HTML + PlainText + URL
mime = QMimeData()
html = "<p><b>Qt Clipboard</b> with <i>HTML</i></p>"
plain = "Qt Clipboard with HTML"
mime.setHtml(html)
mime.setText(plain)
# URL과 텍스트를 함께 제공
urls = [QUrl.fromLocalFile("/path/to/file.txt"), QUrl("https://www.qt.io")]
mime.setUrls(urls)
# 이미지가 있다면 함께 제공
img = QImage(120, 60, QImage.Format_RGBA8888)
img.fill(0xff336699)
mime.setImageData(img)
QGuiApplication.clipboard().setMimeData(mime, QClipboard.Mode.Clipboard)
# 2) 읽기: 우선순위대로 소비
cb = QGuiApplication.clipboard()
md = cb.mimeData()
if md.hasHtml():
html_in = md.html()
elif md.hasText():
text_in = md.text()
elif md.hasImage():
qimg = md.imageData()
elif md.hasUrls():
dropped = [u.toString() for u in md.urls()]
| 개념 | 핵심 포인트 |
|---|---|
| QClipboard | 시스템 클립보드와 동기화되는 진입점. 단일 인스턴스 접근. Mode 선택 가능. |
| QMimeData | 여러 MIME 타입을 동시 보관. 가장 풍부한 포맷 우선 제공 후 폴백. |
| QDrag | 드래그 소스 설정과 진행 제어. 수신 위젯은 이벤트에서 mimeData를 소비. |
💡 TIP: HTML을 넣을 때는 동일한 내용의 plain text를 함께 제공해 워드 프로세서, 노트 앱 등에서 서식 손실 시에도 의미가 유지되도록 만듭니다.
⚠️ 주의: 일부 앱은 자체 커스텀 포맷만 소비하거나 보안 정책으로 이미지·파일 드롭을 제한할 수 있습니다.
이 경우에도 텍스트 대체와 URL 리스트를 제공하면 최소 기능은 유지됩니다.
🧪 텍스트와 HTML 포맷 호환성 체크리스트
PySide에서 텍스트와 HTML 데이터를 클립보드나 드래그로 주고받을 때 가장 많이 발생하는 문제가 바로 MIME 포맷 불일치입니다.
Qt는 내부적으로 text/plain과 text/html을 함께 다루지만, 외부 앱에서는 단일 포맷만 처리하는 경우가 많습니다.
예를 들어, 크롬 브라우저나 엣지에서 복사한 HTML은 리치 텍스트 편집기에서는 잘 붙여넣어지지만, 일반 텍스트 에디터에서는 공백이나 태그가 그대로 노출될 수 있습니다.
반대로 PySide 앱에서 복사한 HTML이 외부 오피스 프로그램에 붙여넣기되지 않는다면 MIME 헤더 선언이 누락된 경우가 많습니다.
MIME 타입의 핵심은 표준 문자열입니다.
HTML은 반드시 text/html, 순수 텍스트는 text/plain을 사용해야 하며, Qt는 setText(), setHtml() 메서드로 자동 처리합니다.
그러나 클립보드 교환 시에는 setData()로 직접 MIME 포맷을 지정할 수도 있습니다.
이 방식은 리치 에디터나 이메일 클라이언트처럼 HTML과 PlainText를 함께 지원하는 환경에서 안정적인 붙여넣기 품질을 보장합니다.
🧾 MIME 포맷 매칭의 실제 예시
다음 코드는 HTML과 PlainText를 동시에 클립보드에 등록해, 워드·브라우저·메모장 간의 포맷 호환성을 유지하는 방법을 보여줍니다.
HTML을 붙여넣을 수 없는 프로그램에서는 자동으로 PlainText가 대체됩니다.
mime = QMimeData()
html_content = "<p><b>PySide Clipboard Test</b></p>"
plain_text = "PySide Clipboard Test"
# 두 포맷 동시 등록
mime.setHtml(html_content)
mime.setText(plain_text)
# 직접 MIME 등록 방식
mime.setData("text/html", html_content.encode("utf-8"))
mime.setData("text/plain", plain_text.encode("utf-8"))
QApplication.clipboard().setMimeData(mime)
이 방식으로 데이터를 넣으면, 브라우저·워드·슬랙 등 다양한 프로그램이 각자의 환경에 맞는 포맷을 자동 선택합니다.
PySide는 이 과정을 운영체제 클립보드 API를 통해 자동 위임하므로, 별도의 변환 과정 없이도 플랫폼 간 일관성이 확보됩니다.
📋 텍스트 포맷 호환성 체크리스트
- 🧩HTML과 PlainText를 항상 함께 제공해 폴백 가능성을 확보
- 📎setHtml()과 setText()를 병행 사용하거나 setData()로 직접 MIME 지정
- 🧱HTML 내 CSS 스타일은 inline으로 처리해 외부 앱에서 서식 누락 방지
- 🧭macOS는 RTF 기반 리치 텍스트를 병행 지원하므로 별도 포맷 고려
💬 PySide는 내부적으로 QTextDocument 기반의 HTML 파서를 사용합니다.
즉, 브라우저처럼 완전한 HTML5는 아니지만, 기본적인 태그·스타일·링크 구조는 대부분 지원합니다.
💡 TIP: HTML을 복사할 때 내부 이미지까지 포함시키려면 Base64 인라인 인코딩 방식을 사용해야 하며, 외부 URL 참조 이미지는 브라우저 이외의 앱에서 표시되지 않습니다.
⚠️ 주의: Windows의 일부 보안 소프트웨어나 리치 텍스트 편집기는 HTML 복사 시 자동으로 스크립트 태그를 제거합니다.
PySide 앱에서는 sanitize 처리 후 전달하는 것이 안전합니다.
🖼️ 이미지와 URL·파일 드롭을 위한 MIME 타입 매핑
PySide(Qt for Python)에서 이미지, 파일, URL을 드래그 앤 드롭으로 주고받기 위해서는 각 데이터의 MIME 타입을 명확히 지정해야 합니다.
예를 들어 이미지는 image/png 또는 image/jpeg, 파일 경로는 text/uri-list로 처리해야 네이티브 환경과 호환됩니다.
이는 윈도우 탐색기, macOS Finder, 리눅스의 Nautilus 등에서 파일을 드롭했을 때 경로를 인식하게 만드는 핵심 포인트이기도 합니다.
Qt의 QMimeData 객체는 여러 MIME 타입을 동시에 보유할 수 있으므로, 이미지와 파일을 함께 전달하거나, URL과 썸네일 이미지를 병행해 전송할 수도 있습니다.
이러한 방식은 이메일 클라이언트, 이미지 뷰어, 클라우드 동기화 앱 등 다양한 외부 프로그램과의 상호 운용성을 강화합니다.
🪄 이미지 데이터 교환 구조
이미지는 단순히 비트맵 데이터를 복사하는 것뿐만 아니라, QImage 또는 QPixmap 형태로 등록하여 OS 클립보드가 인식할 수 있도록 해야 합니다.
PySide에서는 다음과 같은 코드로 이미지 데이터를 복사할 수 있습니다.
img = QImage("/path/to/sample.png")
mime = QMimeData()
mime.setImageData(img)
# 드래그 또는 클립보드 전송
QApplication.clipboard().setMimeData(mime)
이렇게 하면 포토샵, 그림판, 파워포인트 등 외부 그래픽 프로그램에서도 이미지 붙여넣기가 바로 작동합니다.
단, 일부 환경에서는 QPixmap보다 QImage를 사용하는 것이 더 호환성이 좋습니다.
이는 픽스맵이 GPU 메모리 기반이라 직렬화에 제약이 있기 때문입니다.
📁 파일 및 URL 드롭 처리
파일을 드롭할 때는 운영체제별 파일 경로가 QUrl 리스트로 전달됩니다.
QMimeData에서 text/uri-list 타입을 인식해 이를 변환하면 손쉽게 파일 경로를 가져올 수 있습니다.
다음은 기본적인 드롭 수신 예제입니다.
def dropEvent(self, event):
mime = event.mimeData()
if mime.hasUrls():
paths = [url.toLocalFile() for url in mime.urls()]
print("드롭된 파일:", paths)
elif mime.hasText():
print("텍스트:", mime.text())
event.acceptProposedAction()
| 데이터 타입 | MIME 포맷 | 예시 설명 |
|---|---|---|
| 텍스트 | text/plain | 일반 문자열 데이터 |
| HTML | text/html | 리치 텍스트 서식 포함 |
| 이미지 | image/png, image/jpeg | QImage, QPixmap에서 사용 |
| 파일 경로 / URL | text/uri-list | 드롭 이벤트에서 다중 파일 전달 |
💎 핵심 포인트:
드래그 앤 드롭은 클립보드와 동일한 MIME 구조를 사용하므로, 한 번 구현하면 두 시스템에서 동시에 재활용할 수 있습니다.
⚠️ 주의: macOS에서는 Finder에서 드롭된 파일 경로가 URL 스킴 file:// 형태로 전달됩니다.
PySide에서는 QUrl.toLocalFile()로 변환하지 않으면 경로 문자열이 깨질 수 있습니다.
⚙️ 운영체제별 네이티브 포맷 차이와 안전한 폴백 전략
PySide의 클립보드와 데이터교환 기능은 Qt 프레임워크를 기반으로 하며, 각 운영체제(OS)의 네이티브 API와 직접 연결됩니다.
이 때문에 동일한 코드라도 윈도우, macOS, 리눅스에서 MIME 포맷 처리 방식이 다르게 동작할 수 있습니다.
예를 들어 윈도우는 CF_UNICODETEXT와 CF_HTML 구조를 사용하고, macOS는 NSPasteboard를 통해 RTF·PDF·TIFF 등 복합 포맷을 제공합니다.
리눅스의 경우 X11 또는 Wayland 클립보드를 통해 MIME 중심으로 데이터를 주고받습니다.
이러한 차이를 무시하고 단일 포맷만 등록하면 붙여넣기 시 내용이 사라지거나, 서식이 깨지는 현상이 발생할 수 있습니다.
따라서 안정적인 폴백(Fallback) 전략을 반드시 구축해야 합니다.
즉, 하나의 데이터를 여러 포맷으로 동시에 저장하고, 수신 측에서 인식 가능한 포맷을 자동으로 선택하게 만드는 것이 핵심입니다.
🪟 운영체제별 데이터 처리 차이
| 운영체제 | 주요 클립보드 포맷 | 특징 |
|---|---|---|
| Windows | CF_UNICODETEXT, CF_HTML, CF_DIB | HTML 붙여넣기 시 시작/종료 주석 필요 (Version:0.9) |
| macOS | NSPasteboardTypeString, RTF, TIFF | 리치 텍스트 우선, PDF와 이미지 병행 지원 |
| Linux | text/plain, text/html, image/png | MIME 기반으로 표준화, Wayland에서 호환성 강화 |
Qt는 내부적으로 각 포맷을 자동 변환하지만, OS별 특수 규칙을 이해하면 문제 해결이 한결 쉬워집니다.
예를 들어 윈도우의 CF_HTML은 반드시 시작 태그 “StartHTML:”과 “EndHTML:” 인덱스가 포함되어야 하고, macOS의 NSPasteboard는 복합 포맷을 자동 교환하므로 굳이 다중 MIME 등록이 필요 없습니다.
리눅스에서는 X11 환경에서 선택 버퍼(Selection clipboard)와 일반 클립보드가 별도로 존재하므로 두 모드(QClipboard.Selection, QClipboard.Clipboard)를 모두 고려해야 합니다.
🧩 안전한 폴백 전략 구현
운영체제별 차이를 줄이기 위해서는 다중 포맷 제공이 가장 확실한 방법입니다.
예를 들어 이미지를 클립보드에 넣을 때는 image/png와 application/octet-stream을 함께 제공하고, 텍스트는 text/plain과 text/html을 병행합니다.
또한 Qt의 mimeDataChanged 시그널을 활용하면, 외부 프로그램이 새로운 데이터 형식을 삽입했을 때 자동으로 확인할 수 있습니다.
- 🧠다중 포맷 등록으로 클립보드 교환 시 호환성 극대화
- 🧾윈도우 HTML 교환 시 CF_HTML 규격 준수
- 🍏macOS는 NSPasteboard 타입 매핑으로 자동 처리
- 🐧리눅스 X11/Wayland 환경은 Selection 버퍼 고려
💬 Qt는 OS별 MIME 포맷을 자동 감지하므로, 개발자는 setMimeData()에서 가능한 많은 포맷을 추가하는 방식으로 “보편적 교환”을 구현할 수 있습니다.
💡 TIP: 윈도우에서 클립보드 교환 테스트 시, WordPad 또는 MS Word를 이용하면 HTML/RTF 포맷 호환성을 손쉽게 검증할 수 있습니다.
⚠️ 주의: 일부 리눅스 배포판은 Wayland 기반에서 QClipboard의 Selection 모드가 제한될 수 있습니다.
이 경우 xclip 또는 wl-copy와 같은 외부 도구 연동으로 해결이 가능합니다.
🧰 PySide 코드 예제와 테스트 시나리오
PySide(Qt for Python)에서 클립보드와 드래그 앤 드롭의 호환성을 실제로 검증하려면, 단순히 복사와 붙여넣기를 테스트하는 것만으로는 부족합니다.
운영체제와 외부 애플리케이션이 어떤 MIME 타입을 교환하는지를 직접 확인해야 하며, 이를 위해 QMimeData.formats() 메서드를 활용하면 매우 유용합니다.
이 함수를 통해 실제 클립보드에 저장된 MIME 타입 리스트를 확인할 수 있으며, 복합 데이터의 구조를 시각적으로 디버깅할 수도 있습니다.
🧪 통합 테스트 코드 예시
다음 예제는 PySide6에서 텍스트, HTML, 이미지, 파일 URL을 한 번에 등록하고, 이후 클립보드 데이터를 다시 읽어 MIME 타입별로 출력하는 간단한 테스트 도구입니다.
from PySide6.QtWidgets import QApplication
from PySide6.QtGui import QGuiApplication, QClipboard, QImage
from PySide6.QtCore import QMimeData, QUrl
import sys
app = QApplication(sys.argv)
# 데이터 준비
mime = QMimeData()
mime.setText("PySide clipboard test")
mime.setHtml("<b>PySide clipboard</b> test")
mime.setUrls([QUrl("https://doc.qt.io"), QUrl.fromLocalFile("/tmp/test.txt")])
# 이미지 데이터 포함
img = QImage(100, 50, QImage.Format_ARGB32)
img.fill(0xff99cc33)
mime.setImageData(img)
# 클립보드 등록
QGuiApplication.clipboard().setMimeData(mime)
print("✅ 클립보드에 MIME 데이터 등록 완료")
# 클립보드 데이터 확인
cb = QGuiApplication.clipboard()
md = cb.mimeData()
print("📋 현재 클립보드 포맷 목록:")
for fmt in md.formats():
print(" -", fmt)
if md.hasHtml():
print("HTML:", md.html())
if md.hasText():
print("Text:", md.text())
if md.hasImage():
print("이미지 존재:", True)
if md.hasUrls():
print("URLs:", [u.toString() for u in md.urls()])
이 코드는 운영체제에 따라 서로 다른 MIME 타입 목록을 반환합니다.
예를 들어 윈도우에서는 “text/html”, “CF_HTML”, “image/png” 등이 표시되고, macOS에서는 “public.html”, “public.utf8-plain-text”, “public.tiff” 등의 Apple 타입이 함께 등장합니다.
이를 통해 개발자는 어떤 포맷이 자동 변환되는지 쉽게 파악할 수 있습니다.
🧭 테스트 시나리오 가이드
- 📋브라우저나 워드에서 HTML 복사 후 PySide 앱에서 붙여넣기 테스트
- 🧩PySide 앱에서 복사한 이미지가 그림판, 파워포인트 등에서 정상 붙여넣기 되는지 확인
- 🔗파일 드롭 시 경로가 올바르게 변환되는지 확인 (QUrl.toLocalFile)
- ⚙️OS별 MIME 리스트를 기록해 호환성 리포트로 활용
💎 핵심 포인트:
MIME 데이터는 OS가 자동 변환하므로, 앱 내부에서는 변환 규칙을 최소화하고 포맷 중복 제공으로 안정성을 확보하는 것이 중요합니다.
💡 TIP: Qt Creator의 “MimeType Browser” 도구를 활용하면 각 포맷별 MIME 매핑을 시각적으로 확인할 수 있으며, 이를 기반으로 커스텀 포맷을 등록할 수도 있습니다.
⚠️ 주의: 일부 보안 정책이 엄격한 환경(예: 원격 데스크톱, 가상화 세션)에서는 클립보드 교환이 제한될 수 있습니다.
이 경우 내부 버퍼(QByteArray)를 이용한 임시 데이터 공유로 대체하는 것이 좋습니다.
❓ 자주 묻는 질문 FAQ
PySide에서 클립보드로 이미지를 복사했는데 외부 앱에서 붙여넣기가 안 됩니다.
QMimeData에 setImageData(QImage) 형태로 저장하면 대부분의 앱에서 정상 인식됩니다.
드래그 앤 드롭 시 파일 경로 대신 URL 문자열이 전달됩니다.
QUrl 객체로 변환 후 toLocalFile() 메서드를 호출해야 로컬 경로를 얻을 수 있습니다.
윈도우에서 HTML 붙여넣기가 깨지거나 태그가 표시됩니다.
Qt의 setHtml()은 자동 처리하지만, 직접 setData()를 사용할 경우 포맷 구조를 맞춰야 합니다.
macOS에서 복사된 텍스트가 한글 깨짐 현상을 보입니다.
setText() 대신 setData(“text/plain;charset=utf-8”, text.encode(“utf-8”)) 형태로 지정하면 해결됩니다.
PySide의 클립보드 데이터는 프로그램이 종료되면 사라지나요?
단, Selection 모드(X11)에서는 앱 종료 시 데이터가 사라질 수 있습니다.
드래그로 여러 파일을 동시에 처리하려면 어떻게 하나요?
수신 측에서는 for url in mime.urls(): 형태로 순회하여 처리할 수 있습니다.
PySide와 PyQt의 클립보드 동작은 동일한가요?
클립보드 관련 API(QClipboard, QMimeData)는 완벽하게 호환됩니다.
클립보드에 저장된 MIME 포맷을 직접 확인할 수 있나요?
디버그용으로 print()를 이용해 현재 시스템에 어떤 포맷이 포함되어 있는지 확인하면 됩니다.
🧩 PySide 클립보드와 데이터교환 호환성 정리
PySide(Qt for Python)의 클립보드와 드래그 앤 드롭 기능은 단순한 데이터 이동을 넘어, 운영체제 간의 네이티브 MIME 포맷 호환성을 보장하기 위한 강력한 메커니즘입니다.
텍스트, HTML, 이미지, URL, 파일 경로 등 다양한 데이터 유형을 올바른 MIME 타입으로 구성하면, 외부 앱과의 데이터 교환 품질이 비약적으로 향상됩니다.
또한 OS별 차이를 고려한 폴백 전략과 다중 포맷 등록은 호환성을 유지하는 데 핵심적입니다.
개발자는 QClipboard, QMimeData, QDrag의 구조를 이해하고, 복합 포맷을 함께 제공함으로써 리치 텍스트 편집기, 브라우저, 오피스 프로그램 등 다양한 환경에서의 데이터 호환 문제를 쉽게 해결할 수 있습니다.
특히 MIME 리스트를 직접 확인하거나 테스트 코드를 통해 운영체제별 포맷 차이를 기록해두면, 이후 유지보수나 이식 시에도 큰 도움이 됩니다.
결국 PySide의 데이터교환은 “표준 포맷의 정확한 선언”과 “플랫폼 맞춤형 대응”이 조화될 때 비로소 완벽해집니다.
이 글에서 소개한 MIME 매핑 규칙과 예제 코드를 활용하면, 어떤 환경에서도 안정적이고 일관된 클립보드/드래그 교환 기능을 구현할 수 있습니다.
🏷️ 관련 태그 : PySide, QtforPython, QClipboard, QMimeData, 클립보드호환성, 데이터교환, 드래그앤드롭, MIME타입, GUI프로그래밍, 파이썬데스크탑