QTableview: Как добавить пустую строку внизу и показать ее делегатам - PullRequest
0 голосов
/ 13 ноября 2018

Вопрос: Как вставить пустую строку внизу таблицы, чтобы делегаты появлялись после редактирования строки?

Что я сделал до сих пор: я добавил новую строку внизуQTableView путем увеличения количества строк, например:

def rowCount(self, parent = None):
    return super(TransactionTblSqlQueryModel,self).rowCount() + 1

Однако при редактировании последней строки делегаты по умолчанию отсутствуют.Только после сохранения / отправки и последующего редактирования этой строки появляются делегаты ...

1 Ответ

0 голосов
/ 14 ноября 2018

Я не могу заставить работать работающих по умолчанию делегатов, но вы можете создать собственные делегаты и затем установить для них нужные столбцы в QTableview

Сначала создайте делегатов:

class LineEditDelegate(QtWidgets.QStyledItemDelegate):
    def createEditor(self, QWidget, QStyleOptionViewItem, QModelIndex):
        return QtWidgets.QLineEdit(QWidget)

    def setEditorData(self, QWidget, QModelIndex):
        try:
            value = QModelIndex.model().data(QModelIndex, QtCore.Qt.EditRole)
            QWidget.setText(value)
        except:
            QWidget.setText("")

    def setModelData(self, QWidget, QAbstractItemModel, QModelIndex):
        try:
            value = QWidget.text()
            QAbstractItemModel.setData(QModelIndex, value, QtCore.Qt.EditRole)
        except:
            QAbstractItemModel.setData(QModelIndex, "", QtCore.Qt.EditRole)

    def updateEditorGeometry(self, QWidget, QStyleOptionViewItem, QModelIndex):
        QWidget.setGeometry(QStyleOptionViewItem.rect)


class SpinBoxDelegate(QtWidgets.QStyledItemDelegate):
    def createEditor(self, QWidget, QStyleOptionViewItem, QModelIndex):
        return QtWidgets.QSpinBox(QWidget)

    def setEditorData(self, QWidget, QModelIndex):
        try:
            value = QModelIndex.model().data(QModelIndex, QtCore.Qt.EditRole)
            QWidget.setValue(value)
        except:
            QWidget.setValue(0)

    def setModelData(self, QWidget, QAbstractItemModel, QModelIndex):
        try:
            value = QWidget.value()
            QAbstractItemModel.setData(QModelIndex, value, QtCore.Qt.EditRole)
        except:
            QAbstractItemModel.setData(QModelIndex, 0, QtCore.Qt.EditRole)

    def updateEditorGeometry(self, QWidget, QStyleOptionViewItem, QModelIndex):
        QWidget.setGeometry(QStyleOptionViewItem.rect)

Затем установите делегатов в столбцы QTableview

class Controller(QtWidgets.QMainWindow):
    def __init__(self, parent):
        ...
        lineEditDelegate = LineEditDelegate(self.__ui.tableView)
        spinBoxDelegate = SpinBoxDelegate(self.__ui.tableView)
        self.__ui.tableView.setItemDelegateForColumn(1, lineEditDelegate)
        self.__ui.tableView.setItemDelegateForColumn(5, spinBoxDelegate)
        ...

Пользовательские делегаты должны теперь отображаться как ожидалось

...