Home > PyQt5, python > PyQt5: QStandardItem

PyQt5: QStandardItem

9 Maggio 2019

Torna all’indice degli appunti

QStandardItem

La classe QStandardItem mette a disposizione l’elemento cardine da utilizzare con la classe QStandardItemModel, classe generica utilizzata per immagazzinare dati personalizzati da visualizzare in widgets come QlistView, QTableView e QTreeView.
Tutti questi oggetti fanno parte della famiglia di classi Model/View, necessarie per l’utilizzo del framework model/view di Qt.

Vediamo pertanto l’elemento base di questa filiera: QStandardItem

Ogni elemento può avere il proprio text, font, icon, background e foreground, settabili con i rispettivi metodi setText(text), setIcon(QIcon), setFont(QFont), setBackground(QBrush) e setForeground(QBrush).

>>> from PyQt5.QtGui import QStandardItem
>>> item = QStandardItem()
>>> item.setText("Italy")
>>> from PyQt5.QtGui import QIcon
>>> item.setIcon(QIcon("italy.png"))
>>> from PyQt5.QtGui import QFont
>>> item.setFont(QFont("Lucida", 12, QFont.StyleItalic))

è possibile ovviamente recuperare queste informazioni con i rispettivi metodi text, font, icon ecc.

>>> item.text()
'Italy'
>>> item.icon()
<PyQt5.QtGui.QIcon object at 0x03525D50>
>>> item.font()
<PyQt5.QtGui.QFont object at 0x032E5530>

Di default un QStandardItem è editabile (editable), selezionabile (selctable), non spuntabile (checkable):

>>> item.isEnabled()
True
>>> item.isSelectable()
True
>>> item.isCheckable()
False

Questi flags possono essere modificati tramite il metodo setFlags(Qt.ItemFlags).
Qt.ItemFlags può assumere i seguenti valori:

costante

valore

descrizione
Qt.NoItemFlags 0 nessuna proprietà settata
Qt.ItemIsSelectable 1 può essere selezionato
Qt.ItemIsEditable 2 può essere editato
Qt.ItemIsDragEnabled 4 può essere trascinato (drag and drop)
Qt.ItemIsDropEnabled 8 può essere usato come drop-target (drag and drop)
Qt.ItemIsUserCheckable 16 può essere spuntato dall’utente (chackable)
Qt.ItemIsEnabled 32 l’utente può interagire con l’elemento (attivo)
Qt.ItemIsAutoTristate 64 lo stato dell’elemento dipende dallo stato dei suoi figli
Qt.ItemNeverHasChildren 128 l’elemento non avrà mai elementi figlio
Qt.ItemIsUserTristate 256 l’utente può ciclare su 3 stati separati

Per recuperare i flags di un elemento, si utilizza il metodo flags che ritornerà un oggetto QItemFlags.
Nel caso volessi rendere l’elemento chackable e non editable:

>>> from PyQt5.QtCore import Qt
>>> item.setFlags(Qt.ItemIsSelectable | Qt.ItemIsUserCheckable | Qt.ItemIsEnabled)
>>> item.isEditable()
False
>>> item.isEnabled()
True
>>> item.isCheckable()
True
>>> item.isSelectable()
True

In caso di Checkable element, è possibile settare lo stato con il metodo setCheckState(Qt.CheckState) ed è recuperabile con il metodo checkState.
Qt.CheckState può assumere i seguenti valori: Unchecked (0), PartiallyChecked (1), Checked (2).

>>> item.checkState()
0
>>> item.setCheckState(Qt.Checked)
>>> item.checkState()
2

Oltre a setFlags, è possibile settare i flag dell’elemento con i singoli metodi:

setSelectable(bool), setEditable(bool), setCheckable(bool)…

oppure dati come font, backgrouund, foreground con:

setFont(QFont), setBackground(QBrush), setForeground(QBrush)…

DATI

La peculiarità della classe QStandardItem è quella di poter settare dati al proprio interno, rispettivamente al role desiderato.
Per fare questa operazione di utilizza il metodo setData(data, ItemDataRole), dove data è il valore che vogliamo immagazzinare all’interno dell’elemento e ItemDataRole, è il tipo di dato al quale vogliamo associare il dato stesso.
I Roles sono valori utilizzati dalla view, per dire al model di che dati ha bisogno e si distinguono in:

costante

valore

descrizione
Qt.DisplayRole 0 Utilizzato quando i dati sono in formato testo (QString)
Qt.DecorationRole 1 Utilizzato quando i dati riguardano una decorazione (QColor, QIcon, QPixMap)
Qt.EditRole 2 Utilizzato quando i dati devono essere editati in un editor (QString)
Qt.ToolTipRole 3 Utilizzato quando i dati riguardano il tooltip di un elemento (QString)
Qt.StatusTipRole 4 Utilizzato per i dati da visualizzare sulla status bar (QString)
Qt.WhatsThisRole 5 Utilizzato per i dati di un elemento in modalità “What’s This?” (QString)
Qt.SizeHintRole 13 Utilizzato per il size hint dell’elemento che sarà visualizzato nella view (QSize)

