Установите весь столбец в QTableWidget только для чтения в Python
Вопрос
я хочу сделать столбец в своей таблице доступным только для чтения!я перепробовал все возможные комбинации флагов, но безуспешно
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)
Хотя это была хорошая идея...
Решение
Я получил это работая, используя 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)
Другие советы
пытаться:
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 будут установлены элементы, доступные только для чтения.ХТХ
Решение, показанное выше, можно упростить до:
class MyDelegate(QtWidgets.QItemDelegate):
def createEditor(self, *args):
return None
table = QtWidgets.QTableWidget(2, 2)
table.setItemDelegateForColumn(MyDelegate())
Это решение отличается от ItemIsEditable
решение в том смысле, что вы по-прежнему можете выбирать и выделять элементы в столбце.