PyQt
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 등이 있다.
-
Qt -
Qt (소프트웨어)
Qt는 C++로 작성된 크로스 플랫폼 애플리케이션 개발 프레임워크로, GUI, 멀티미디어, 네트워크 등 다양한 기능을 제공하며, 시그널과 슬롯 메커니즘과 Qt Creator 등의 개발 도구를 통해 데스크톱, 임베디드, 모바일 UI 개발에 널리 사용된다. -
Qt -
QML
QML은 사용자 인터페이스 생성을 위한 선언형 언어로, 객체 선언, 속성 정의, 데이터 바인딩, 상태 관리, 애니메이션 기능을 제공하며 Qt/C++과 통합이 용이하다. -
위젯 툴킷 -
Tk (소프트웨어)
Tk는 Tcl 스크립팅 언어의 크로스 플랫폼 GUI 툴킷으로, 다양한 플랫폼 이식과 여러 프로그래밍 언어 바인딩을 지원하며 사용자 정의 가능한 위젯들을 제공한다. -
위젯 툴킷 -
윈도우 API
윈도우 API는 마이크로소프트 윈도우 운영 체제에서 응용 프로그램이 시스템 기능에 접근하도록 돕는 인터페이스 집합이며, 다양한 버전으로 발전해 왔고, 현재 Win32가 널리 사용되며, 유연성을 제공하지만 복잡하다는 단점을 보완하기 위해 다양한 래퍼 라이브러리가 개발되었다. -
크로스 플랫폼 자유 소프트웨어 -
김프
김프(GIMP)는 GNU 프로젝트에서 개발된 크로스 플랫폼 기반의 무료 오픈소스 래스터 그래픽 편집기로, 다양한 운영체제를 지원하며 풍부한 기능을 제공하지만 사용자 인터페이스에 대한 비판과 일부 기능의 부족함에 대한 평가도 존재한다. -
크로스 플랫폼 자유 소프트웨어 -
Tcl
Tcl은 존 오스터하우트가 개발한 명령어 기반의 프로그래밍 언어로, Tk 툴킷과 결합하여 GUI 스크립팅 환경으로 발전했으며, 다양한 운영체제에서 사용 가능하고 C, C++, Java 등 다른 언어와의 인터페이스를 지원한다.
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)
아래는 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: 과학적 플로팅 애플리케이션