PyQt5 vs PyQt6 주요 차이점

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. 마이그레이션 권장사항

  1. 새 프로젝트: PyQt6 사용 권장
  2. 기존 프로젝트: 점진적 마이그레이션
  3. 라이브러리 호환성: 의존 라이브러리들의 PyQt6 지원 확인 필요
  4. 테스트: 철저한 테스트를 통한 동작 확인

이러한 변경사항들을 이해하고 적용하면 PyQt6의 향상된 기능과 성능을 활용할 수 있습니다! 🚀

Leave a Comment