Home > PyQt5, python > PyQt5: QComboBox

PyQt5: QComboBox

21 Marzo 2019

Torna all’indice degli appunti

QComboBox

Il combobox è un widget composto da un bottone e da una popup list.
Per creare un combobox si utilizza il costruttore QComboBox.
Per aggiungere elementi multipli al combobox si utilizza il metodo addItems(list), oppure addItem(str) per
aggiungere un solo elemento. Con il metodo count contiamo gli elementi della popup list:

>>> from PyQt5.QtWidgets import QApplication, QComboBox
>>> app = QApplication([])
>>> combobox = QComboBox()
>>> combobox.addItems(['Italy', 'France'])
>>> combobox.addItem('Spain')
>>> combobox.count()
3

Di default l’indice all’interno della popup list sarà settato a 0.
Per sapere quale indice è settato sulla popup list, si utilizza il metodo currentIndex.
Per modificare l’indice, si utilizza il metodo setCurrentIndex(int) e per leggere il testo dell’indice corrente,
si utilizza il metodo currentText:

>>> combobox.currentIndex()
0
>>> combobox.setCurrentIndex(1)
>>> combobox.currentIndex()
1
>>> combobox.currentText()
'France'
>>> combobox.setCurrentIndex(2)
>>> combobox.currentText()
'Spain'

Per ottenere il testo di un elemento della lista, si usa il metodo itemText(int), dove int è l’indice che ci interessa.

>>> combobox.itemText(0)
'Italy'

E’ possibile trovare un testo all’interno della popup list con il metodo findText(str).
Tale metodo ritorno l’indice del testo all’interno della lista, se lo trova, altrimenti ritorna -1.

>>> combobox.findText('Germany')
-1
>>> combobox.findText('Spain')
2

Per ottenere la lista di tutti gli elementi della popup list possiamo usare una list comprehension:

>>> items = [combobox.itemText(i) for i in range(combobox.count())]
>>> items
['Italy', 'France', 'Spain']

Per inserire un elemento in una determinata posizione, possiamo usare il metodo insertItem(int, str) dove,
int è l’indice dove verrà inserito il nuovo elemento e str è il nome del nuovo elemento che
apparirà nella popup list. Il nuovo elemento causerà lo slittamento dei successivi.
E’ possibile inserire anche una lista di nuovi elementi, con il metodo insertItems(int, list), con
list, la lista dei nuovi elementi:

>>> combobox.insertItems(1, ['San Marino', 'Andorra'])
>>> [combobox.itemText(i) for i in range(combobox.count())]
['Italy', 'San Marino', 'Andorra', 'France', 'Spain']

oppure

>>> combobox.insertItem(1, 'Germany')
>>> [combobox.itemText(i) for i in range(combobox.count())]
['Italy', 'Germany', 'France', 'Spain']

Per eliminare un elemento si utilizza il metodo removeItem(int), dove int è l’indice
dell’elemento che verrà eliminato

>>> combobox.removeItem(1)
>>> [combobox.itemText(i) for i in range(combobox.count())]
['Italy', 'France', 'Spain']

Visivamente il combobox si presenta così:

from PyQt5.QtWidgets import QMainWindow
from PyQt5.QtWidgets import QWidget, QApplication, QBoxLayout, QComboBox
import sys


class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setWindowTitle("QComboBox Example")
        self.central_widget = FormWidget(self)
        self.setCentralWidget(self.central_widget)
        self.resize(300, 100)


class FormWidget(QWidget):
    def __init__(self, parent):
        nations = ['Italy', 'France', 'Spain']
        super(FormWidget, self).__init__(parent)
        layout = QBoxLayout(QBoxLayout.TopToBottom)
        self.combobox = QComboBox()
        self.combobox.addItems(nations)
        layout.addWidget(self.combobox, 0)
        self.setLayout(layout)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main_window = MainWindow()
    main_window.show()
    sys.exit(app.exec_())

Icone

Se volessimo aggiungere le icone nella popup list, è possibile aggiungere alla combobox, oggetti QIcon invece che semplici stringhe. Infatti i metodi addItem e addItems lo consentono:

from PyQt5.QtWidgets import QMainWindow
from PyQt5.QtWidgets import QWidget, QApplication, QBoxLayout, QComboBox
import sys
from PyQt5.QtGui import QIcon


class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setWindowTitle("QComboBox Example")
        self.central_widget = FormWidget(self)
        self.setCentralWidget(self.central_widget)
        self.resize(300, 100)


class FormWidget(QWidget):
    def __init__(self, parent):
        nations = ['Italy', 'France', 'Spain']
        super(FormWidget, self).__init__(parent)
        layout = QBoxLayout(QBoxLayout.TopToBottom)
        italy_icon = QIcon("Italy.png")
        france_icon = QIcon("France.png")
        self.combobox = QComboBox()
        self.combobox.addItem(italy_icon, "Italy")  # aggiungo icona e stringa
        self.combobox.addItem(france_icon, "France")  # aggiungo icona e stringa
        layout.addWidget(self.combobox, 0)
        self.setLayout(layout)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main_window = MainWindow()
    main_window.show()
    sys.exit(app.exec_())

Segnali

Il segnale che connettiamo è activated(int).
Richiede, come da documentazione, l’id dell’elemento selezionato dalla popup list:

...

        self.combobox.activated[int].connect(self.on_combobox)

    def on_combobox(self, id):
        text = self.combobox.itemText(id)
        print("%s [%s] selected!" % (text, id))

...

Gli altri segnali ereditati sono: currentIndexChanged, currentTextChanged, editTextChanged, highlighted.

Torna all’indice degli appunti

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