【问题标题】:Why do boolean values create a dropdown menu in QAbstractTableModel?为什么布尔值会在 QAbstractTableModel 中创建下拉菜单?
【发布时间】:2021-05-27 08:08:52
【问题描述】:

在我的自定义模型设置中,布尔值会自动创建带有 True/False 选项的组合框/下拉菜单,而字符串值会创建常规的行编辑类型的编辑器。

我试图理解为什么会这样?我可以从委托访问该编辑器以连接其信号(即 currentIndexChanged)吗?

截图

这是一个简单的 sn-p 代码重现:

from PySide2 import QtCore, QtGui, QtWidgets
import sys

class BoolModel(QtCore.QAbstractTableModel):
    def __init__(self, parent=None):
        super(BoolModel, self).__init__(parent)
        self.bool_value = True

    def flags(self, index):
        return QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsEnabled

    def rowCount(self, parent=QtCore.QModelIndex()):
        return 5

    def columnCount(self, parent=QtCore.QModelIndex()):
        return 1

    def data(self, index, role=QtCore.Qt.DisplayRole):
        if role == QtCore.Qt.DisplayRole or role == QtCore.Qt.EditRole:
            return self.bool_value

    def setData(self, index, value, role=QtCore.Qt.DisplayRole):
        if role == QtCore.Qt.EditRole:
            self.bool_value = value
            return True
        return False

app = QtWidgets.QApplication([])
model = BoolModel()
table = QtWidgets.QTableView()
table.show()
table.setModel(model)
sys.exit(app.exec_())

【问题讨论】:

    标签: python pyqt pyqt5 qtableview qabstracttablemodel


    【解决方案1】:

    QItemEditorFactory 是一个允许为每种类型的数据设置编辑器类型的类,如the docs 所示:

    Standard Editing Widgets
    标准工厂实现为各种数据类型提供了编辑器。每当委托需要为模型提供的数据提供编辑器时,就会创建这些。下表显示了类型和提供的标准编辑器之间的关系。

    正如您在 Booleans 的情况下看到的那样,QComboBox 被用作编辑器,而在 QString(或 python 的字符串)的情况下,使用 QLineEdit。

    您也可以使用委托访问该编辑器:

    class StyledItemDelegate(QtWidgets.QStyledItemDelegate):
        def createEditor(self, parent, option, index):
            editor = super(StyledItemDelegate, self).createEditor(parent, option, index)
            if isinstance(editor, QtWidgets.QComboBox):
                editor.currentIndexChanged.connect(print)
            return editor
    
    table.setItemDelegate(StyledItemDelegate(table))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多