Imposta un'intera colonna in "QTableWidget" di sola lettura in Python
Domanda
voglio impostare una colonna nella mia tabella in sola lettura!ho provato tutte le possibili combinazioni di flag senza successo
item = QtGui.QTableWidgetItem()
from operator import xor
item.setFlags(xor(item.flags(),QtCore.Qt.ItemIsEditable))
self.Table.setHorizontalHeaderItem(4, item)
ho anche provato and not
, !=
E ^
operatori ma gli elementi della colonna sono ancora modificabili
Aggiornamento
Penso di aver frainteso questo!ho pensato che quando ho impostato l'HorizontalHeaderItem su una colonna in modo che non fosse modificabile, tutti i nuovi elementi in quella colonna sarebbero stati automaticamente non modificabili, quando si utilizzavano operazioni come insertRow()
Ho dovuto eseguire queste funzioni per ogni nuovo elemento aggiunto dopo aver inserito una nuova riga!
tableWidget.insertRow(row+1)
if tableWidget is self.myTable:
item = QtGui.QTableWidgetItem()
item.setFlags(item.flags() != QtCore.Qt.ItemIsEditable)
tableWidget.setItem(row+1, 4, item)
Penso che una soluzione migliore (ma più complessa) sia usare setItemDelegateForColumn()
E QtGui.QItemDelegate()
per creare un costume di sola lettura QTableWidgetItem
che verrà aggiunto ogni volta che viene inserita o creata una nuova riga
Modificare
Beh, ho provato a usare setItemDelegateForColumn()
E QtGui.QItemDelegate()
come menzionato sopra, ma ho ricevuto il seguente avviso
> python main.py
sys:1: RuntimeWarning: Invalid return value in function QItemDelegate.createEdit
or, expected PySide.QtGui.QWidget, got PySide.QtGui.QTableWidgetItem.
Il mio codice per quello era
class QTableWidgetDisabledItem(QtGui.QItemDelegate):
"""
"""
def __init__(self, parent):
QtGui.QItemDelegate.__init__(self, parent)
def createEditor(self, parent, option, index):
item = QtGui.QTableWidgetItem()
item.setFlags(item.flags() != QtCore.Qt.ItemIsEditable)
return item
def setEditorData(self, editor, index):
editor.blockSignals(True)
editor.setData(index, editor.text())
editor.blockSignals(False)
def setModelData(self, editor, model, index):
model.setData(index, editor.text())
e nella finestra principale
self.Size = QTableWidgetDisabledItem(self.MyTable)
self.MyTable.setItemDelegateForColumn(4,self.Size)
Comunque è stata una buona idea...
Soluzione
L'ho fatto funzionare usando QLineEditor
class QTableWidgetDisabledItem(QtGui.QItemDelegate):
"""
Create a readOnly QTableWidgetItem
"""
def __init__(self, parent):
QtGui.QItemDelegate.__init__(self, parent)
def createEditor(self, parent, option, index):
item = QtGui.QLineEdit(parent)
item.setReadOnly(True)
#item.setEnabled(False)
return item
def setEditorData(self, editor, index):
editor.blockSignals(True)
editor.setText(index.model().data(index))
editor.blockSignals(False)
def setModelData(self, editor, model, index):
model.setData(index, editor.text())
e poi semplicemente usarlo come segue
self.Size = QTableWidgetDisabledItem(self.MyTable)
self.MyTable.setItemDelegateForColumn(4,self.Size)
Altri suggerimenti
Tentativo:
flags != QtCore.Qt.ItemIsEditable
item.setFlags(flags)
a me ha funzionato l'ultima volta :-)
MODIFICARE:mi spiace di non essere stato più dettagliato qui.Ovviamente è necessario applicare a ogni elemento nella colonna desiderata, esempio:
flags = Qt.ItemFlags()
flags != Qt.ItemIsEnabled
for r in range(rows):
for c in range(columns):
item = QTableWidgetItem('Row %s Column %s' % (r,c))
if c == 2:
item.setFlags(flags)
table.setItem(r, c, item)
Imposterà la colonna 3 sugli elementi di sola lettura in quella colonna.HTH
La soluzione mostrata sopra può essere semplificata in:
class MyDelegate(QtWidgets.QItemDelegate):
def createEditor(self, *args):
return None
table = QtWidgets.QTableWidget(2, 2)
table.setItemDelegateForColumn(MyDelegate())
Questa soluzione differisce dalla ItemIsEditable
soluzione nel senso che puoi ancora selezionare ed evidenziare gli elementi nella colonna.