PyQt5: QStandardItem
Torna all’indice degli appunti
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.
Commenti recenti