在python中将`QTableWidget`中的一整列设置为只读
Posted
技术标签:
【中文标题】在python中将`QTableWidget`中的一整列设置为只读【英文标题】:Set a whole column in `QTableWidget` read-only in python 【发布时间】: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
、!=
和^
运算符,但列项仍可编辑
更新
我想我误解了这一点!我想当我将一列中的 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)
这是个好主意...
【问题讨论】:
您是否尝试从列的所有项目中删除Qt.ItemIsEnabled
标志?
@vahancho 你的意思是循环?
是的,例如在循环中。
【参考方案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
解决方案的不同之处在于您仍然可以选择并突出显示列中的项目。
【讨论】:
以上是关于在python中将`QTableWidget`中的一整列设置为只读的主要内容,如果未能解决你的问题,请参考以下文章
在 PyQt 中将多个小部件添加到 QTableWidget 单元格
如何在一个QTableWidget对象中将某一列单元格设置成QComboBox
在 Python 中:一次将 QtableWidget 中的所有条目插入数据库表中