PySide6์ QWebEngineView๋ก ์น ๋ธ๋ผ์ฐ์ ๊ธฐ๋ฅ ๊ตฌํํ๊ธฐ
QWebEngineView๋ Qt์ ์น ๋ ๋๋ง ์์ง์ ํ์ฉํด, Python ๊ธฐ๋ฐ GUI ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ๊ณ ๊ธ ์น ๊ธฐ๋ฅ์ ๊ตฌํํ ์ ์๊ฒ ํด์ค๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ, ํ์ ์ฐฝ, ๋น๋์ค ์๋์ฌ์, ์ ์ฒดํ๋ฉด, ์ฌ์ง์ด ๊ฐ๋ฐ์ ๋๊ตฌ๊น์ง! ๊ธฐ๋ณธ ์ค์ ๋ง์ผ๋ก๋ ์ ๋ณด์ด๋ ๊ธฐ๋ฅ๋ค์ ์ค์ ํ ์ ์์ต๋๋ค.
์ด ๊ธ์์๋ PySide6๋ฅผ , QWebEngineView๋ฅผ ์น ๋ธ๋ผ์ฐ์ ์ฒ๋ผ ์ฌ์ฉํ๋ ๋ฐ ํ์ํ ์ค์ ๋ฐฉ๋ฒ์ ํญ๋ชฉ๋ณ๋ก ์ ๋ฆฌ ํด๋ด ๋๋ค. ๊ฐ๊ฐ์ ๊ธฐ๋ฅ์ด ์ ํ์ํ์ง, ์ด๋ป๊ฒ ์ค์ ํ๋์ง, ๊ทธ๋ฆฌ๊ณ ์ค๋ฌด์์ ์ด๋ป๊ฒ ํ์ฉ๋ ์ ์๋์ง ์ฝ๊ฒ ํ์ ํ ์ ์์ต๋๋ค.
PySide6 QWebEngineView ์๋ฐ์คํฌ๋ฆฝํธ, ํ์ , ๋ฏธ๋์ด ์ค์ ์ ๋ฆฌ
PySide6์
QWebEngineView๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์คํฌํ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์น ๋ธ๋ผ์ฐ์ ์ฒ๋ผ ๋์ํ๋๋ก ์ค์ ํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
1. ๊ธฐ๋ณธ ์น ๊ธฐ๋ฅ ํ์ฑํ
์น ํ์ด์ง๊ฐ ์๋ฐ์คํฌ๋ฆฝํธ, ๋ก์ปฌ์คํ ๋ฆฌ์ง ๋ฑ์ ์ฌ์ฉํ ์ ์๋๋ก ์ค์ ํฉ๋๋ค.
settings = self.webview.settings()
settings.setAttribute(QWebEngineSettings.JavascriptEnabled, True)
settings.setAttribute(QWebEngineSettings.LocalStorageEnabled, True)
settings.setAttribute(QWebEngineSettings.PluginsEnabled, True)
settings.setAttribute(QWebEngineSettings.WebGLEnabled, True)
- JavascriptEnabled: ๋๋ถ๋ถ์ ํ๋ ์น ํ์ด์ง๊ฐ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ๋ฏ๋ก ํ์์ ๋๋ค. ์ด ๊ธฐ๋ฅ์ด ๊บผ์ ธ ์์ผ๋ฉด ์น ํ์ด์ง๊ฐ ์ ์ ์๋ํ์ง ์๊ฑฐ๋, ๋ฒํผ ํด๋ฆญ, ๋ฉ๋ด ์ด๋ ๋ฑ์ด ์ ๋ ์ ์์ต๋๋ค.
- LocalStorageEnabled: ์น ํ์ด์ง๊ฐ ๋ธ๋ผ์ฐ์ ๋ด์ ์ ๋ณด๋ฅผ ์ ์ฅํ ์ ์๋๋ก ํฉ๋๋ค. ๋ธ๋ผ์ฐ์ ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํด๋๊ณ ๋ค์ ์ ์ ์ ๋ถ๋ฌ์ฌ ์ ์๋ ๊ธฐ๋ฅ์ ๋๋ค.
- PluginsEnabled: PDF ๋ทฐ์ด๋ ๋ฏธ๋์ด ๊ธฐ๋ฅ์ ์ํ ํ๋ฌ๊ทธ์ธ ์ง์.
- WebGLEnabled: 3D ๊ทธ๋ํฝ ์ฝํ ์ธ ๋ฅผ ์ง์ํฉ๋๋ค.
2. ํ์ ๋ฐ ์ฐฝ ๊ด๋ จ ๊ธฐ๋ฅ
์น ํ์ด์ง์์๋ ์ฌ์ฉ์์ ํด๋ฆญ์ด๋ ์๋ ๋์์ ํตํด ์ ์ฐฝ์ ์ด๊ฑฐ๋ ํ์
์ ๋์ฐ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ํ์ง๋ง QWebEngineView๋ ๋ณด์ ๋ฐ ์ฑ๋ฅ์์ ์ด์ ๋ก ์ด๋ฌํ ๊ธฐ๋ฅ๋ค์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฐจ๋จํ๊ณ ์์ต๋๋ค.
๊ทธ๋์ ์ผ๋ฐ ์น ๋ธ๋ผ์ฐ์ ์ฒ๋ผ ๋์ํ๋๋ก ํ๋ ค๋ฉด ์ง์ ์ค์ ์ ํตํด ๊ธฐ๋ฅ์ ํ์ฑํํด์ค์ผ ํฉ๋๋ค.
settings.setAttribute(QWebEngineSettings.JavascriptCanOpenWindows, True)
settings.setAttribute(QWebEngineSettings.AllowWindowActivationFromJavaScript, True)
settings.setAttribute(QWebEngineSettings.AllowGeolocationOnInsecureOrigins, True)
settings.setAttribute(QWebEngineSettings.FullScreenSupportEnabled, True)
- JavascriptCanOpenWindows
์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ์ ์ฐฝ์ ์ด ์ ์๋๋ก ํ์ฉํฉ๋๋ค.์น์์ window.open() ๋ช ๋ น์ด ๋์ํ๋ ค๋ฉด ์ด ์ค์ ์ด ํ์ํฉ๋๋ค.
์: ๋งํฌ ํด๋ฆญ ์ ์ ํญ์ผ๋ก ์ด๋ฆฌ๋ ๊ฒฝ์ฐ, ๊ด๊ณ ํ์ ๋ฑ. - AllowWindowActivationFromJavaScript
์๋ฐ์คํฌ๋ฆฝํธ๋ก ์ด๋ฆฐ ์ ์ฐฝ์ด ์๋์ผ๋ก ํ์ฑํ(ํฌ์ปค์ค ์ด๋) ๋๋๋ก ํ์ฉํฉ๋๋ค.์ฌ์ฉํ์ง ์์ผ๋ฉด ํ์ ์ด ๋ค์ ์จ์ด ๋ณด์ด์ง ์์ ์ ์์ต๋๋ค. - AllowGeolocationOnInsecureOrigins
HTTPS๊ฐ ์๋ ์น์ฌ์ดํธ์์๋ ์์น ์ ๋ณด(GPS ๋ฑ)๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ํ์ฉํฉ๋๋ค.๋ณด์์ ๋ฏผ๊ฐํ ์ ์์ผ๋ฏ๋ก ํ์ํ ๋๋ง ์ผ๋ ๊ฒ์ด ์ข์ต๋๋ค. - FullScreenSupportEnabled
์น ํ์ด์ง์์ ์ ์ฒด ํ๋ฉด ๋ชจ๋๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ํด์ค๋๋ค.์น ๊ธฐ๋ฐ ํ๋ ์ ํ ์ด์ ์ฑ์ด ์ ์ฒด ํ๋ฉด์ ์ง์ํ๋ ค๋ฉด ๊ผญ ํ์ํฉ๋๋ค.
3. ๋ฏธ๋์ด ๊ด๋ จ ๊ธฐ๋ฅ
์น ํ์ด์ง์์ ๋น๋์ค๋ ์ค๋์ค๋ฅผ ์ฌ์ํ๊ฑฐ๋, ํ๋ฉด ์บก์ฒ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๋ฑ์ ๋ฏธ๋์ด ๊ด๋ จ ๊ธฐ๋ฅ์ ๋ง์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ค์ํ ์ญํ ์ ํฉ๋๋ค. QWebEngineView์์๋ ์ด๋ฌํ ๊ธฐ๋ฅ๋ค์ ํ์ฑํํ ์ ์์ต๋๋ค.
settings.setAttribute(QWebEngineSettings.PlaybackRequiresUserGesture, False)
settings.setAttribute(QWebEngineSettings.AutoLoadIconsForPage, True)
settings.setAttribute(QWebEngineSettings.ScreenCaptureEnabled, True)
settings.setAttribute(QWebEngineSettings.WebRTCPublicInterfacesOnly, False)
PlaybackRequiresUserGesture
- ๊ธฐ๋ฅ: ์ด ์ค์ ์ ์น ํ์ด์ง์์ ๋น๋์ค๋ ์ค๋์ค๊ฐ ์๋์ผ๋ก ์ฌ์๋ ์ ์๋๋ก ํ์ฉํฉ๋๋ค.
- ๊ธฐ๋ณธ ๋์: ๋๋ถ๋ถ์ ์น ๋ธ๋ผ์ฐ์ ์์๋ ์ฌ์ฉ์๊ฐ ํด๋ฆญํ๊ฑฐ๋ ์คํฌ๋กค์ ํ ํ์์ผ ๋ฏธ๋์ด๊ฐ ์ฌ์๋ฉ๋๋ค.
- ์ค๋ช : PlaybackRequiresUserGesture๋ฅผ False๋ก ์ค์ ํ๋ฉด, ์ฌ์ฉ์์ ํด๋ฆญ ์์ด๋ ์๋์ผ๋ก ๋น๋์ค๋ ์ค๋์ค๊ฐ ์ฌ์๋๋๋ก ํ ์ ์์ต๋๋ค.
AutoLoadIconsForPage
- ๊ธฐ๋ฅ: ์น ํ์ด์ง๋ฅผ ๋ก๋ํ ๋, ํ๋น์ฝ(์์ ์์ด์ฝ)์ ์๋์ผ๋ก ๋ก๋ํ๋๋ก ์ค์ ํฉ๋๋ค.
- ์ค๋ช : ๊ฐ ์น์ฌ์ดํธ๋ ๋ธ๋ผ์ฐ์ ํญ์ ์์ ์์ด์ฝ์ ํ์ํ๋๋ฐ, ์ด๋ฅผ ํ๋น์ฝ์ด๋ผ๊ณ ๋ถ๋ฆ ๋๋ค. ์ด ์ค์ ์ True๋ก ํ์ฑํํ๋ฉด, ์น ํ์ด์ง๊ฐ ๋ก๋๋ ๋ ์๋์ผ๋ก ํด๋น ์ฌ์ดํธ์ ์์ด์ฝ๋ ํจ๊ป ๋ก๋๋ฉ๋๋ค.
ScreenCaptureEnabled
- ๊ธฐ๋ฅ: ํ๋ฉด ์บก์ฒ ๊ธฐ๋ฅ์ ํ์ฑํํฉ๋๋ค.
- ์ค๋ช : ์ด ์ค์ ์ ํ์ฑํํ๋ฉด ์น ํ์ด์ง์์ ํ๋ฉด ์บก์ฒ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๊ฒ ๋ฉ๋๋ค.
- ์ฃผ์์ฌํญ: ์ฌ์ฉ์๊ฐ ํ์ด์ง์์ ์บก์ฒํ ์ ์๋ ์ฝํ ์ธ ๊ฐ ๋ฌด์์ธ์ง์ ๋ฐ๋ผ ๋ณด์์ด๋ ํ๋ผ์ด๋ฒ์์ ๊ด๋ จ๋ ๊ณ ๋ ค๊ฐ ํ์ํ ์ ์์ต๋๋ค.
WebRTCPublicInterfacesOnly
- ๊ธฐ๋ฅ: WebRTC(์น ์ค์๊ฐ ํต์ )๋ฅผ ์ฌ์ฉํ ๋ ๊ณต๊ฐ๋ ์ธํฐํ์ด์ค๋ง ์ฌ์ฉํ๋๋ก ์ค์ ํฉ๋๋ค.
- ์ค๋ช : WebRTC๋ ์ค์๊ฐ ๋น๋์ค ๋ฐ ์ค๋์ค ํตํ๋ฅผ ์ง์ํ๋ ๊ธฐ์ ๋ก, ์๋ฅผ ๋ค์ด, ๊ตฌ๊ธ Meet๋ Zoom๊ณผ ๊ฐ์ ํ์ ํ์ ์ฑ์์ ์ฌ์ฉ๋ฉ๋๋ค. ์ด ์ค์ ์ False๋ก ์ค์ ํ๋ฉด, WebRTC์ ์ ์ฒด ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด, ์ค์๊ฐ ํตํ, ๋น๋์ค ์คํธ๋ฆฌ๋ฐ, P2P ์ฐ๊ฒฐ ๋ฑ์ ๊ธฐ๋ฅ์ ํ์ฑํํ ์ ์์ต๋๋ค.
- ์ค์ ์ด ์ค์ํ ์ด์ : WebRTCPublicInterfacesOnly๋ฅผ True๋ก ์ค์ ํ๋ฉด WebRTC์ ์ผ๋ถ ๊ธฐ๋ฅ๋ง ์ฌ์ฉ ๊ฐ๋ฅํ๋ฉฐ, ์ ํ์ ์ธ ํต์ ๋ง ์ง์๋๋ฏ๋ก ์ ๋ฉด์ ์ธ WebRTC ๊ธฐ๋ฅ์ ์ฌ์ฉํ ๊ฒฝ์ฐ์๋ False๋ก ์ค์ ํด์ผ ํฉ๋๋ค.
4. ๋ณด์ ๋ฐ ์ ๊ทผ ๊ถํ
์น ํ์ด์ง๊ฐ ์ธ๋ถ ๋ฆฌ์์ค์ ์ ๊ทผํ๊ฑฐ๋, ๋ก์ปฌ ํ์ผ์ ์ฌ์ฉํ ์ ์๋๋ก ํ๋ ์ค์ ์ ์ค์ํ ๋ณด์ ์ธก๋ฉด์ ๋ค๋ฃน๋๋ค. ์ด๋ฌํ ์ค์ ๋ค์ ์น ํ์ด์ง๊ฐ ๋ก์ปฌ ํ์ผ์ด๋ ์๊ฒฉ ๋ฆฌ์์ค์ ์ํธ์์ฉํ ์ ์๋๋ก ํ์ฉํฉ๋๋ค.
settings.setAttribute(QWebEngineSettings.LocalContentCanAccessRemoteUrls, True)
settings.setAttribute(QWebEngineSettings.LocalContentCanAccessFileUrls, True)
settings.setAttribute(QWebEngineSettings.HyperlinkAuditingEnabled, True)
settings.setAttribute(QWebEngineSettings.AllowRunningInsecureContent, True)
LocalContentCanAccessRemoteUrls
- ๊ธฐ๋ฅ: ๋ก์ปฌ ์ฝํ ์ธ ๊ฐ ์๊ฒฉ URL์ ์ ๊ทผํ ์ ์๋๋ก ํ์ฉํฉ๋๋ค.
- ์ค๋ช : ์ด ์ค์ ์ ๋ก์ปฌ ํ์ผ ์์คํ ์์ ์คํ ์ค์ธ HTML ํ์ผ์ด ์ธ๋ถ ์์(์: ์ธ๋ถ ์๋ฒ์์ ์ ๊ณตํ๋ ์ด๋ฏธ์ง๋ ์คํ์ผ ์ํธ, JavaScript ํ์ผ ๋ฑ)์ ๋ก๋ํ ์ ์๋๋ก ํฉ๋๋ค. ๋ณดํต ๋ก์ปฌ ํ์ผ(file://)์์ ์๊ฒฉ URL(http:// ๋๋ https://)์ ์ฐธ์กฐํ๋ ๊ฒ์ ๋ณด์์ ์ ํ์ด ์์ง๋ง, ์ด ์ค์ ์ True๋ก ์ค์ ํ๋ฉด ์ด๋ฌํ ์ ํ์ ํด์ ํ์ฌ ์น ํ์ด์ง๊ฐ ๋ก์ปฌ ์ฝํ ์ธ ์์ ์ธ๋ถ ์์์ ์ ๊ทผํ๋๋ก ํ์ฉํฉ๋๋ค.
LocalContentCanAccessFileUrls
- ๊ธฐ๋ฅ: ๋ก์ปฌ ํ์ผ ์ฝํ ์ธ ๊ฐ ๋ก์ปฌ ํ์ผ ์์คํ ์์ ๋ค๋ฅธ ํ์ผ์ ์ ๊ทผํ ์ ์๋๋ก ํ์ฉํฉ๋๋ค.
- ์ค๋ช : ๋ก์ปฌ HTML ํ์ผ์ด ๋ค๋ฅธ ๋ก์ปฌ ํ์ผ์ ์ ๊ทผํ๋ ๊ธฐ๋ฅ์ ํ์ฑํํฉ๋๋ค. ์๋ฅผ ๋ค์ด, HTML ํ์ผ์ด ๋ก์ปฌ์ ์ด๋ฏธ์ง ํ์ผ์ด๋ ๋ค๋ฅธ ๋ฆฌ์์ค๋ฅผ ๋ก๋ํ๋ ค๊ณ ํ ๋ ์ด ์ค์ ์ด ํ์ํฉ๋๋ค.
HyperlinkAuditingEnabled
- ๊ธฐ๋ฅ: ํ์ดํผ๋งํฌ ํด๋ฆญ ์ ๋งํฌ ๊ฐ์ฌ ๊ธฐ๋ฅ์ ํ์ฑํํฉ๋๋ค.
- ์ค๋ช : ์ด ์ค์ ์ ํ์ฑํํ๋ฉด ์น ํ์ด์ง์์ ํ์ดํผ๋งํฌ๋ฅผ ํด๋ฆญํ ๋, ํด๋น ๋งํฌ์ ๋ฐฉ๋ฌธ ์ํ๋ฅผ ์ถ์ ํ๊ณ ๊ธฐ๋กํ๋ ๊ธฐ๋ฅ์ด ์๋ํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋งํฌ๊ฐ ํด๋ฆญ๋์๋์ง ์ฌ๋ถ๋ฅผ ์ถ์ ํ ์ ์์ต๋๋ค. ์ด๋ฌํ ๋งํฌ ๊ฐ์ฌ ๊ธฐ๋ฅ์ ์ฌ์ฉ์์ ํด๋ฆญ์ ์ถ์ ํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
AllowRunningInsecureContent
- ๊ธฐ๋ฅ: ํผํฉ ์ฝํ ์ธ (mixed content)๊ฐ ์คํ๋๋๋ก ํ์ฉํฉ๋๋ค.
- ์ค๋ช : ํผํฉ ์ฝํ ์ธ ๋, HTTPS ์น ํ์ด์ง์์ HTTP๋ฅผ ํตํด ๋ถ๋ฌ์ค๋ ๋ฆฌ์์ค๋ฅผ ์๋ฏธํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ณด์์ด ์ ์ฉ๋ ์น ํ์ด์ง(HTTPS)์์ ๋ณด์๋์ง ์์ ๋ฆฌ์์ค(HTTP)๋ฅผ ํธ์ถํ ๋ ๋ฐ์ํฉ๋๋ค. AllowRunningInsecureContent๋ฅผ True๋ก ์ค์ ํ๋ฉด HTTPS ์น ํ์ด์ง์์ HTTP ์ฝํ ์ธ ๋ฅผ ๋ถ๋ฌ์ค๊ฑฐ๋ ์คํํ ์ ์๊ฒ ๋ฉ๋๋ค..
5. ๊ฐ๋ฐ์ ๋๊ตฌ ํ์ฑํ
settings.setAttribute(QWebEngineSettings.DeveloperExtrasEnabled, True)
settings.setAttribute(QWebEngineSettings.Accelerated2dCanvasEnabled, True)
settings.setAttribute(QWebEngineSettings.ScrollAnimatorEnabled, True)
์ด ์ค์ ์ F12๋ฅผ ๋๋ ์ ๋ ๋์ค๋ ํฌ๋กฌ ๊ฐ๋ฐ์ ๋๊ตฌ์ฒ๋ผ ๋๋ฒ๊น ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
6. ์ฌ์ฉ์ ์์ด์ ํธ(User-Agent) ์ค์
profile = self.webview.page().profile()
profile.setHttpUserAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64)...")
์น์ฌ์ดํธ์ ์ ์ ์ ์ด๋ค ๋ธ๋ผ์ฐ์ ๋ก ์ ์ํ๋์ง๋ฅผ ์๋ฒ์ ์๋ฆฝ๋๋ค. ๋ชจ๋ฐ์ผ ์ฌ์ดํธ ์ฐํ, ํน์ ๊ธฐ๋ฅ ํด์ ๋ฑ์ ์ฌ์ฉ๋ฉ๋๋ค.
7. ์ ์ฒด ์ฝ๋ ์์
def enable_full_browser_features(self):
settings = self.webview.settings()
settings.setAttribute(QWebEngineSettings.JavascriptEnabled, True)
settings.setAttribute(QWebEngineSettings.LocalStorageEnabled, True)
settings.setAttribute(QWebEngineSettings.PluginsEnabled, True)
settings.setAttribute(QWebEngineSettings.WebGLEnabled, True)
settings.setAttribute(QWebEngineSettings.JavascriptCanOpenWindows, True)
settings.setAttribute(QWebEngineSettings.AllowWindowActivationFromJavaScript, True)
settings.setAttribute(QWebEngineSettings.AllowGeolocationOnInsecureOrigins, True)
settings.setAttribute(QWebEngineSettings.FullScreenSupportEnabled, True)
settings.setAttribute(QWebEngineSettings.PlaybackRequiresUserGesture, False)
settings.setAttribute(QWebEngineSettings.AutoLoadIconsForPage, True)
settings.setAttribute(QWebEngineSettings.ScreenCaptureEnabled, True)
settings.setAttribute(QWebEngineSettings.WebRTCPublicInterfacesOnly, False)
settings.setAttribute(QWebEngineSettings.LocalContentCanAccessRemoteUrls, True)
settings.setAttribute(QWebEngineSettings.LocalContentCanAccessFileUrls, True)
settings.setAttribute(QWebEngineSettings.HyperlinkAuditingEnabled, True)
settings.setAttribute(QWebEngineSettings.AllowRunningInsecureContent, True)
settings.setAttribute(QWebEngineSettings.DeveloperExtrasEnabled, True)
settings.setAttribute(QWebEngineSettings.Accelerated2dCanvasEnabled, True)
settings.setAttribute(QWebEngineSettings.ScrollAnimatorEnabled, True)
profile = self.webview.page().profile()
profile.setPersistentCookiesPolicy(QWebEngineProfile.AllowPersistentCookies)
profile.setCachePath("cache")
profile.setHttpUserAgent("Mozilla/5.0 (...)")
๋ฌธ์ ํด๊ฒฐ ๋ฐฉ๋ฒ
- OpenGL ๋ฌธ์ : ๋ค์ ์ค์ ์ผ๋ก ํด๊ฒฐ ๊ฐ๋ฅ
QApplication.setAttribute(Qt.AA_ShareOpenGLContexts)
- PySide6 ๋ฒ์ : 6.4.0 ์ด์ ๊ถ์ฅ
from PySide6.QtCore import __version__
print(__version__)