4. diel - PRIPOMIENKOVÉ narodenín v PyQt - Dokončenie návrhu formulárov
V minulej lekcii, PRIPOMIENKOVÉ narodenín v PyQt - Návrh formulárov , sme rozpracovali návrh prvého z formulárov aplikácie v PyQt pre upomínania narodenín osôb. Dnes obaja formuláre dokončíme, aby sme mali vzhľad aplikácie pripravený a mohli sa ďalej venovať už len programovanie.
Tlačidlá a ikonky
Do formulára PrehledForm pridáme 2 tlačidlá. Jedno bude
pridávať osoby a to druhé je odstraňovať. Obe tlačidlá budú mať ikonky,
ktoré si môžete opäť buď stiahnuť na https://www.iconfinder.com/ alebo v
archíve so zdrojovým kódom na konci článku.
Asi vás neprekvapí, že tlačidlá vložíme do QHBoxLayout,
aby sa poskladala vedľa seba. Štruktúra aktuálne pridávané časti
formulára vyzerá nasledovne:
QHBoxLayoutQPushButtonQPushButton

Do metódy __init__() triedy PrehledForm pridáme
nasledujúci kód nad volanie self.show():
# Původní kód metody # ... # Přidávání tlačítek self.tlacitkaLayout = QtWidgets.QHBoxLayout() self.pridatButton = QtWidgets.QPushButton("Přidat") self.pridatButton.setMinimumHeight(50) self.pridatButton.setIcon(QtGui.QIcon("pridej.png")) self.pridatButton.setIconSize(QtCore.QSize(32,32)) self.odebratButton = QtWidgets.QPushButton("Odebrat") self.odebratButton.setMinimumHeight(50) self.odebratButton.setIcon(QtGui.QIcon("odeber.png")) self.odebratButton.setIconSize(QtCore.QSize(32,32)) self.tlacitkaLayout.addWidget(self.pridatButton) self.tlacitkaLayout.addWidget(self.odebratButton) layoutFormulare.addLayout(self.tlacitkaLayout) self.show()
Na kódu tlačidiel nie je nič zložité, všimnite si len nastavenie
výšky tlačidiel a veľkosti ikoniek. Teraz je náš formulár
PrehledForm hotový. Vrhnite sa na formulár
OsobaForm, ktorý má len niekoľko riadkov.
Pripájací formulár
Druhý formulár bude slúžiť na pridávanie nových osôb a má túto podobu:

