在python中设置' QTableWidget '中的整个列为只读



我想在我的表中设置一个列为只读!我尝试了所有可能的标志组合,但没有成功

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

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

try:

    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

上面的解决方案可以简化为:

class MyDelegate(QtWidgets.QItemDelegate):
    def createEditor(self, *args):
        return None
table = QtWidgets.QTableWidget(2, 2)
table.setItemDelegateForColumn(MyDelegate())

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

相关内容

  • 没有找到相关文章

最新更新