Python PyQt

PyQt ist eine leistungsstarke Python-Bibliothek zur Erstellung grafischer Benutzeroberflächen (GUIs), die verwendet werden kann, um das in Python integrierte Tkinter zu ersetzen.

PyQt ist die Python-Anbindung für das Qt-Framework, das in der Entwicklung von Desktop-Anwendungen weit verbreitet ist.

Qt ist ein plattformübergreifendes Framework für die Entwicklung von C++-Anwendungen.

PyQt ermöglicht Python-Entwicklern, die Qt-Bibliothek zu nutzen, um leistungsstarke GUI-Anwendungen zu erstellen.

PyQt hat die folgenden Hauptversionen:

  • PyQt4: Bindungen basierend auf Qt4
  • PyQt5: Bindungen basierend auf Qt5
  • PyQt6: Bindungen basierend auf Qt6 (neueste Version)

PyQt installieren

PyQt5 mit pip installieren:

# 安装PyQt5
pip install PyQt5

# 安装Qt设计师和其他工具(可选)
pip install PyQt5-tools

Erstes PyQt-Programm

Ein einfaches Fenster erstellen

Das Folgende ist ein einfaches PyQt-Programm, das ein leeres Fenster erstellt:

Beispiel

from PyQt5.QtWidgets import QApplication, QWidget

# Anwendungsinstanz erstellen
app = QApplication([])

# Hauptfenster erstellen
window = QWidget()
window.setWindowTitle("Mein erstes PyQt-Programm")
window.setGeometry(100, 100, 400, 300)  # (x, y, Breite, Höhe)

# Fenster anzeigen
window.show()

# Anwendung ausführen
app.exec_()

Code-Erklärung

  1. QApplicationVerwaltet den Kontrollfluss und die Haupteinstellungen von GUI-Anwendungen.
  2. QWidgetDie grundlegendste Fensterklasse, alle UI-Komponenten erben von ihr.
  3. setWindowTitle()Legt den Fenstertitel fest.
  4. setGeometry()Legt die Fensterposition und -größe fest.
  5. show()Zeigt das Fenster an.
  6. app.exec_()Startet die Ereignisschleife und wartet auf Benutzerinteraktion.

Eine typische PyQt-Anwendung besteht aus den folgenden Teilen:

  1. QApplication-ObjektJede PyQt-Anwendung benötigt eine QApplication-Instanz.
  2. Fenster und WidgetsKomponenten der Benutzeroberfläche.
  3. EreignisschleifeEine Schleife, die Benutzereingaben und Systemereignisse verarbeitet.
  4. EreignisbehandlungsroutinenFunktionen oder Methoden, die auf Ereignisse reagieren.

Beispiel

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
       
        # Fenstertitel und Größe festlegen
        self.setWindowTitle("Meine erste PyQt-Anwendung")
        self.setGeometry(100, 100, 400, 300)  # x, y, Breite, Höhe
       
        # Button erstellen
        self.button = QPushButton("Klick mich", self)
        self.button.setGeometry(150, 150, 100, 30)
        self.button.clicked.connect(self.button_clicked)
       
    def button_clicked(self):
        print("Button wurde geklickt!")

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())


Häufige PyQt-Widgets

Schaltfläche (QPushButton)

Beispiel

from PyQt5.QtWidgets import QPushButton

button = QPushButton("Klick mich", window)
button.move(150, 150)  # Button-Position setzen

Beschriftung (QLabel)

Beispiel

from PyQt5.QtWidgets import QLabel

label = QLabel("Hallo PyQt!", window)
label.move(100, 100)

Textfeld (QLineEdit)

Beispiel

from PyQt5.QtWidgets import QLineEdit

textbox = QLineEdit(window)
textbox.move(100, 50)

Weitere gängige Widgets finden Sie unter:https://www.example.com/python3/python-pyqt-widgets.html


Layout-Verwaltung (QVBoxLayout)

Durch die Verwendung von Layout-Managern können Widget-Positionen automatisch angepasst werden:

Beispiel

from PyQt5.QtWidgets import QVBoxLayout, QLabel, QPushButton

layout = QVBoxLayout()
layout.addWidget(QLabel("Benutzername"))
layout.addWidget(QLineEdit())
layout.addWidget(QPushButton("Anmelden"))
window.setLayout(layout)

Weitere Inhalte zur Layoutverwaltung finden Sie unter:https://www.example.com/python3/python-pyqt-layout.html


Signal- und Slot-Mechanismus

PyQt verwendet denSignalundSlot-Mechanismus zur Behandlung von Ereignissen.

Der Signal- und Slot-Mechanismus von PyQt ist der Kernmechanismus für die Kommunikation zwischen Objekten.

  • Signal: Eine Benachrichtigung, die bei Eintreten eines bestimmten Ereignisses gesendet wird.
  • Slot: Eine Funktion oder Methode, die auf Signale reagiert.

Beispiel

from PyQt5.QtWidgets import QPushButton

def on_button_click():
    print("Button wurde geklickt!")

