PyQt

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

PyQt는 1998년 Riverbank Computing에 의해 처음 출시된 파이썬 프로그래밍 언어용 GUI(Graphical User Interface) 위젯 도구이다. Qt 라이브러리에 대한 파이썬 바인딩을 제공하며, 다양한 GUI 클래스를 포함하고 있다. PyQt는 Qt의 핵심, GUI, 네트워크, OpenGL, SQL, SVG, XML, 멀티미디어, 디자이너, uic 모듈 등으로 구성되어 있으며, Qt4와 Qt5를 지원한다. PyQt를 사용하는 주요 애플리케이션으로는 Anki, Calibre, Dropbox, Spyder 등이 있다.

PyQt - [IT 관련 정보]에 관한 문서
📚 더 읽어볼만한 페이지
  • Qt - Qt (소프트웨어)
    Qt는 C++로 작성된 크로스 플랫폼 애플리케이션 개발 프레임워크로, GUI, 멀티미디어, 네트워크 등 다양한 기능을 제공하며, 시그널과 슬롯 메커니즘과 Qt Creator 등의 개발 도구를 통해 데스크톱, 임베디드, 모바일 UI 개발에 널리 사용된다.
  • Qt - QML
    QML은 사용자 인터페이스 생성을 위한 선언형 언어로, 객체 선언, 속성 정의, 데이터 바인딩, 상태 관리, 애니메이션 기능을 제공하며 Qt/C++과 통합이 용이하다.
  • 위젯 툴킷 - Tk (소프트웨어)
    Tk는 Tcl 스크립팅 언어의 크로스 플랫폼 GUI 툴킷으로, 다양한 플랫폼 이식과 여러 프로그래밍 언어 바인딩을 지원하며 사용자 정의 가능한 위젯들을 제공한다.
  • 위젯 툴킷 - 윈도우 API
    윈도우 API는 마이크로소프트 윈도우 운영 체제에서 응용 프로그램이 시스템 기능에 접근하도록 돕는 인터페이스 집합이며, 다양한 버전으로 발전해 왔고, 현재 Win32가 널리 사용되며, 유연성을 제공하지만 복잡하다는 단점을 보완하기 위해 다양한 래퍼 라이브러리가 개발되었다.
  • 공식 웹사이트에 알 수 없는 변수를 사용한 문서 - 브루클린 미술관
    브루클린 미술관은 1823년 브루클린 견습생 도서관으로 시작하여 현재 약 50만 점의 소장품을 보유한 뉴욕 브루클린 소재의 미술관으로, 다양한 분야의 예술 작품을 전시하며 특히 아프리카 미술과 여성주의 미술에 대한 기여가 크다.
  • 공식 웹사이트에 알 수 없는 변수를 사용한 문서 - 광주지방기상청
    광주지방기상청은 광주광역시와 전라남도 지역의 기상 예보, 특보, 관측, 기후 정보 제공 등의 업무를 수행하는 기상청 소속 기관으로, 1949년 광주측후소로 설치되어 1992년 광주지방기상청으로 개편되었으며, 기획운영과, 예보과, 관측과, 기후서비스과와 전주기상지청, 목포기상대를 두고 있다.

2. 역사

PyQt는 1998년 Riverbank Computing에 의해 처음 출시되었다.

2009년 8월, 당시 Qt의 개발사인 Qt 소프트웨어를 소유하고 있던 노키아는 파이썬 바인딩을 LGPL 라이선스 하에 사용할 수 있도록 추진했다. 그러나 Riverbank Computing과의 합의에 이르지 못하자, 노키아는 유사한 기능을 제공하는 자체 바인딩인 PySide를 출시했다.

3. 주요 구성 요소

--

PyQt는 GUI 프로그래밍, 네트워크 통신, 데이터베이스 연동, 멀티미디어 처리 등 다양한 기능을 수행하는 여러 모듈로 구성되어 있다. 주요 버전인 PyQt4와 PyQt5는 각각의 필요에 맞는 특정 모듈 세트를 포함하고 있으며, 이를 통해 개발자는 필요한 기능만 선택적으로 사용하여 애플리케이션을 개발할 수 있다.

