UI-Komponenten (Widgets) in PyQt5

Aktualisiert am 8. Januar 2021

UI-Elemente werden in Qt als Widget bezeichnet. Qt kommt von Haus aus mit zahlreichen Widgets. Darüber hinaus ist es auch möglich, eigene Widgets zu erstellen. In dieser Artikelserie möchte ich einige — häufig zum Einsatz kommende — Widgets vorstellen.

Zunächst wird QMainWindow für das Erzeugen eines leeren Fensters verwendet. Dieses Fenster hat den Titel „Mein Programm“. Der Code dazu sieht wie folgt aus:

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        # Fenstertitel
        self.setWindowTitle("Mein Programm")

app = QApplication(sys.argv)

# Instanz erzeugen und Fenster anzeigen
window = MainWindow()
window.show()

# Event loop starten
app.exec_()

Es ist derselbe Code, der bereits für das Beispiel im Blogbeitrag „Qt5-Fenster mit QMainWindow erstellen“ verwendet wurde.

QLabel mit Text

Den Anfang macht das QLabel-Widget, das man wohl als das simpelste Widget ansehen kann. Wie der Name bereits erahnen lässt, wird damit ein nicht interaktives Label erzeugt, das im folgenden Beispiel den Text „Hello, World!“ anzeigen soll.

Zunächst ist darauf zu achten, dass Qt und QLabel importiert werden, so dass die Import-Anweisungen nun folgendermaßen aussehen:

import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QLabel, QMainWindow

Zur Init-Funktion der Klasse MainWindow() ist dann folgender Code hinzuzufügen:

widget = QLabel(„Hello, World!“)  
font = widget.font()
font.setPointSize(40)

widget.setFont(font)
widget.setAlignment(Qt.AlignHCenter | Qt.AlignVCenter)

self.setCentralWidget(widget)

Der Code dürfte selbsterklärend sein. Interessant ist aber die Zeile

widget.setAlignment(Qt.AlignHCenter | Qt.AlignVCenter)

Damit wird die Ausrichtung des Widgets festgelegt (horizontal und vertikal zentriert), wobei es sich bei AlignHCenter und AlignVCenter um zwei Attribute (auch als Flag bezeichnet) aus dem Namenraum Qt handelt.

Der komplette Code sieht jetzt wie folgt aus:

import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QLabel, QMainWindow

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("QLabel mit Text")

        widget = QLabel("Hello, World!")
        font = widget.font()
        font.setPointSize(30)
        widget.setFont(font)
        widget.setAlignment(Qt.AlignHCenter | Qt.AlignVCenter)

        self.setCentralWidget(widget)

app = QApplication(sys.argv)

window = MainWindow()
window.show()

app.exec_()

QLabel mit Bild

Das QLabel-Widget kann auch für die Darstellung eines Bildes verwendet werden. Für dieses Beispiel habe ich einen Screenshot vom Installationsprozess von Python unter Windows 10 erstellt. Dieses Bild, das die Bezeichnung „python-install.png“ trägt, kann mit folgendem Code dargestellt werden:

import sys
from PyQt5.QtGui import QPixmap
from PyQt5.QtWidgets import QApplication, QLabel, QMainWindow

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("QLabel mit Bild")

        widget = QLabel()
        widget.setPixmap(QPixmap("python-install.png"))
        widget.setScaledContents(True)

        self.setCentralWidget(widget)

app = QApplication(sys.argv)

window = MainWindow()
window.show()

app.exec_()

Wie man sehen kann, bedarf es nur geringer Veränderungen. Anstelle des Imports von Qt mit

from PyQt5.QtCore import Qt

wird QPixmap importiert:

from PyQt5.QtGui import QPixmap

Das Label mit dem Bild wird mit diesen drei Zeilen realisiert:

widget = QLabel()
widget.setPixmap(QPixmap("python-install.png"))
widget.setScaledContents(True)

Die Methode setScaledContents(True) sorgt dafür, dass das Bild das gesamte Fenster ausfüllt. Wenn das Fenster skalierbar ist, führt dies aber unter Umständen dazu, dass die Seitenverhältnisse nicht beibehalten werden.

Fazit

Das Erstellen eines QLabel-Widgets ist sehr einfach. Die Ausrichtung eines Widgets wird von den Attributen aus dem Qt-Namensraum vorgenommen. Neben den im Code verwendeten Attributen hätte man übrigens auch Qt.AlignCenter verwenden können. Außerdem könnte die Zuweisung des Textes („Hello, World!“) alternativ auch mithilfe der .setText()-Methode realisiert werden:

widget.setText("Hello, World!")

Möchte man ein Bild darstellen, muss man zusätzlich QPixmap importieren und die Methode setPixmap() verwenden.

Weitere Artikel zu PyQt5