====== Tvorba GUI pomocí PyQT 1/2 ====== ===== Podklady ke čtení ===== * [[https://naucse.python.cz/lessons/intro/pyqt/|GUI v Pythonu: PyQt5]] * [[https://doc.qt.io/qtforpython/|Qt for Python]] * [[https://www.riverbankcomputing.com/software/pyqt/|What is PyQt?]] ===== Instalace PyQT ===== V zásadě existují dvě možnosti, jak v Pythonu používat Qt framework: [[https://riverbankcomputing.com/software/pyqt|PyQt]] a [[https://wiki.qt.io/Qt_for_Python|PySide]]. Mají téměř totožné API, liší se v licenci a úrovni dokumentace. python3 -m pip install --upgrade pip python3 -m pip install PyQt5 ===== První aplikace ===== from PyQt5 import QtWidgets app = QtWidgets.QApplication([]) button = QtWidgets.QPushButton("Klikni na mě") button.setWindowTitle("První aplikace") button.clicked.connect(app.quit) button.show() app.exec() ===== GUI komponenty - widgety ===== Pro vykreslování GUI komponent slouží v Qt [[https://doc.qt.io/qtforpython/PySide2/QtWidgets/index.html#module-PySide2.QtWidgets|widgety]]. {{:courses:bab37zpr:solutions:widgets.png?400|}} Předhled komponent, použitých v příkladu ({{ :courses:bab37zpr:solutions:widgets_example.py |}}) * [[https://doc.qt.io/qtforpython/PySide2/QtWidgets/QLabel.html|QLabel]] * [[https://doc.qt.io/qtforpython/PySide2/QtWidgets/QComboBox.html|QComboBox]] * [[https://doc.qt.io/qtforpython/PySide2/QtWidgets/QCheckBox.html|QCheckBox]] * [[https://doc.qt.io/qtforpython/PySide2/QtWidgets/QRadioButton.html|QRadioButton]] * [[https://doc.qt.io/qtforpython/PySide2/QtWidgets/QPushButton.html|QPushButton]] * [[https://doc.qt.io/qtforpython/PySide2/QtWidgets/QTableWidget.html|QTableWidget]] * [[https://doc.qt.io/qtforpython/PySide2/QtWidgets/QLineEdit.html|QLineEdit]] * [[https://doc.qt.io/qtforpython/PySide2/QtWidgets/QSlider.html|QSlider]] * [[https://doc.qt.io/qtforpython/PySide2/QtWidgets/QProgressBar.html|QProgressBar]] ===== Layouty ===== V aplikacích se zpravidla používá více komponent, které je třeba vhodným způsobem uspořádat. K tomu slouží [[https://doc.qt.io/qt-5/layout.html|layouty]], zejména horizontální [[https://doc.qt.io/qtforpython/PySide2/QtWidgets/QHBoxLayout.html|QHBoxLayout]] a vertikální [[https://doc.qt.io/qtforpython/PySide2/QtWidgets/QVBoxLayout.html|QVBoxLayout]]. Layout je nutné vložit do vhodného kontejneru - k tomu může dobře posloužit např. obecná třída [[https://doc.qt.io/qtforpython/PySide2/QtWidgets/QWidget.html|QWidget]]. from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout app = QApplication([]) window = QWidget() layout = QVBoxLayout() layout.addWidget(QPushButton('Top')) layout.addWidget(QPushButton('Bottom')) window.setLayout(layout) window.show() app.exec() ===== Stylování komponent ===== Komponenty lze v Qt stylovat pomocí jazyka podobnému CSS (Cascade StyleSheets), známému z HTML. Styl může být sdílen pro celou aplikaci (tj. např. pro množiny komponent), nebo nastaven zvlášť pro každý prvek. from PyQt5.QtWidgets import QApplication, QPushButton app = QApplication([]) app.setStyleSheet("QPushButton { margin: 10ex; }") button = QPushButton('Hello World') button.show() app.exec() ===== Signály a sloty ===== from PyQt5.QtWidgets import * app = QApplication([]) button = QPushButton('Click') def on_button_clicked(): alert = QMessageBox() alert.setText('You clicked the button!') alert.exec() button.clicked.connect(on_button_clicked) button.show() app.exec() ===== Časovač ===== Časovač [[https://doc.qt.io/qtforpython/PySide2/QtCore/QTimer.html|QTimer]] je komponenta určená k odměřování času, ať už v pravidelných intervalech nebo jednorázově ([[https://doc.qt.io/qtforpython/PySide2/QtCore/QTimer.html#PySide2.QtCore.PySide2.QtCore.QTimer.singleShot|singleShot]]) from PyQt5.QtWidgets import *