创建带有整数的项目,QStandardItem 不提供 QSpinBox



我在程序中使用PySide2和QTableView与QStandardItemModel(称为resourcesModel的对象(。当我使用以下代码创建、填充并将项目放入表中时:

item = QStandardItem()
item.setData(123123, Qt.EditRole)
resourcesModel.setItem(1, 1, item)

当我双击包含该值的单元格时,它会提供一个用于编辑数据的框,我可以将字母放入其中。我期望的行为是有一个QSpinBox,这样只有数字才能放在那里。

此代码:

item = QStandardItem()
item.setData(0.25, Qt.EditRole)
resourcesModel.setItem(1, 1, item)

如预期的那样,双击单元格后会显示一个QDoubleSpinBox。PyQt5中的这两个代码都按预期提供了spinbox。

当输入的值只是一个整数时,为什么QStandardItem不提供QSpinBox?是否可以在不编写自定义委托的情况下绕过此问题?

谢谢你的回答。

解释:

PySide2在C++中将整数从python转换为LongLong(QVariant::LongLong=4(,默认情况下,默认QItemEditorFactory不处理该整数,使用QLineEdit(在PyQt中转换为QMetaType::Int=2(。

解决方案:

一个可能的解决方案是创建一个自定义的QItemEditorFactory,返回适当的小部件:

from PySide2 import QtCore, QtGui, QtWidgets

class ItemEditorFactory(QtWidgets.QItemEditorFactory):
def createEditor(self, userType, parent):
if userType == 4:
return QtWidgets.QSpinBox(parent, minimum=-2147483648, maximum=2147483647)
return super().createEditor(userType, parent)

if __name__ == "__main__":
app = QtWidgets.QApplication([])
factory = ItemEditorFactory()
QtWidgets.QItemEditorFactory.setDefaultFactory(factory)
w = QtWidgets.QTableView()
resourcesModel = QtGui.QStandardItemModel(2, 2)
w.setModel(resourcesModel)
item = QtGui.QStandardItem()
item.setData(123123, QtCore.Qt.EditRole)
resourcesModel.setItem(1, 1, item)
w.resize(640, 480)
w.show()
app.exec_()

最新更新