====== 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 *