1. 기본 변경사항
버전 및 지원
- PyQt5: Python 2.7, 3.5+ 지원, Qt 5.x 기반
- PyQt6: Python 3.6.1+ 지원, Qt 6.x 기반 (더 현대적)
설치 명령어
# PyQt5
pip install PyQt5
# PyQt6
pip install PyQt6
2. Import 구조 변경
기본 모듈
# PyQt5
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtCore import Qt, pyqtSignal
from PyQt5.QtGui import QPixmap, QFont
# PyQt6
from PyQt6.QtWidgets import QApplication, QWidget
from PyQt6.QtCore import Qt, pyqtSignal
from PyQt6.QtGui import QPixmap, QFont
모듈 분리 변경사항
# PyQt5
from PyQt5.QtWidgets import QAction # 위젯에 포함
from PyQt5.QtCore import QRegExp
# PyQt6
from PyQt6.QtGui import QAction # GUI로 이동
from PyQt6.QtCore import QRegularExpression # QRegExp 대체
3. 열거형(Enum) 변경 – 가장 중요한 변화
커서 타입
# PyQt5
Qt.PointingHandCursor
Qt.ArrowCursor
Qt.WaitCursor
# PyQt6
Qt.CursorShape.PointingHandCursor
Qt.CursorShape.ArrowCursor
Qt.CursorShape.WaitCursor
정렬 방식
# PyQt5
Qt.AlignLeft
Qt.AlignCenter
Qt.AlignRight
# PyQt6
Qt.AlignmentFlag.AlignLeft
Qt.AlignmentFlag.AlignCenter
Qt.AlignmentFlag.AlignRight
키보드 키
# PyQt5
Qt.Key_Return
Qt.Key_Escape
Qt.Key_Space
# PyQt6
Qt.Key.Key_Return
Qt.Key.Key_Escape
Qt.Key.Key_Space
애니메이션 이징
# PyQt5
QEasingCurve.InOutQuad
QEasingCurve.OutCubic
# PyQt6
QEasingCurve.Type.InOutQuad
QEasingCurve.Type.OutCubic
프레임 스타일
# PyQt5
QFrame.Box
QFrame.Panel
QFrame.StyledPanel
# PyQt6
QFrame.Shape.Box
QFrame.Shape.Panel
QFrame.Shape.StyledPanel
사이즈 정책
# PyQt5
QSizePolicy.Expanding
QSizePolicy.Fixed
QSizePolicy.Minimum
# PyQt6
QSizePolicy.Policy.Expanding
QSizePolicy.Policy.Fixed
QSizePolicy.Policy.Minimum
4. 메서드 변경사항
애플리케이션 실행
# PyQt5
app.exec_() # 언더스코어 필요
# PyQt6
app.exec() # 언더스코어 제거
스크린 정보 획득
# PyQt5
screen = QApplication.desktop().screenGeometry()
# PyQt6
screen = QApplication.primaryScreen().geometry()
텍스트 코덱 (제거됨)
# PyQt5
QTextCodec.setCodecForLocale(codec) # 사용 가능
# PyQt6
# QTextCodec 완전 제거됨 - 기본적으로 UTF-8 사용
5. 시그널 및 슬롯 변경
시그널 연결
# PyQt5 (둘 다 가능)
button.clicked.connect(self.on_click)
self.connect(button, SIGNAL("clicked()"), self.on_click)
# PyQt6 (새로운 스타일만)
button.clicked.connect(self.on_click)
# 구식 SIGNAL/SLOT 방식 제거됨
6. QRegExp → QRegularExpression
# PyQt5
from PyQt5.QtCore import QRegExp
regex = QRegExp(r'\d+')
# PyQt6
from PyQt6.QtCore import QRegularExpression
regex = QRegularExpression(r'\d+')
7. 네트워킹 모듈 변경
# PyQt5
from PyQt5.QtNetwork import QNetworkAccessManager
# PyQt6
from PyQt6.QtNetwork import QNetworkAccessManager
# 일부 SSL 관련 클래스들이 변경됨
8. OpenGL 관련 변경
# PyQt5
from PyQt5.QtOpenGL import QOpenGLWidget
# PyQt6
from PyQt6.QtOpenGLWidgets import QOpenGLWidget # 별도 모듈로 분리
9. 실용적인 마이그레이션 팁
자동 변환 도구
# 정규식을 이용한 일괄 변환 예시
import re
def convert_qt5_to_qt6(code):
# 기본 import 변경
code = re.sub(r'from PyQt5\.', 'from PyQt6.', code)
# 열거형 변경
code = re.sub(r'Qt\.(\w+)', r'Qt.\1', code) # 기본 패턴
code = re.sub(r'Qt\.PointingHandCursor', 'Qt.CursorShape.PointingHandCursor', code)
code = re.sub(r'Qt\.AlignCenter', 'Qt.AlignmentFlag.AlignCenter', code)
# exec_ → exec
code = re.sub(r'\.exec_\(\)', '.exec()', code)
return code
호환성 레이어
# 버전 호환성을 위한 조건부 import
try:
from PyQt6.QtWidgets import QApplication
from PyQt6.QtCore import Qt
PYQT6 = True
except ImportError:
from PyQt5.QtWidgets import QApplication
from PyQt5.QtCore import Qt
PYQT6 = False
# 조건부 사용
if PYQT6:
cursor = Qt.CursorShape.PointingHandCursor
else:
cursor = Qt.PointingHandCursor
10. 성능 및 기능 개선사항
PyQt6의 장점
- 더 나은 성능: Qt 6 기반으로 최적화됨
- 향상된 HiDPI 지원: 고해상도 디스플레이 지원 개선
- 더 나은 스타일링: 더 현대적인 위젯 스타일
- 보안 강화: 최신 보안 표준 적용
- 타입 힌팅 개선: 더 나은 IDE 지원
주의사항
- 하위 호환성 없음: PyQt5 코드가 그대로 동작하지 않음
- 의존성 증가: 일부 라이브러리가 아직 PyQt6 미지원
- 학습 곡선: 열거형 변경으로 인한 적응 필요
11. 실제 코드 변환 예시
# PyQt5 버전
from PyQt5.QtWidgets import QApplication, QPushButton, QWidget
from PyQt5.QtCore import Qt
class Window(QWidget):
def __init__(self):
super().__init__()
button = QPushButton("클릭")
button.setCursor(Qt.PointingHandCursor)
button.setAlignment(Qt.AlignCenter)
app = QApplication([])
window = Window()
window.show()
app.exec_()
# PyQt6 버전
from PyQt6.QtWidgets import QApplication, QPushButton, QWidget
from PyQt6.QtCore import Qt
class Window(QWidget):
def __init__(self):
super().__init__()
button = QPushButton("클릭")
button.setCursor(Qt.CursorShape.PointingHandCursor)
button.setAlignment(Qt.AlignmentFlag.AlignCenter)
app = QApplication([])
window = Window()
window.show()
app.exec() # 언더스코어 제거
12. 마이그레이션 권장사항
- 새 프로젝트: PyQt6 사용 권장
- 기존 프로젝트: 점진적 마이그레이션
- 라이브러리 호환성: 의존 라이브러리들의 PyQt6 지원 확인 필요
- 테스트: 철저한 테스트를 통한 동작 확인
이러한 변경사항들을 이해하고 적용하면 PyQt6의 향상된 기능과 성능을 활용할 수 있습니다! 🚀