button = QPushButton("Klick mich", window)
button.clicked.connect(on_button_click)  # Signal und Slot verbinden

Benutzerdefinierte Signale

Beispiel

from PyQt5.QtCore import pyqtSignal, QObject

class MyEmitter(QObject):
    my_signal = pyqtSignal(str)  # Signal definieren

emitter = MyEmitter()
emitter.my_signal.connect(lambda x: print(f"Signal empfangen: {x}"))
emitter.my_signal.emit("Hello")  # Signal aussenden

Weitere Inhalte zur Layoutverwaltung finden Sie unter:https://www.example.com/python3/python-pyqt-signals-and-slots.html


Qt Designer verwenden

Qt Designer ist ein visuelles Designwerkzeug, mit dem Sie Widgets per Drag-and-Drop ziehen und ablegen können, um Oberflächen zu entwerfen:

  • Starten Sie Designer (normalerweise im Verzeichnis Lib\site-packages\qt5_applications\Qt\bin Ihrer Python-Installation)
  • Entwerfen Sie die Oberfläche und speichern Sie sie als.uiDatei
  • wird die.uiDatei in Python-Code umwandeln:

    pyuic5 input.ui -o output.py

Verwende die generierte Oberfläche im Code:

Beispiel

from PyQt5 import uic

# UI-Datei laden
Form, Window = uic.loadUiType("output.ui")

# UI verwenden
app = QApplication(sys.argv)
window = Window()
form = Form()
form.setupUi(window)
window.show()
sys.exit(app.exec_())

Praktische Übung: Einfache Notizblock-Anwendung

Oberflächendesign

Beispiel

import sys
from PyQt5.QtWidgets import (QApplication, QMainWindow, QTextEdit,
                            QAction, QFileDialog, QMessageBox)

