如何在 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.
如标题所示,我希望在 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.