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)
...
自定义代表现在应该按预期显示
问题:如何在 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)
...
自定义代表现在应该按预期显示