Hlavní navigace

Menu a stavový řádek v PyQt4

Jan Kaluža 16. 2. 2007

Pokračujeme v průzkumu možností multiplatformní knihovny PyQt4. V dnešním článku si budeme povídat o tom, jak do naší aplikace umístit tolik potřebné menu a užitečný stavový řádek. Zmíníme se také o tom, jak z menu udělat panel nástrojů.

QAction, QMenu a QMenuBar

QMenuBar je horizontální menu, které je v dnešní době již v každé aplikaci. QMenuBar je složen z jednotlivých rolovacích menu, které jsou tvořeny pomocí QMenu. Každé rolovací menu QMenu obsahuje akce (položky v menu), které jsou vytvořeny pomocí QAction. Nejčastěji se QMenuBar používá v hlavním okně QMainWindow, kde tvoří hlavní menu aplikace.

QAction ( text, parent )
QAction ( icon, text, parent )

Touto funkcí vytvoříme QAction ( v našem případě novou položku v menu) s rodičem parent a titulkem text. Pokud QAction používáme jako položku v menu, je rodič vždy menu, ve kterém chceme položku zobrazit. Pokud chceme přiřadit akci ikonku, můžeme ji definovat jako QIcon a předat funkci jako parametr icon.

QAction.setText( text )

Tato funkce nastavuje titulek QAction.

QAction.setData ( data )

Funkcí setData nastavujeme, stejně jako v minulých dílech, data typická pro konkrétní položku v menu. Data jsou ve formátu QVariant.

QAction.data ( )

Tato funkce vrátí data, která byla přiřazena položce ve formátu QVariant.

QAction.setChec­kable ( bool )

Pokud je hodnota proměnné bool True, dá se QAction zaškrtnout (podobně jako zaškrtávací pole z minulého dílu).

QAction.triggered ( bool ) – signál

Signál triggered ( bool ) je generován, pokud uživatel aktivuje QAction (položku v menu). Hodnota bool je typu boolean a udává stav, který QAction má, pokud je nastavena jako zaškrtávací.

QMenu ( parent )
QMenu ( title, parent )

Oběma funkcemi můžeme vytvořit nové QMenu s rodičem parent. Pokud chceme přiřadit menu hned titulek, použijeme druhou funkci.

QMenu.setTitle ( title )

Touto funkcí nastavíme titulek QMenu.

QMenu.addAction ( qaction )

Tato funkce přidá novou akci (položku) do QMenu. Položka je typu QAction.

QMenu.addAction ( text )
QMenu.addAction ( icon, text )

Tyto funkce vznikly pro usnadnění práce programátorům. Místo vytváření nových akcí a následném přidávání akcí do QMenu můžeme zavolat jednu z těchto funkcí, která vytvoří QAction a automaticky ji přidá do QMenu. Vytvořená QAction je touto funkcí vrácena.

Místo kódu

menu=QtGui.QMenu("Soubor",menubar)
actionSave=QtGui.QAction("Save",menu)
menu.addAction(actionSave)

pak můžeme použít:

menu=QtGui.QMenu("Soubor",menubar)
actionSave=menu.addAction("Save")

QMenu.addMenu ( qmenu )

Pomocí této funkce přidáme do QMenu nové menu.

QMenu.addSeparator ( )

Touto funkcí přidáme do menu oddělovač.

QMenu.triggered ( QAction * ) – signál

Signál triggered ( QAction * ) je generován, pokud uživatel aktivuje položku v menu. Funkci, na kterou je signál napojen, je předána aktivována položka QAction.

QMenu.triggered ( QAction * ) – signál

Signál triggered ( QAction * ) je generován, pokud uživatel aktivuje položku v menu. Funkci, na kterou je signál napojen, je předána aktivována položka QAction.

QMenuBar ( parent )

Funkce vytvoří prázdný QMenuBar s rodičem parent.

QMenuBar.addMenu ( qmenu )

Touto funkcí přidáme do QMenubaru menu definované proměnnou qmenu.

QMainWindow.set­MenuBar( menubar )

Tato funkce přidá menubar do hlavního okna aplikace.

QMenuBar – Praxe

PyQt6 1

Prohlížeč souborů z jednoho z minulých dílu obohatíme o ovládaní pomocí menu. Tento příklad by měl osvětlit použití jednoduchého menu v programech.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from PyQt4 import QtCore, QtGui
import sys

def showFile():
    """ Otevreni souboru a vlozeni jeho obsahu do QTextEditu """
    f=open(str(fileNameLineEdit.text()))
    text=f.read()
    # Obsah souboru vlozime do widgetu mainTextEdit
    mainTextEdit.setPlainText(text)
    f.close()

def saveFile():
    """ Ulozi soubor """
    f=open(str(fileNameLineEdit.text()),"w")
    text=str(mainTextEdit.toPlainText())
    f.write(text)
    f.close()

