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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top