QTableview:如何在底部添加一个空白行并让它显示代表

QTableview: How to add a blank row at the bottom and have it show delegates

问题:如何在 table 的底部插入一个空白行,并在编辑该行后显示代表?

到目前为止我做了什么:我通过增加行数在 QTableView 的底部添加了一个新行,如下所示:

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

但是,在编辑最后一行时,默认代理不存在。只有在 saving/submitting 然后编辑此行之后,代表才会出现...

我无法让默认委托工作,但是您可以创建自定义委托,然后将它们设置为 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)
        ...

自定义代表现在应该按预期显示