app = QtGui.QApplication(sys.argv)
mainWindow = QtGui.QMainWindow()
mainWindow.setWindowTitle("QMenu")
mainWidget=QtGui.QWidget(mainWindow)
mainWindow.setCentralWidget(mainWidget)
layout=QtGui.QGridLayout(mainWidget)

# Vytvorime menubar
menubar=QtGui.QMenuBar(mainWindow)
# Vytvorime jedine menu
menu=QtGui.QMenu("Soubor",menubar)
# Vytvorime akce naseho menu
actionSave=QtGui.QAction("Save",menu)
actionOpen=QtGui.QAction("Open",menu)
actionExit=QtGui.QAction("Exit",menu)
# Vlozime akce a jeden separator do menu
menu.addAction(actionSave)
menu.addAction(actionOpen)
menu.insertSeparator(actionExit)
menu.addAction(actionExit)
# Pridame menu do menubaru
menubar.addMenu(menu)
# Nastavime hlavnimu oknu QMenubar menubar
mainWindow.setMenuBar(menubar)

fileNameLabel=QtGui.QLabel("Soubor:",mainWidget)
fileNameLineEdit=QtGui.QLineEdit(mainWidget)

# Vytvorime QTextEdit mainTextEdit
mainTextEdit=QtGui.QTextEdit(mainWidget)

# Pridame objekty do layoutu
layout.addWidget(fileNameLabel,0,0)
layout.addWidget(fileNameLineEdit,0,1)
layout.addWidget(mainTextEdit,1,0,1,2)

# Napojime signaly akci na sloty aplikace
app.connect(actionExit,QtCore.SIGNAL("triggered ( bool )"),mainWindow.close)
app.connect(actionSave,QtCore.SIGNAL("triggered ( bool )"),saveFile)
app.connect(actionOpen,QtCore.SIGNAL("triggered ( bool )"),showFile)
mainWindow.show()
sys.exit(app.exec_())

QStatusBar

QStatusBar slouží k zobrazování informací o běhu programu ve spodní části okna.

QStatusBar ( parent )

Funkce zobrazí prázdný QStatusBar

QStatusBar.show­Message ( message, timeout)

Funkce showMessage zobrazí v QStatusBaru zprávu message. Parametr timeout udává čas v milisekundách, po který bude zpráva zobrazena. Pokud je hodnota proměnné timeout 0, je zpráva zobrazena trvale.

QStatusBar.cle­arMessage ( )

Touto funkcí smažeme text zobrazený v QStatusBaru.

QMainWindow.set­StatusBar ( statusBar )

Tato funkce přidá statusBar do hlavního okna aplikace.

QToolBar

QToolBar funguje podobně jako QMenu s tím rozdílem, že jsou jeho položky zobrazeny vedle jednoho z okrajů okna. Stejně jako QMenu se i QToolBar skládá z položek tvořených pomocí QAction.

QToolBar.addAction ( qaction )

Touto funkcí přidáme novou položku typu QAction do QToolBaru.

QToolBar.addAction ( text )
QToolBar.addAction ( icon, text )

Podobně jako u QMenu vytváří tyto funkce novou položku QAction, kterou automaticky vloží do QToolBaru. Nová položka typu QAction je toutou funkcí navrácena.

QToolBar.addSe­parator ( )

Touto funkcí přidáme do QToolBaru nový oddělovač.

QMainWindow.ad­dToolBar ( qtoolbar )

Tato funkce přidá nový toolbar do hlavního okna aplikace.

QStatusBar a QToolBar – Praxe

PyQt6 2

Do minulého příkladu vložíme toolBar, který bude obsahovat stejné položky jako menu a statusBar, který bude vypisovat zprávu o uložení a otevření souboru.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from PyQt4 import QtCore, QtGui
import sys

def showFile():
    """ Otevreni souboru a vlozeni jeho obsahu do QTextEditu """
    f=open(str(fileNameLineEdit.text()))
    text=f.read()
    # Obsah souboru vlozime do widgetu mainTextEdit
    mainTextEdit.setPlainText(text)
    f.close()
    # zobrazeni zpravy se statusBaru po dobu 2 sekund
    statusBar.showMessage("File opened",2000)

def saveFile():
    """ Ulozi soubor """
    f=open(str(fileNameLineEdit.text()),"w")
    text=str(mainTextEdit.toPlainText())
    f.write(text)
    f.close()
    # zobrazeni zpravy se statusBaru po dobu 2 sekund
    statusBar.showMessage("File saved",2000)


app = QtGui.QApplication(sys.argv)
mainWindow = QtGui.QMainWindow()
mainWindow.setWindowTitle("QStatusBar")
mainWidget=QtGui.QWidget(mainWindow)
mainWindow.setCentralWidget(mainWidget)
layout=QtGui.QGridLayout(mainWidget)

