Uitgebreide PyQt5-tutorial: Bouw professionele GUI's in Python
Wat is PyQt?
PyQt is een Python-binding voor het Qt-framework, een cross-platform C++-bibliotheek die wordt gebruikt om native GUI-toepassingen te maken op Windows, macOS, Linux, Android, iOS, Raspberry Pi en meer. De binding wordt onderhouden door Riverbank Computing (VK), terwijl Qt zelf wordt ontwikkeld door The Qt Company (Finland). PyQt geeft Python-ontwikkelaars toegang tot Qt's rijke set aan widgets, networking, database-, 3D- en multimedia-mogelijkheden.
Wat je in deze tutorial leert
- Belangrijkste kenmerken van PyQt5
- Beschikbare PyQt-versies
- Hoe je PyQt5 installeert op Windows, macOS en Linux
- Fundamentele PyQt-concepten en voorbeeldprogramma's
- Kerncomponenten en widgets
- Layout-strategieën en thema-aanpassing
Belangrijkste kenmerken van PyQt5
PyQt5 blootstelt meer dan 600 klassen die het volgende dekken:
- Grafische gebruikersinterfaces
- SQL-database-integratie (SQLite, MySQL, PostgreSQL, Oracle, ODBC)
- Webrendering via QtWebEngine
- XML-parsing en -manipulatie
- Robuuste networking (TCP/UDP, SSL, DNS)
- Multimedia en 3D-graphics (QtMultimedia, Qt3D)
Deze mogelijkheden stellen ontwikkelaars in staat om complexe, hoogpresterende desktop- en embedded-toepassingen te bouwen. Grote bedrijven zoals LG, Mercedes-Benz, AMD, Panasonic en Harman vertrouwen op Qt voor hun UI-stacks.
PyQt-versies
Riverbank Computing biedt twee hoofdbindings:
- PyQt4 – ondersteunt Qt 4.x- en Qt 5.x-modules (niet achterwaarts compatibel)
- PyQt5 – bindings exclusief voor Qt 5.x
Daarnaast biedt PyQt3D Python-bindings voor het Qt3D-framework, nuttig voor real-time 3D-rendering en simulatie.
PyQt5 installeren
Twee veelgebruikte installatiemethoden worden hieronder beschreven. We raden aan om wheel-packages te gebruiken omdat ze gecompileerde C++-binaries bevatten en lange build-processen voorkomen.
Methode 1: Installeren via Wheels (Aanbevolen)
- Open je favoriete terminal of opdrachtprompt.
- Voer
pip install PyQt5uit om de wheel te downloaden (≈ 50 MB). - Controleer of de installatie succesvol is voltooid.
Voorbeeld op Windows:
pip install PyQt5
Eenmaal geïnstalleerd, kun je PyQt5.QtWidgets importeren en beginnen met het bouwen van toepassingen.
Methode 2: Bouwen vanuit broncode
Bouwen vanuit broncode is complexer omdat het C++-code compileert. Het is alleen nodig als je aangepaste wijzigingen nodig hebt of de wheel voor je platform niet beschikbaar is.
Fundamenten van PyQt5-programmering
Hieronder volgt een minimaal voorbeeld dat een 300×300-venster opent met de titel "Guru99". Elke regel is voor duidelijkheid geannoteerd.
import sys
from PyQt5.QtWidgets import QApplication, QWidget
if __name__ == "__main__":
app = QApplication(sys.argv)
w = QWidget()
w.resize(300, 300)
w.setWindowTitle("Guru99")
w.show()
sys.exit(app.exec_())
Uitleg:
QApplication– de kern-gebeurtenislus.QWidget– basisklasse voor alle UI-componenten.resize()– stelt de vensterdimensies in.setWindowTitle()– definieert de titelbalktekst.show()– toont de widget.app.exec_()– start de gebeurtenislus en blokkeert tot het venster sluit.
Interactiviteit toevoegen
Het volgende voorbeeld voegt een label, een knop en een dialoogvenster toe dat verschijnt wanneer op de knop wordt geklikt. Het demonstreert signalen en slots, de kern van Qt's gebeurtenissysteem.
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QPushButton, QMessageBox
def dialog():
mbox = QMessageBox()
mbox.setText("Je loyaliteit is genoteerd")
mbox.setDetailedText("Je bent nu een discipel en onderdaan van de alwetende Guru")
mbox.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel)
mbox.exec_()
if __name__ == "__main__":
app = QApplication(sys.argv)
w = QWidget()
w.resize(300, 300)
w.setWindowTitle("Guru99")
label = QLabel("Zie de Guru, Guru99", w)
label.move(100, 130)
btn = QPushButton("Bekeken", w)
btn.move(110, 150)
btn.clicked.connect(dialog)
w.show()
sys.exit(app.exec_())
Klikken op de knop activeert dialog(), wat een modale QMessageBox creëert.
Kerncomponenten en widgets
PyQt5's architectuur is georganiseerd in verschillende modules. Deze hiërarchie begrijpen helpt je om alleen wat je nodig hebt te importeren.
Module-overzicht
- Qt – bundelt alle submodules; handig voor kleine scripts.
- QtCore – kern niet-GUI-klassen (signalen, slots, timers).
- QtWidgets – standaard GUI-widgets (knoppen, labels, enz.).
- QtGui – grafische primitieven en geavanceerd tekenen.
- QtNetwork – TCP/UDP-sockets, SSL, DNS.
- QtMultimedia – audio/videondersteuning.
- QtSql – database-integratie.
Veelgebruikte widgets
QLineEdit– invoerveld voor één regel tekst.QRadioButton– selecteerbare radioknop.QComboBox– dropdown-selector.QCheckBox– aan/uit-vinkje.QMenuBar– horizontale menubalk.QToolBar– werkbalk met knoppen.QTabWidget– tabbladinterface.QScrollBar– scrollbalk-widget.QSplitter– aanpasbare splitsweergave.QDockWidget– loskoppelbaar dock-paneel.
Layout-beheer
In plaats van widgets handmatig te positioneren met move() en resize(), biedt Qt layout-managers die widgets automatisch rangschikken op basis van de venstergrootte.
Box-layouts (HBox & VBox)
QHBoxLayout rangschikt widgets horizontaal; QVBoxLayout rangschikt ze verticaal.
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QHBoxLayout, QVBoxLayout
app = QApplication([])
win = QWidget()
win.setWindowTitle("Musketiers")
btn1 = QPushButton("Athos")
btn2 = QPushButton("Porthos")
btn3 = QPushButton("Aramis")
hbox = QHBoxLayout(win)
hbox.addWidget(btn1)
hbox.addWidget(btn2)
hbox.addWidget(btn3)
win.show()
app.exec_()
Vervang QHBoxLayout door QVBoxLayout om de knoppen verticaal te stapelen.
Grid-layout
Organiseer widgets in een 2D-rooster. De addWidget()-methode accepteert rij- en kolomindices plus optionele rij- en kolom-span-argumenten.
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QGridLayout
app = QApplication([])
win = QWidget()
layout = QGridLayout(win)
for i in range(3):
for j in range(3):
layout.addWidget(QPushButton(f"Knop {i},{j}"), i, j)
win.show()
app.exec_()
Aangepaste thema's en stijlen
PyQt5 ondersteunt native thema's en aangepaste stylesheets.
Ingebouwde thema's
Stel de toepassingstijl in met app.setStyle("Fusion") of een andere beschikbare stijl.
app = QApplication([])
app.setStyle("Fusion")
Palette-aanpassing
Gebruik QPalette om widget-kleuren programmatisch aan te passen.
from PyQt5.QtGui import QPalette from PyQt5.QtCore import Qt palette = QPalette() palette.setColor(QPalette.ButtonText, Qt.black) palette.setColor(QPalette.Window, Qt.black) palette.setColor(QPalette.Button, Qt.gray) app.setPalette(palette)
Qt Style Sheets (CSS-achtig)
Voor geavanceerde styling, pas stylesheets direct toe op widgets of de gehele toepassing.
btn.setStyleSheet("background-color: #4CAF50; color: white; padding: 5px;")
Belangrijkste leerpunten
- PyQt5 is een krachtige Python-binding voor het Qt-framework, geschikt voor cross-platform desktop-, embedded- en mobiele apps.
- Installatie werkt het beste via wheels; bron-builds zijn optioneel.
- Kernmodules: QtCore, QtGui, QtWidgets, QtNetwork, QtMultimedia, QtSql.
- Widgets omvatten knoppen, labels, tekstvakken, radioknoppen, checkboxes, menu's, werkbalken, tabbladen, splitters en docks.
- Interactiviteit berust op Qt's signalen-en-slots-mechanisme.
- Layouts – Box en Grid – automatiseren widget-plaatsing, wat de responsiviteit verbetert.
- Thema's kunnen worden gerealiseerd met ingebouwde stijlen, paletten of Qt Style Sheets.
- Qt Designer en Qt Creator stroomlijnen UI-ontwerp en applicatie-pakkettering.
Python
- C# Collections Beheersen: Een Praktische Tutorial met Real-World Voorbeelden
- Python print()-functie: Praktische handleiding met voorbeelden
- Python's str.count() beheersen: Karakters & substrings tellen met voorbeelden
- Python `format()` strings beheersen met duidelijke voorbeelden
- Python's String.find()-methode beheersen: Syntaxis, voorbeelden & alternatieven
- Python lambda-functies beheersen: praktische voorbeelden & best practices
- Python round()-functie uitgelegd met praktische voorbeelden
- Python's map()-functie beheersen: syntaxis, voorbeelden en best practices
- Python timeit() – Uitvoeringstijd meten met praktische voorbeelden
- Python Counter in collections – Efficiënt tellen, updaten en rekenkundige operaties
- type() en isinstance() in Python begrijpen: praktische voorbeelden