3.1. PyQt4

PyQt4는 다음과 같은 파이썬 모듈을 포함하고 있다.

; QtCore
: 이벤트 루프와 Qt의 시그널 및 슬롯 메커니즘을 갖춘 비GUI 클래스를 포함하고 있다. 이 모듈은 플랫폼에 의존하지 않도록 유니코드, 스레드, 맵 파일, 공유 메모리, 정규 표현식 등을 추상화한다.
; QtGui
: 많은 GUI 클래스를 포함하고 있다. 이 클래스들은 모델-뷰-컨트롤러 디자인 패턴을 기반으로 하는 많은 테이블, 트리, 리스트를 포함하고 있다. 또한, 수천 개의 아이템을 저장할 수 있는 정교한 2D 캔버스 위젯을 제공한다.
; QtNetwork
: UDP, TCP 클라이언트와 서버를 생성하기 위한 모듈이다. 이 모듈은 FTP 구현, HTTP 클라이언트, DNS 조회 클래스를 포함하고 있다. 네트워크 애플리케이션을 쉽게 개발할 수 있도록 제작되었다.
; QtOpenGL
: OpenGL을 사용하여 3D 그래픽을 렌더링하는 데 필요한 클래스를 포함하고 있다.
; QtSql
: 오픈 소스 및 프로프리에터리 SQL 데이터베이스를 다루기 위한 모듈이다. 이는 GUI 클래스에서 사용할 수 있는 데이터베이스 테이블용 편집 가능한 데이터 모델을 포함하고 있다. 또한, SQLite 구현도 포함하고 있다.
; QtSvg
: SVG 파일의 내용을 표시하기 위한 클래스를 포함하고 있다. SVG 1.2 Tiny의 정적 기능을 지원한다.
; QtXml
: Qt의 XML 파서에 SAX와 DOM 인터페이스를 구현하는 모듈이다.
; QtMultimedia
: 하위 레벨에서 멀티미디어 기능을 구현하기 위한 모듈이다. 응용 프로그램 개발자는 일반적으로 phonon 모듈을 사용한다.
; QtDesigner
: PyQt를 사용하여 Qt Designer를 확장하기 위한 클래스를 포함하고 있다.
; Qt
: 하나의 모듈에 위에 설명된 모든 모듈에 포함된 클래스를 통합한다. 따라서 Qt 모듈을 불러오면 특정 클래스가 포함되어 있는지 걱정할 필요가 없어진다는 장점이 있다. 하지만 하나의 모듈로 통합함으로써 애플리케이션의 메모리 사용량을 증가시키고, Qt 프레임워크 전체를 불러와야 하는 등의 단점이 생긴다. 이 통합된 모듈을 사용할지, 개별 모듈을 사용할지는 개인의 취향에 달려있다.
; uic
: Qt Designer로 만들어진 XML 파일을 처리하기 위한 지원을 구현한다. 여기에는 XML 파일을 로드하여 직접 렌더링하는 클래스와 나중에 실행하기 위해 XML 파일에서 파이썬 코드를 생성하는 클래스가 포함되어 있다.

3.2. PyQt5

PyQt5는 다음과 같은 파이썬 모듈을 포함하고 있다.
* QtQml 모듈
* QtQtuick 모듈
* QtCore 모듈
* QtGui 모듈
* QtPrintSupport 모듈
* QtWidgets 모듈
* QGLContext 모듈
* QGLFormat 모듈
* QGLWidget 모듈
* QtWebKit 모듈
* QtWebKitWidgets 모듈

4. 예제 (Hello World)

KDE 플라즈마 4에서 실행된 결과
KDE 플라즈마 4에서 실행된 결과

아래는 PyQt 6 버전으로 작성된 간단한 파이썬 코드로, 실행하면 화면에 작은 창을 표시한다.


#!/usr/bin/env python3
"""
여기서 필요한 import를 제공합니다.
기본 GUI 위젯은 QtWidgets 모듈에 있습니다.
"""
import sys
# PyQt6에서는 GUI 기본 위젯이 QtWidgets 모듈에 포함되어 있다.
from PyQt6.QtWidgets import QApplication, QWidget

