【问题标题】:Set a whole column in `QTableWidget` read-only in python在python中将`QTableWidget`中的一整列设置为只读
【发布时间】:2014-06-03 20:59:43
【问题描述】:

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

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

我也尝试了and not!=^ 运算符,但列项仍可编辑


更新

我想我误解了这一点!我想当我将一列中的 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,每次插入或创建新行时都会添加它


编辑

如上所述,我尝试使用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 你的意思是循环?
  • 是的,例如在循环中。

标签: python qt qt5 pyside


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    尝试:

        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 列设置为该列中的只读项。高温

    【讨论】:

    • 你的意思是flags = item.flags() != QtCore.Qt.ItemIsEditable?我试过了,但没有用!
    【解决方案3】:

    如上所示的解决方案可以简化为:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-16
      • 1970-01-01
      • 2011-02-04
      • 2017-01-19
      • 1970-01-01
      • 1970-01-01
      • 2016-10-27
      • 1970-01-01
      相关资源
      最近更新 更多