Do formulára postupne vložíme tieto ovládacie prvky:
- 2x
QLabel- Popisky - 1x
QLabel(Obrázok) - Tentoraz Label využijeme aj na obrázok - 1x
QLineEdit- Zadanie mena osoby - 3x
QComboBox(Dátum) - Zadanie dátumu narodenia osoby realizujeme cez ComboBox na deň, mesiac a rok - 1x
QPushButton- Tlačidlo pre potvrdenie
Štruktúra layoutov
Štruktúra formulára vrátane layoutov bude nasledujúci:
QVBoxLayoutQHBoxLayoutLabel(Obrázok)
QFormLayout- Row -
QLabelQLineEdit
- Row -
QLabelQComboBoxQComboBoxQComboBox
- Row -
QPushButton
- Row -
QFormLayout. Ten nám uľahčí písanie v prípade, keď chceme
niekam vložiť formulár, ktorý sa skladá z 2 stĺpcov. Prvý stĺpec
obsahuje popisky (QLabel y) a druhý stĺpec príslušné
editačné prvky. Iste si dokážete predstaviť, že vkladať popisok a
editačné prvok vždy spolu s novým QHBoxLayout em by bolo
zbytočne pracné
Vytvorenie widgetov
Keďže už tušíme ako layouty a widgety fungujú, ukážme si rovno kompletnú kód pre vytvorenie formulára:
# Formulář pro vytvoření nové osoby class OsobaForm(QtWidgets.QWidget): def __init__(self, **kwargs): super(OsobaForm, self).__init__(**kwargs) # Titulek a ikonka self.setWindowTitle("Přidat osobu") self.setWindowIcon(QtGui.QIcon("person_bg.png")) layoutFormulare = QtWidgets.QVBoxLayout() self.setLayout(layoutFormulare) # Layout s obrázkem self.obrazekLabel = QtWidgets.QLabel() self.obrazekLabel.setPixmap(QtGui.QPixmap("person_bg.png").scaledToWidth(150)) obrazekLayout = QtWidgets.QHBoxLayout() obrazekLayout.addStretch() obrazekLayout.addWidget(self.obrazekLabel) obrazekLayout.addStretch() layoutFormulare.addLayout(obrazekLayout) # Layout se jménem self.udajeLayout = QtWidgets.QFormLayout() self.jmenoTextBox = QtWidgets.QLineEdit() # Přidáme řádek self.udajeLayout.addRow(QtWidgets.QLabel("Jméno"), self.jmenoTextBox) # Layout pro výběr data datumLayout = QtWidgets.QHBoxLayout() self.den = QtWidgets.QComboBox() self.den.addItem("Den") datumLayout.addWidget(self.den) self.mesic = QtWidgets.QComboBox() self.mesic.addItem("Měsíc") datumLayout.addWidget(self.mesic) self.rok = QtWidgets.QComboBox() self.rok.addItem("Rok") datumLayout.addWidget(self.rok) # Přidáme řádek self.udajeLayout.addRow(QtWidgets.QLabel("Datum narození"), datumLayout) self.okButton = QtWidgets.QPushButton("Ok") self.udajeLayout.addRow(None,self.okButton) layoutFormulare.addLayout(self.udajeLayout) def setup(self): pass
Trieda OsobaForm už nededia z
QtWidgets.QMainWindow, ale iba z QtWidgets.QWidget. To
preto, že sa jedná o pomocný formulár, ktorý nie je hlavným oknom
aplikácie. Na začiatku konstruktoru nastavujeme opäť titulok, ikonku a
layout. Ten je rovnako ako u prvého formulára zvislý, aby sa ďalšie layouty
vkladali pod seba.
Nasleduje pridanie obrázku, ktorý nemá žiadny praktický význam, ale
aplikácia s ním vyzerá pre užívateľov prívetivejšie. Labelu obrázok
nastavíme pomocou metódy setPixmap(), a následne mu nastavíme
šírku pomocou scaledToWidth(). Aby sa ikonka vycentroval,
vložíme ju do QHBoxLayout a okolo nej pridáme voľné miesto
pomocou addStretch().
Ďalej tvoríme QFormLayout, ktorý metódou
addRow() umožňuje jednoducho vložiť popisek a editačné prvok
vedľa seba, bez toho aby sme ich museli vkladať do ďalších layoutov. Výber
dátumu narodenia vykonáme pomocou 3 QComboBox ov, prvého na dni,
druhého na mesiace a tretieho na roky. Asi vás neprekvapí, že je vkladáme
vedľa seba do QHBoxLayout a celý layout následne vložíme ako
ďalší riadok nášho QFormLayout pomocou metódy
addRow().
Nakoniec vytvoríme tlačidlo a takisto ho vložíme do
QFormLayout, tentoraz bez popisku. Layout s údajmi o osobe
pridáme do layoutu formulára a formulármi ešte nastavíme rozmery podľa
jeho obsahu. K rozmerom jednotlivých widgetov sa dostaneme pomocou metódy
sizeHint(), na ktorej návratové hodnote môžeme následne volať
metódy width() a height().
Vygenerovanie dní, mesiacov a rokov
Do pripravených QComboBox ov si vygenerujte 31 dní, 12
mesiacov a posledných 190 rokov. Vďaka funkcii range(), ktorú
iste v Pythone poznáte, to bude hračka. Na vygenerovanie hodnôt si vytvoríme
v triede OsobaForm novú metódu
napln_datum_boxy():
def napln_datum_boxy(self): rok = int(datetime.datetime.now().year) for i in range(1, 32): self.den.addItem(str(i)) for i in range(1, 13): self.mesic.addItem(str(i)) for i in range(rok, rok - 190, -1): self.rok.addItem(str(i))
Metódu zavoláme v __init__() po vytvorení combobox:
# Kód výše # ... datumLayout.addWidget(self.rok) self.napln_datum_boxy() # další kód metody # ...
Udalosť tlačidla
Určite by ste si teraz radi nový formulár vyskúšali. Presunieme sa teda
do triedy PrehledForm, kde tlačidlu pre pridávanie osôb
nastavíme udalosť clicked. Napojíme ju na metódu, v ktorej
zobrazíme formulár OsobaForm. Pripomeniem, že k inštanciu
osoba_form môžeme pristupovať vďaka tomu, že sme si formulár
predtým uložili v metóde setup():
class PrehledForm(QtWidgets.QMainWindow): def __init__(self, **kwargs): super(PrehledForm, self).__init__(**kwargs) # Předchozí kód # ... self.pridatButton.clicked.connect(self.show_osoba_form) self.show() def show_osoba_form(self): self.osoba_form.show()
výsledok:

Formuláre máme teda kompletne pripravené. V budúcej lekcii, PRIPOMIENKOVÉ narodenín v PyQt - Logická vrstva , pridáme logiku aplikácie. Kompletné modul a ikonky nájdete na stiahnutie nižšie.
Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 189x (37.85 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Python
