PyQt。如何在 QTableView 中插入小部件

ser*_*mma 6 python pyqt qwidget qtableview pyqt5

这里有张桌子:

tab=QTableView()
sti=QStandardItemModel(parent=None)
sti.appendRow([QStandardItem(str(1)),QStandardItem(str(2)),QStandardItem(str(3)),QStandardItem(str(4))])
tab.setModel(sti)
tab.setEditTriggers(QAbstractItemView.NoEditTriggers)
Run Code Online (Sandbox Code Playgroud)

有一个按钮:

btn=QPushButton('Press', self)
btn.clicked.connect(self.on_clicked)
btn.resize(btn.sizeHint())
Run Code Online (Sandbox Code Playgroud)

任务:如何在 QStandardItem(str(4)) 的表格单元格插入中插入按钮 btn?QTableWidget类有一个方法.setCellWidget(),但我是从QTableView继承的。如果我使用 QTableWidget 我将无法使用私有方法 .setModel()

eyl*_*esc 7

为了能够插入小部件,您必须使用与单元格关联的 必须作为第一个参数传递的setIndexWidget()方法QModelIndex(),考虑到行和列的索引从 0 开始,对于文本等于str(4)其坐标的项目是0, 3

if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    app.setStyle("fusion")
    tab = QTableView()
    sti = QStandardItemModel()
    sti.appendRow([QStandardItem(str(i)) for i in range(4)])
    tab.setModel(sti)
    tab.setEditTriggers(QAbstractItemView.NoEditTriggers)
    tab.setIndexWidget(sti.index(0, 3), QPushButton("button"))
    tab.show()
    sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)

如果你有,你也可以通过方法QStandardItem()访问QModelIndexindexFromItem()