# 모든 PyQt 애플리케이션은 QApplication 객체를 생성해야 한다.
app = QApplication([])

# QWidget 위젯은 PyQt의 모든 사용자 인터페이스 객체의 기본 클래스이다.
# 부모가 없는 위젯(parent=None)은 독립적인 창(window)으로 취급된다.
root = QWidget()

# resize() 메서드로 위젯의 크기를 가로 320px, 세로 240px로 조정한다.
root.resize(320, 240)
# setWindowTitle() 메서드로 창의 제목을 설정한다.
root.setWindowTitle("Hello, World!")
# show() 메서드로 위젯을 화면에 표시한다.
root.show()

# 애플리케이션의 메인 이벤트 루프를 시작한다.
# 사용자의 입력을 받고 이벤트를 처리하며, 창이 닫힐 때까지 실행된다.
# sys.exit()는 이벤트 루프 종료 시 애플리케이션을 완전히 종료하기 위해 사용된다.
sys.exit(app.exec())


아래는 이전 버전인 PyQt 4로 작성된 동일한 기능의 코드이다. PyQt 6와 비교하여 모듈 구조(`QtGui` vs `QtWidgets`)나 메서드 이름(`exec_()` vs `exec()`) 등에서 차이가 있음을 알 수 있다.


#! /usr/bin/env python
# -*- coding: utf-8 -*-
#
# 필요한 import를 제공합니다.
# 기본적인 GUI 위젯은 QtGui 모듈에 있습니다.
import sys
# PyQt4에서는 GUI 기본 위젯이 QtGui 모듈에 포함되어 있었다.
from PyQt4.QtGui import *

# 모든 PyQt4 응용 프로그램은 QApplication 객체를 생성해야 한다.
a = QApplication(sys.argv)

# QWidget 위젯은 PyQt4의 모든 사용자 인터페이스 객체의 기본 클래스이다.
# 부모가 없는 위젯은 창으로 취급된다.
w = QWidget()

# resize() 메서드로 위젯의 크기를 조정한다.
w.resize(320, 240)
# setWindowTitle() 메서드로 창의 제목을 설정한다.
w.setWindowTitle("Hello, World!")
# show() 메서드로 위젯을 화면에 표시한다.
w.show()

# 애플리케이션의 메인 이벤트 루프를 시작한다. PyQt4에서는 exec_() 메서드를 사용했다.
sys.exit(a.exec_())

5. PyQt를 사용하는 주요 애플리케이션

* Anki: 간격 반복 학습 플래시 카드 프로그램
* Calibre: 전자책 관리 애플리케이션
* Dropbox: 파일 호스팅 서비스
* Eric Python IDE: 파이썬의 통합 개발 환경
* Frescobaldi: LilyPond 음악 파일의 악보 편집기
* GNS3: 네트워크 소프트웨어 에뮬레이터
* Kodos: 파이썬 정규 표현식 디버거
* Leo: 개요 작성기 및 리터럴 프로그래밍 편집기
* Ninja-IDE: 확장 가능한 오픈 소스 파이썬 IDE
* OpenLP: 오픈 소스 가사 프로젝션 프로그램
* OpenShot: 비디오 편집 프로그램
* Orange: 데이터 마이닝 및 시각화 프레임워크
* Puddletag: 오픈 소스, 크로스 플랫폼 ID3 태그 편집기
* QGIS: 무료 소프트웨어 데스크톱 지리 정보 시스템(GIS) 애플리케이션
* qutebrowser: Vim 스타일의 키 바인딩과 최소한의 GUI를 갖춘 웹 브라우저
* qt-recordMyDesktop: recordMyDesktop용 Qt4 프론트 엔드
* Spyder: 파이썬 데이터 과학 IDE
* TortoiseHg: Mercurial 소스 관리 프로그램(Hg)의 그래픽 인터페이스
* Veusz: 과학적 플로팅 애플리케이션