PyQt5: QTabWidget
Torna all’indice degli appunti
Il TabWidget mette a disposizione un contenitore con pagine multiple, selezionabili tramite tabs.
Ogni pagina può contenere un widget, o un ulteriore contenitore di widgets.
La testata del TabWidget altri non è che il TabBar, ottenibile
con il metodo tabBar di QTabWidget.
Per prima cosa si istanzia l’oggetto QTabWidget, poi è possibile aggiungere tab con i due seguenti metodi:
addTab(child, label): aggiunge un tab nell’ordine in cui viene inserito, uno dopo l’altro;
insertTab(index, child, label): aggiunge un tab all’indice predefinito, slittando tutti gli altri in avanti.
è possibile assegnare anche un oggetto QIcon al tab in fase di aggiunta, nella seguente modalità:
addTab(child, icon, label);
insertTab(index, child, icon, label);
Un esempio molto semplice di TabWidget può essere:
import sys from PyQt5.QtWidgets import (QMainWindow, QApplication, QPushButton, QWidget, QTabWidget, QVBoxLayout) from PyQt5.QtGui import QIcon class MainWindow(QMainWindow): def __init__(self): super(MainWindow, self).__init__() self.setWindowTitle("QTabWidget Example") self.central_widget = TableWidget(self) self.setCentralWidget(self.central_widget) self.resize(400, 100) class TableWidget(QWidget): def __init__(self, parent): super(QWidget, self).__init__(parent) self.layout = QVBoxLayout(self) # Inizializzo il TabWidget self.tab_widget = QTabWidget() self.tab1 = QWidget() # Creo un primo widget generico self.tab2 = QWidget() # Creo un secondo widget generico self.tab_widget.resize(300, 200) # Aggiungo i tabs al TabWidget self.tab_widget.addTab(self.tab1, QIcon("Italy.png"), "Ialy") self.tab_widget.addTab(self.tab2, QIcon("France.png"), "France") # Create first tab layout1 = QVBoxLayout(self) self.pushButton1 = QPushButton("button 1") layout1.addWidget(self.pushButton1) self.tab1.setLayout(layout1) # aggiungo il layout al widget generico # Create second tab layout2 = QVBoxLayout(self) self.pushButton2 = QPushButton("button 2") layout2.addWidget(self.pushButton2) self.tab2.setLayout(layout2) # aggiungo il layout al widget generico # Add tabs to widget self.layout.addWidget(self.tab_widget) self.setLayout(self.layout) self.pushButton1.clicked.connect(self.on_button) self.pushButton2.clicked.connect(self.on_button) def on_button(self): button = self.sender() print("Clicked on <%s>" % button.text()) if __name__ == '__main__': app = QApplication(sys.argv) main_window = MainWindow() main_window.show() sys.exit(app.exec_())
Vediamo i metodi più importanti di QTabWidget:
Aggiunta e rimozione tabs
Come già anticipato possiamo aggiungere tab con il metodo addTab(child, label):
>>> from PyQt5.QtWidgets import * >>> app = QApplication(sys.argv) >>> tabwidget = QTabWidget() >>> tab1 = QWidget() >>> tabwidget.addTab(tab1, "tab1") 0 >>> tab0 = QWidget() >>> tabwidget.insertTab(0, tab0, "tab0") 0
L’int ritornato è la posizione di inserimento del tab.
Per sapere quanti tab ci sono in un TabWidget si utilizza il metodo count
>>> tabwidget.count() 2
Nota:
Come anticipato, è possibile risalire al componente principale del tabwidget, il tabbar appunto:
>>> tabwidget.tabBar() <PyQt5.QtWidgets.QTabBar object at 0x0396D5D0> >>> tabbar = tabwidget.tabBar() >>> tabbar.count() 2 >>> tabbar.currentIndex() 1
Per rimuovere un tab si utilizza il metodo removeTab(index), dove index è ovviamente l’indice della posizione del tab da rimuovere.
>>> tabwidget.removeTab(0) >>> tabwidget.count() 1
Per rimuovere tutti i tabs in un colpo solo si utilizza il metodo clear
Testo, Icona e Tooltip
Il nome di un tab è modificabile anche dopo l’avvenuta aggiunta sul tabwidget; si utilizza il metodo setTabText(index, text).
Allo stesso modo è possibile aggiungere un’icona con il metodo setTabIcon(index, icon) e un tooltip con il metodo
setTabToolTip(index, tooltip_text)
>>> tabwidget.setTabText(0, "New tab 1") >>> from PyQt5.QtGui import QIcon >>> tabwidget.setTabIcon(0, QIcon("icon.png")) >>> tabwidget.setTabToolTip(0, "Tab 1 tooltip text")
Tutte queste cose sono rintracciabili con i metodi tabIcon(index) per risalire all’Icona assegnata al tab di indice index,
tabToolTip(index) per risalire al tooltip del tab e tabText(index) per il testo:
>>> tabwidget.tabIcon(0) <PyQt5.QtGui.QIcon object at 0x0396D3F0> >>> tabwidget.tabToolTip(0) 'Tab 1 tooltip text' >>> tabwidget.tabText(0) 'New tab 1'
Con il metodo widget è possibile risalire al widget appartenente a quel tab di indice index es:
>>> class MyQWidget(QWidget): ... def __init__(self, name): ... super(MyQWidget, self).__init__() ... self.name = name ... >>> mytab = MyQWidget("MyTab 1") >>> tabwidget.addTab(mytab, "my tab 1") 1 >>> tabwidget.widget(1).name 'MyTab 1'
Vediamo alcune cose di tipo Grafico
AutoHide
Se settiamo il metodo setAutoHide a True, qualora il tabwidget avesse meno di 2 tab, la tabbar scomparirebbe automaticamente.
... # Aggiungo i tabs al TabWidget self.tab_widget.addTab(self.tab1, QIcon("Italy.png"), "Ialy") # self.tab_widget.addTab(self.tab2, QIcon("France.png"), "France") ...
Se commentiamo l’aggiunta del secondo tab, il risultato sarà:
Tab chiudibili
Se vogliamo che i tab siano chiudibili, bisogna settare a True il metodo setTabsClosable.
Apparirà così un pulsante di chiusura nel tab.
Cliccando su tale pulsante verrà emesso un segnale tabCloseRequested da collegare all’apposito slot.
... # Aggiungo i tabs al TabWidget self.tab_widget.addTab(self.tab1, QIcon("Italy.png"), "Ialy") self.tab_widget.addTab(self.tab2, QIcon("France.png"), "France") self.tab_widget.setTabsClosable(True) self.tab_widget.tabCloseRequested[int].connect(self.on_tab_close) ... def on_tab_close(self, int): print("Tab <%s> Closed!" % int) self.tab_widget.removeTab(int) ...
Tab Disattivabili
E’ sufficiente utilizzare il metodo setTabEnabled(index, bool) ad es:
... self.tab_widget.setTabEnabled(0, False) ...
risulterà in:
L’informazione relativa al tab sarà ottenibile tramite il metodo isTabEnabled(index):
>>> tabwidget.setTabEnabled(0, False) >>> tabwidget.isTabEnabled(0) False
Shift dei Tab
Se vogliamo che i tab possano muoversi per scambiarsi ad esempio di posto, possiamo utilizzare il metodo setMovable(bool):
... # self.tab_widget.setTabEnabled(0, False) self.tab_widget.setMovable(True) ...
Ovviamente lo shift, aggiornerà anche gli indici nella tabbar.
Quando setMovable è attivo, possiamo anche spostare le tab in differenti posizioni. Di Default vengono posizionate in alto (QTabWidget.North), ma è possibile utilizzare anche altre modalità, usando i valori
QTabWidget.South, QTabWidget.East, QTabWidget.West:
... self.tab_widget.setMovable(True) self.tab_widget.setTabPosition(QTabWidget.West) ...
Abbiamo già parlato del segnale tabCloseRequested, vediamo gli altri.
currentChanged(index): segnale emesso quando si cambia tab;
tabBarClicked(index): segnale emesso quando si clicca sulla tabbar;
tabBarDoubleClicked(index): segnale emesso quando si doppio-clicca sulla tabbar;
Non resta che connettere tali segnali agli slot dedicati:
... self.tab_widget.tabCloseRequested[int].connect(self.on_tab_close) self.tab_widget.currentChanged[int].connect(self.on_tab_change) self.tab_widget.tabBarClicked[int].connect(self.on_tab_click) self.tab_widget.tabBarDoubleClicked[int].connect(self.on_tab_2click) def on_tab_close(self, int): print("Tab <%s> Closed!" % int) self.tab_widget.removeTab(int) def on_tab_change(self, int): print("Now you are in Tab <%s>!" % int) def on_tab_click(self, int): print("You have clicked on Tab <%s>!" % int) def on_tab_2click(self, int): print("You have double-clicked on Tab <%s>!" % int) ...
Commenti recenti