QTableview:如何在底部添加空白行并显示委托

时间:2018-11-13 10:34:13

标签: pyqt qtableview

问题:如何在表格底部插入空白行,并在行被编辑后出现委托?

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

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

但是,在编辑最后一行时,默认委托不存在。仅在保存/提交然后编辑此行之后,代理才会显示...

1 个答案:

答案 0 :(得分:0)

我无法使用默认的代表,但是,您可以创建自定义代表,然后将其设置为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)
        ...

自定义委托现在应按预期显示