在Python中将`QTableWidget`的整个列设置为只读

6
我想将表格中的一列设置为只读!我尝试了所有可能的标志组合但都没有成功。
    item = QtGui.QTableWidgetItem()
    from operator import xor
    item.setFlags(xor(item.flags(),QtCore.Qt.ItemIsEditable))
    self.Table.setHorizontalHeaderItem(4, item)

我还尝试了and not!=^操作符,但列项仍然可编辑。

更新

我觉得我曾经误解了这个!我以为将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()来创建只读自定义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)

很好的想法,尽管...

你是否尝试从该列的所有项目中移除“Qt.ItemIsEnabled”标志? - vahancho
@vahancho 你的意思是用循环吗? - Ben Ishak
是的,在循环中,例如。 - vahancho
3个回答

6

我使用 QLineEdit 让它能够工作了。

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)

4

尝试:

    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)

将第三列设置为只读项。希望对你有所帮助。


你的意思是 flags = item.flags() != QtCore.Qt.ItemIsEditable 吗?我尝试了一下,但没有成功! - Ben Ishak

2
以上所展示的解决方案可以简化为:
class MyDelegate(QtWidgets.QItemDelegate):

    def createEditor(self, *args):
        return None

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

这种解决方案与ItemIsEditable解决方案不同,因为您仍然可以选择和突出显示列中的项目。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接