+-
在`QTableWidget`中设置整个列只读在python中
我想在我的表中将列设置为只读!我尝试了所有可能的标志组合而没有成功

    item = QtGui.QTableWidgetItem()
    from operator import xor
    item.setFlags(xor(item.flags(),QtCore.Qt.ItemIsEditable))
    self.Table.setHorizontalHeaderItem(4, item)

我也尝试过,而不是!=和^运算符,但列项仍然可以编辑

更新

我想我误解了这个!我想当我将一个列的Horizo​​ntalHeaderItem设置为不可编辑时,当使用insertRow()等操作时,这将使该列中的所有新项自动无法编辑

插入新行后,我对每个新添加的项目执行了这些功能!

        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)

我认为更好(但更复杂)的解决方案是使用setItemDelegateForColumn()和QtGui.QItemDelegate()来创建只读的costum QTableWidgetItem,每次插入或创建新行时都会添加该QTableWidgetItem

编辑

好吧,我试图使用如上所述的setItemDelegateForColumn()和QtGui.QItemDelegate(),但我得到以下警告

> python main.py
sys:1: RuntimeWarning: Invalid return value in function QItemDelegate.createEdit
or, expected PySide.QtGui.QWidget, got PySide.QtGui.QTableWidgetItem.

我的代码是

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())

在MainWindow

    self.Size = QTableWidgetDisabledItem(self.MyTable)
    self.MyTable.setItemDelegateForColumn(4,self.Size)

虽然这是个好主意……

最佳答案
我使用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())

然后只需简单地使用它如下

self.Size = QTableWidgetDisabledItem(self.MyTable)
self.MyTable.setItemDelegateForColumn(4,self.Size)
点击查看更多相关文章

转载注明原文:在`QTableWidget`中设置整个列只读在python中 - 乐贴网