微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么布尔值会在 QAbstractTableModel 中创建下拉菜单?

如何解决为什么布尔值会在 QAbstractTableModel 中创建下拉菜单?

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

我想知道这是为什么?我可以从委托访问该编辑器以连接其信号(即 currentIndexChanged)吗?

截图

enter image description here

这是一个简单的代码片段来重现:

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,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_())

解决方法

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

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

正如您在布尔值的情况下看到的那样,使用 QComboBox 作为编辑器,而在 QString(或 Python 的字符串)的情况下,使用 QLineEdit。

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。