如何解决为什么布尔值会在 QAbstractTableModel 中创建下拉菜单?
在我的自定义模型中,设置 bool 值会自动创建一个带有 True/False 选项的组合框/下拉菜单,而字符串值则创建一个常规的行编辑类型的编辑器。
我想知道这是为什么?我可以从委托访问该编辑器以连接其信号(即 currentIndexChanged)吗?
截图
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
标准工厂实现为各种数据类型提供了编辑器。每当委托需要为模型提供的数据提供编辑器时,就会创建这些。下表显示了类型与提供的标准编辑器之间的关系。
正如您在布尔值的情况下看到的那样,使用 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 举报,一经查实,本站将立刻删除。