Poi ci sono i Roles relativi all’aspetto e i meta-data:

costante

valore

descrizione
Qt.FontRole 6 Utilizzato per il font (QFont)
Qt.TextAlignmentRole 7 Utilizzato per il tipo di allineamento del testo (Qt.Alignment)
Qt.BackgroundRole 8 Utilizzato per il background brush dell’elemento (QBrush)
Qt.ForegroundRole 9 Utilizzato per il foreground brush (text color) dell’elemento (QBrush)
Qt.CheckStateRole 10 Utilizzato per ottenere il checked state dell’elemento (Qt.CheckState)
Qt.InitialSortOrderRole 14 Utilizzato per ottenere l’ordinamento iniziale di una sezione “header view” (Qt.SortOrder)

…i roles di accessibilità:

costante

valore

descrizione
Qt.AccessibleTextRole 11 Il testo utilizzato da accessibility extensions e plugins come gli screen readers (QString)
Qt.AccessibleDescriptionRole 12 Un’ altra descrizione dell’elemento per scopi di accessibilità ulteriori(QString)

ed infine gli User roles:

costante

valore

descrizione
Qt.UserRole 0x0100 Il primo role da utilizzare in caso di scopi specifici

Per settare i dati per un tipo di role, si procede quindi come segue:

>>> from PyQt5.QtGui import QFont
>>> from PyQt5.QtCore import Qt
>>> parent.setData(QFont("Red"), Qt.FontRole)
>>> parent.setData("Parent Item", Qt.ToolTipRole)

Per ottenere i dati impostati per un elemento si utilizza il metodo data(ItemDataRole):

>>> parent.data(Qt.ToolTipRole)
'Parent Item'
>>> parent.data(Qt.FontRole)
<PyQt5.QtGui.QFont object at 0x03507A70>

TABELLA

Altra caratteristica fondamentale è che ogni elemento può avere una tabella bidimensionale di elementi figlo (child).
Questo rende possibile costruire gerarchie di elementi.
Le dimensioni della tabella figlio (child-table) possono essere settate con i metodi setRowCount(rows) e setColumnCount(columns).
Gli elementi figlio possono essere inseriti nella child-table con il metodo setChild(row, column, child), dove child è ovviamente l’oggetto QStandardItem figlio.
Il riferimento all’elemento figlio (child-item) si ottiene con il metodo child(row, column).
Per sapere se un oggetto QStandardItem ha figli, si usa il metodo hasChildren
Da un oggetto figlio è invece possibile risalire al padre con il metodo parent:

>>> from PyQt5.QtGui import QStandardItem
>>> parent = QStandardItem("parent")
>>> child_1 = QStandardItem("child 1")
>>> parent.setRowCount(3)
>>> parent.setChild(0, 0, child_1)
>>> parent.hasChildren()
True
>>> parent.child(0, 0)
<PyQt5.QtGui.QStandardItem object at 0x03527E40>
>>> parent.child(0, 0).text()
'child 1'
>>> child_2 = QStandardItem("child 2")
>>> parent.setChild(1, 0, child_2)
>>> parent.child(1, 0).text()
'child 2'
>>> child_2.parent()
<PyQt5.QtGui.QStandardItem object at 0x03527DA0>
>>> child_2.parent().text()
'parent'

E’ possibile inserire righe e colonne alla tabella in posizioni definite, con i metodi insertRow(row, items) e insertColumn(column, items), oppure semplicemente effettuare un append in fondo alla tabella con i metodi appendRow(items) e appendColumn(items), dove items è una lista di QstandardItem.
L’utilizzo di questi metodi comporta l’accrescimento della tabella a seconda delle esigenze.

>>> parent.columnCount()
1
>>> parent.rowCount()
3
>>> parent.insertRow(1, [QStandardItem("extrachild 3"), QStandardItem("extrachild 4")])
>>> parent.rowCount()
4
>>> parent.columnCount()
2
>>> parent.child(1, 0).text()
'extrachild 3'
>>> parent.child(1, 1).text()
'extrachild 4'

Inserendo la colonna, l’inserimento degli elementi avverrà dall’alto:

parent.insertColumn(1, [QStandardItem("extrachild 5"), QStandardItem("extrachild 6")])
parent.rowCount()
4
parent.columnCount()
3
parent.child(0, 1).text()
'extrachild 5'
parent.child(1, 1).text()
'extrachild 6'

Un riga di elementi figli può essere eliminata con i metodi removeRow(row) e takeRow(row), allo stesso modo è possibile eliminare una colonna con i rispettivi metodi removeColumn(column) e takeColumn(column).
Per eliminare un gruppo di righe o di colonne si utilizzano invece i metodi:
removeRows(row, rows), dove row è l’indice della riga da eliminare e rows, quante righe eliminare da row in avanti;
removeColumns(column, columns), dove column è l’indice della colonna da eliminare e columns, quante colonne eliminare da column in avanti.

Torna all’indice degli appunti

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