class Notepad(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()
       
    def initUI(self):
        self.text_edit = QTextEdit(self)
        self.setCentralWidget(self.text_edit)
       
        self.create_actions()
        self.create_menus()
       
        self.setWindowTitle('Einfacher Editor')
        self.setGeometry(100, 100, 800, 600)
       
    def create_actions(self):
        # Dateimenü-Aktionen
        self.new_action = QAction('Neu', self)
        self.new_action.setShortcut('Ctrl+N')
        self.new_action.triggered.connect(self.new_file)
       
        self.open_action = QAction('Öffnen', self)
        self.open_action.setShortcut('Ctrl+O')
        self.open_action.triggered.connect(self.open_file)
       
        self.save_action = QAction('Speichern', self)
        self.save_action.setShortcut('Ctrl+S')
        self.save_action.triggered.connect(self.save_file)
       
        self.exit_action = QAction('Beenden', self)
        self.exit_action.setShortcut('Ctrl+Q')
        self.exit_action.triggered.connect(self.close)
       
        # Aktionen des Bearbeiten-Menüs
        self.copy_action = QAction('Kopieren', self)
        self.copy_action.setShortcut('Ctrl+C')
        self.copy_action.triggered.connect(self.text_edit.copy)
       
        self.paste_action = QAction('Einfügen', self)
        self.paste_action.setShortcut('Ctrl+V')
        self.paste_action.triggered.connect(self.text_edit.paste)
       
        self.cut_action = QAction('Ausschneiden', self)
        self.cut_action.setShortcut('Ctrl+X')
        self.cut_action.triggered.connect(self.text_edit.cut)
       
    def create_menus(self):
        menubar = self.menuBar()
       
        # Datei-Menü
        file_menu = menubar.addMenu('Datei')
        file_menu.addAction(self.new_action)
        file_menu.addAction(self.open_action)
        file_menu.addAction(self.save_action)
        file_menu.addSeparator()
        file_menu.addAction(self.exit_action)
       
        # Bearbeiten-Menü
        edit_menu = menubar.addMenu('Bearbeiten')
        edit_menu.addAction(self.copy_action)
        edit_menu.addAction(self.paste_action)
        edit_menu.addAction(self.cut_action)
       
    def new_file(self):
        self.text_edit.clear()
       
    def open_file(self):
        filename, _ = QFileDialog.getOpenFileName(self, 'Datei öffnen')
        if filename:
            try:
                with open(filename, 'r') as f:
                    self.text_edit.setText(f.read())
            except Exception as e:
                QMessageBox.warning(self, 'Fehler', f'Datei kann nicht geöffnet werden: {e}')
               
    def save_file(self):
        filename, _ = QFileDialog.getSaveFileName(self, 'Datei speichern')
        if filename:
            try:
                with open(filename, 'w') as f:
                    f.write(self.text_edit.toPlainText())
            except Exception as e:
                QMessageBox.warning(self, 'Fehler', f'Datei kann nicht gespeichert werden: {e}')

if __name__ == '__main__':
    app = QApplication(sys.argv)
    notepad = Notepad()
    notepad.show()
    sys.exit(app.exec_())


PyQt5-Kern-Widgets

Die meisten Widgets befinden sich in PyQt5.QtWidgets.

Erweiterte Funktionen (wie Multimedia, Netzwerk) erfordern möglicherweise andere Module (z. B. QtCore, QtGui, QtNetwork usw.).

QListView/QTableView/QTreeView müssen zusammen mit einem Datenmodell (wie QStandardItemModel) verwendet werden, um größere Flexibilität zu erreichen.

Weitere Installationserweiterungen:

pip install PyQtWebEngine  # 网页支持
pip install PyQtChart      # 图表支持
Widget-KategorieWidget-NameModulBeschreibung
Grundlegende Fenster-WidgetsQWidgetQtWidgetsBasisklasse für alle Benutzeroberflächenobjekte, kann als leeres Fenster oder Container verwendet werden.
QMainWindowQtWidgetsHauptfenster-Framework, enthält Menüleiste, Symbolleiste, Statusleiste usw.
QDialogQtWidgetsBasisklasse für Dialoge, wird für Pop-up-Fenster verwendet.
Layout-VerwaltungQVBoxLayoutQtWidgetsVertikaler Layout-Manager
QHBoxLayoutQtWidgetsHorizontaler Layout-Manager
QGridLayoutQtWidgetsGrid-Layout-Manager
QFormLayoutQtWidgetsFormular-Layout-Manager (Label- + Eingabefeld-Paare)
Button-KlassenQPushButtonQtWidgetsNormaler Button
QRadioButtonQtWidgetsRadiobutton
QCheckBoxQtWidgetsKontrollkästchen
QToolButtonQtWidgetsToolbar-Button (kann Symbol haben)
Eingabe-WidgetsQLineEditQtWidgetsEinzeiliges Texteingabefeld
QTextEditQtWidgetsMehrzeiliger Rich-Text-Editor (unterstützt HTML)
QPlainTextEditQtWidgetsMehrzeiliger Klartext-Editor
QSpinBoxQtWidgetsSpinbox (Ganzzahl)
QDoubleSpinBoxQtWidgetsSpinbox (Gleitkommazahl)
QComboBoxQtWidgetsDropdown-Auswahlfeld
QDateEditQtWidgetsDatumsauswahlfeld
QTimeEditQtWidgetsZeitauswahlfeld
QDateTimeEditQtWidgetsDatum-Uhrzeit-Auswahlfeld
QSliderQtWidgetsSchieberegler (horizontal/vertikal)
QDialQtWidgetsDrehknopf-Steuerelement
Anzeige-WidgetsQLabelQtWidgetsText-/Bild-Label
QLCDNumberQtWidgetsLCD-Digitalanzeige
QProgressBarQtWidgetsFortschrittsbalken
QStatusBarQtWidgetsStatusleiste (normalerweise verwendet fürQMainWindow)
Container-KlassenQGroupBoxQtWidgetsGruppenfeld (Container mit Titel)
QTabWidgetQtWidgetsTab-Container
QStackedWidgetQtWidgetsGestapelter Container (zeigt jeweils ein untergeordnetes Widget an)
QScrollAreaQtWidgetsScrollbereich-Container
QMdiAreaQtWidgetsMDI-Bereich (Multiple Document Interface)
Liste/Tabelle/BaumQListWidgetQtWidgetsListensteuerelement (mit Elementverwaltung)
QTreeWidgetQtWidgetsBaum-Widget
QTableWidgetQtWidgetsTabellen-Widget
QListViewQtWidgetsListenansicht (erfordert ein Datenmodell)
QTableViewQtWidgetsTabellenansicht (erfordert ein Datenmodell)
QTreeViewQtWidgetsBaumansicht (erfordert ein Datenmodell)
Menü/SymbolleisteQMenuBarQtWidgetsMenüleiste
QMenuQtWidgetsMenü (kann Untermenüs und Aktionen enthalten)
QToolBarQtWidgetsSymbolleiste
QActionQtWidgetsAktion (wird für Menüeinträge, Symbolleisten-Schaltflächen usw. verwendet)
DialogQFileDialogQtWidgetsDateiauswahldialog
QColorDialogQtWidgetsFarbauswahldialog
QFontDialogQtWidgetsSchriftauswahldialog
QInputDialogQtWidgetsEingabedialog (Text, Zahlen usw.)
QMessageBoxQtWidgetsMeldungsdialog (Warnung, Fehler, Frage usw.)
GrafikansichtQGraphicsViewQtWidgetsGraphics View Framework (für 2D-Grafiken)
QGraphicsSceneQtWidgetsGrafikszene (für kombinierteQGraphicsViewVerwendung)
Weitere funktionale KomponentenQCalendarWidgetQtWidgetsKalender-Widget
QSplashScreenQtWidgetsSplash-Screen
QSystemTrayIconQtWidgetsSystem-Tray-Symbol
QWebEngineViewQtWebEngineWidgetsWebbrowser-Komponente (erfordert separate InstallationPyQtWebEngine)

Lernressourcen

Weitere Erweiterungen