Установите весь столбец в QTableWidget только для чтения в Python

StackOverflow https://stackoverflow.com//questions/24024815

  •  21-12-2019
  •  | 
  •  

Вопрос

я хочу сделать столбец в своей таблице доступным только для чтения!я перепробовал все возможные комбинации флагов, но безуспешно

    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 решение в том смысле, что вы по-прежнему можете выбирать и выделять элементы в столбце.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top