# Vytvorime menu
menubar=QtGui.QMenuBar(mainWindow)
menu=QtGui.QMenu("Soubor",menubar)
actionSave=QtGui.QAction("Save",menu)
actionOpen=QtGui.QAction("Open",menu)
actionExit=QtGui.QAction("Exit",menu)
menu.addAction(actionSave)
menu.addAction(actionOpen)
menu.addSeparator()
menu.addAction(actionExit)
menubar.addMenu(menu)
mainWindow.setMenuBar(menubar)

# Vytvorime QStatusBar
statusBar=QtGui.QStatusBar (mainWindow)
statusBar.showMessage("Ready")
mainWindow.setStatusBar(statusBar)

# Vytvorime QToolBar
toolBar=QtGui.QToolBar("Soubor",mainWindow)
toolBar.addAction(actionSave)
toolBar.addAction(actionOpen)
toolBar.addSeparator()
toolBar.addAction(actionExit)
mainWindow.addToolBar(toolBar)

fileNameLabel=QtGui.QLabel("Soubor:",mainWidget)
fileNameLineEdit=QtGui.QLineEdit(mainWidget)

# Vytvorime QTextEdit mainTextEdit
mainTextEdit=QtGui.QTextEdit(mainWidget)

# Pridame objekty do layoutu
layout.addWidget(fileNameLabel,0,0)
layout.addWidget(fileNameLineEdit,0,1)
layout.addWidget(mainTextEdit,1,0,1,2)

# Napojime signaly akci na sloty aplikace
app.connect(actionExit,QtCore.SIGNAL("triggered ( bool )"),mainWindow.close)
app.connect(actionSave,QtCore.SIGNAL("triggered ( bool )"),saveFile)
app.connect(actionOpen,QtCore.SIGNAL("triggered ( bool )"),showFile)
mainWindow.show()
sys.exit(app.exec_())

Závěr

V dalším díle si povíme o tvorbě tabulek pomocí QTableWidget a o tvorbě záložek pomocí widgetu QTabWidget.

Našli jste v článku chybu?

31. 1. 2010 19:23

dave (neregistrovaný)

Tohle dokaze nastvat…
Takovych nedokoncenych serialu je vice, pokud se neobjevi pokracovani do mesice dvou, je to vetsinou uz mrtve. Ale sem vdecny aspon za tech par dilu:)


21. 5. 2009 22:08

Honza (neregistrovaný)
Vyborny serial... ale nejak se to utnulo... kde je to slibene pokracovani? Ubehly vic nez dva roky a porad nic:-(
DigiZone.cz: Česká televize mění schéma ČT :D

Česká televize mění schéma ČT :D

Podnikatel.cz: K EET. Štamgast už peníze na stole nenechá

K EET. Štamgast už peníze na stole nenechá

Podnikatel.cz: Vládu obejde, kvůli EET rovnou do sněmovny

Vládu obejde, kvůli EET rovnou do sněmovny

120na80.cz: Bojíte se encefalitidy?

Bojíte se encefalitidy?

Podnikatel.cz: Přehledná titulka, průvodci, responzivita

Přehledná titulka, průvodci, responzivita

Měšec.cz: Finančním poradcům hrozí vracení provizí

Finančním poradcům hrozí vracení provizí

120na80.cz: Jak oddálit Alzheimera?

Jak oddálit Alzheimera?

Podnikatel.cz: Na poslední chvíli šokuje vyjímkami v EET

Na poslední chvíli šokuje vyjímkami v EET

Podnikatel.cz: Prodává přes internet. Kdy platí zdravotko?

Prodává přes internet. Kdy platí zdravotko?

Měšec.cz: Jak vymáhat výživné zadarmo?

Jak vymáhat výživné zadarmo?

Podnikatel.cz: EET zvládneme, budou horší zákony

EET zvládneme, budou horší zákony

Vitalia.cz: Jsou čajové sáčky toxické?

Jsou čajové sáčky toxické?

Vitalia.cz: Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

Lupa.cz: Není sleva jako sleva. Jak obchodům nenaletět?

Není sleva jako sleva. Jak obchodům nenaletět?

Lupa.cz: Co se dá měřit přes Internet věcí

Co se dá měřit přes Internet věcí

Měšec.cz: Kdy vám stát dá na stěhování 50 000 Kč?

Kdy vám stát dá na stěhování 50 000 Kč?

Vitalia.cz: Baletky propagují zdravotní superpostel

Baletky propagují zdravotní superpostel

Vitalia.cz: Tesco: Chudá rodina si koupí levné polské kuře

Tesco: Chudá rodina si koupí levné polské kuře

Vitalia.cz: Chtějí si léčit kvasinky. Lék je jen v Německu

Chtějí si léčit kvasinky. Lék je jen v Německu

Měšec.cz: Zdravotní a sociální pojištění 2017: Připlatíte

Zdravotní a sociální pojištění 2017: Připlatíte