Home > PyQt5, python > PyQt5: QTabWidget

PyQt5: QTabWidget

22 Marzo 2019

Torna all’indice degli appunti

QTabWidget

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)
...


Segnali

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)
...

Torna all’indice degli appunti

Categorie:PyQt5, python Tag: ,
I commenti sono chiusi.