使用模型和委托小部件向 QTableView 添加行

问题描述

我正在尝试使用 QAbstractTableModel 和 QItemDelegate 向 QTableView 添加一行,其中小部件出现在添加的行中。从我读过的内容来看,我需要在添加行的每个项目上调用 .edit(index) 来调用 createEditor,在其中创建小部件,但是我得到了 edit: editing failed

QItemDelegate:

class Delegate(QItemDelegate):

    def __init__(self):
        QItemDelegate.__init__(self)

        self.type_items = ["1","2","3"]

    def createEditor(self,parent,option,index):

        # COMBOBOX,LINEEDIT,TIMEDIT
        if index.column() == 0:
            comboBox = QComboBox(parent)
            for text in self.type_items:
                comboBox.addItem(text,(index.row(),index.column()))
            return comboBox

        elif index.column() == 1:
            lineEdit = QLineEdit(parent)
            return lineEdit

        elif index.column() == 2:
            timeEdit = QTimeEdit(parent)
            return timeEdit

    def setEditorData(self,editor,index):
        value = index.model()._data[index.row()][index.column()]

        if index.column() == 0:
            editor.setCurrentIndex(self.type_items.index(value))

        elif index.column() == 1:
            editor.setText(str(value))

        elif index.column() == 2:
            editor.setTime(value)

QAbstractTableModel:

class TableModel(QAbstractTableModel):
    def __init__(self,data):
        super(TableModel,self).__init__()
        self._data = data

    def data(self,index,role):
        pass

    def rowCount(self,index=None):
        return len(self._data)

    def columnCount(self,index=None):
        return len(self._data[0])

主要内容:

class MainWindow(QMainWindow):
    def __init__(self,parent=None):
        super(MainWindow,self).__init__(parent)

        localWidget = QWidget()

        self.table = QTableView(localWidget)

        data = [["1","Hi",QTime(2,1)],["2","Hello",QTime(3,0)]]

        self.model = TableModel(data)
        self.table.setModel(self.model)
        self.table.setItemDelegate(Delegate())

        self.add_row = QPushButton("Add Row",localWidget)
        self.add_row.clicked.connect(self.addRow)

        for row in range(self.model.rowCount()):
            for column in range(self.model.columnCount()):
                index = self.model.index(row,column)
                self.table.openPersistentEditor(index)

        layout_v = QVBoxLayout()
        layout_v.addWidget(self.table)
        layout_v.addWidget(self.add_row)
        localWidget.setLayout(layout_v)
        self.setCentralWidget(localWidget)
        self.show()

    def addRow(self):

        new_row_data = ["3","Howdy",QTime(9,0)]

        self.model.beginInsertRows(QModelIndex(),self.model.rowCount(),self.model.rowCount())
        self.model._data.append(new_row_data)
        self.model.endInsertRows()
        for i in range(len(new_row_data)):
            index = self.table.model().index(self.model.rowCount()-1,i)
            self.table.edit(index)

app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())

如何触发 QItemDelegate 的 createEditor 为添加的行项目创建小部件并使用 setEditorData 填充它们?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)