如何在 QTableView 中获取功能组合框

How to get functional combobox in QTableView

如标题所示,我希望在 QTableView 中获得一个组合框。 我已经查看了其他几个处理表格视图中的组合框的问题,但它们主要涉及作为编辑器的组合框,而这不是我要找的。

我希望组合框始终可见,并从基础模型中获取数据。它不必在模型中设置数据。

我尝试改编这个进度条委托示例: 导致此代码:

class ComboDelegate(QStyledItemDelegate):
    def paint(self, painter, option, index):
        combo = QStyleOptionComboBox()
        combo.rect = option.rect
        combo.currentText = 'hallo'  # just for testing
        combo.editable = True
        combo.frame = False
        QApplication.style().drawComplexControl(QStyle.CC_ComboBox, combo, painter)

但这给了我一个灰色的、没有功能的组合框。

你如何获得功能组合框?

顾名思义,paint() 函数仅 绘制 组合框,它不会创建组合框。

如果您想要为某个项目设置持久性小部件,并且该小部件不需要更新模型,那么您应该使用 setIndexWidget()

静态 模型的基本实现可能是这样的:

class SomeWidget(QWidget):
    def __init__(self):
        # ...
        self.table.setModel(someModel)
        for row in range(someModel.rowCount()):
            combo = QComboBox(editable=True)
            combo.addItem('hallo')
            self.table.setIndexWidget(someModel.index(row, 2), combo)

如果模型可以在运行时更改(并且在启动时可能为空),那么您需要连接到 rowsInserted 信号:

class SomeWidget(QWidget):
    def __init__(self):
        # ...
        self.updateCombos()
        someModel.rowsInserted.connect(self.updateCombos)

    def updateCombos(self):
        for row in range(self.table.model().rowCount()):
            index = someModel.index(row, 2)
            if self.table.indexWidget(index):
                continue
            combo = QComboBox(editable=True)
            combo.addItem('hallo')
            self.table.setIndexWidget(index, combo)

然后您可以访问基于索引行的任意组合:

    def getComboValue(self, row):
        index = self.table.model().index(row, 2)
        widget = self.table.indexWidget(index)
        if isinstance(widget, QComboBox):
            return widget.currentText()

记住:无论何时学习文档,您都必须同时查看所有的文档继承类。在这种情况下,您不仅应该阅读有关 QTableView 的文档,还应该阅读整个继承树:QTableView > QAbstractItemView > QAbstractScrollArea > QFrame > QWidget > QObject and QPaintDevice.