在python中的“QTableWidget”中设置一整列为只读

在python中的“QTableWidget”中设置一整列为只读,python,qt,qt5,pyside,Python,Qt,Qt5,Pyside,我想将表中的一列设置为只读!我尝试了所有可能的旗帜组合,但没有成功 item = QtGui.QTableWidgetItem() from operator import xor item.setFlags(xor(item.flags(),QtCore.Qt.ItemIsEditable)) self.Table.setHorizontalHeaderItem(4, item) 我也尝试了而不是,=和^运算符,但列项目仍可编辑 更新 我想我误解了这一点!我

我想将表中的一列设置为只读!我尝试了所有可能的旗帜组合,但没有成功

    item = QtGui.QTableWidgetItem()
    from operator import xor
    item.setFlags(xor(item.flags(),QtCore.Qt.ItemIsEditable))
    self.Table.setHorizontalHeaderItem(4, item)
我也尝试了
而不是
=
^
运算符,但列项目仍可编辑


更新 我想我误解了这一点!我认为,当我将某列的HorizontalHeaderItem设置为不可编辑时,当使用诸如
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
,每次插入或创建新行时都会添加它


编辑 正如上面提到的,我尝试使用
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())
在主窗口

    self.Size = QTableWidgetDisabledItem(self.MyTable)
    self.MyTable.setItemDelegateForColumn(4,self.Size)
这是个好主意…

试试:

    flags != QtCore.Qt.ItemIsEditable
    item.setFlags(flags)
这对我来说是最后一次:-)

编辑:很抱歉这里没有更详细的内容。当然,您需要应用到所需列中的每个项目,例如:

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)

将第3列设置为该列中的只读项。HTH

我使用
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)

上述解决方案可简化为:

class MyDelegate(QtWidgets.QItemDelegate):

    def createEditor(self, *args):
        return None

table = QtWidgets.QTableWidget(2, 2)
table.setItemDelegateForColumn(MyDelegate())

此解决方案与
ItemIsEditable
解决方案的不同之处在于,您仍然可以选择并突出显示列中的项目

您是否尝试从列的所有项中删除
Qt.ItemIsEnabled
标志?@vahancho您的意思是使用循环?是的,例如在循环中。您的意思是
flags=item.flags()!=QtCore.Qt.ItemIsEditable
?我试过了,但没有成功!