使用整数创建项目,QStandardItem 不提供 QSpinBox
Creating item with a integer, QStandardItem doesn't provide QSpinBox
我在我的程序中将 PySide2 和 QTableView 与 QStandardItemModel(称为 resourcesModel 的对象)一起使用。当我使用以下代码创建、填充并将项目放入 table:
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 中的这两个代码都按预期提供旋转框。
当输入的值只是一个整数时,为什么 QStandardItem 不提供 QSpinBox?是否可以在不编写自定义委托的情况下解决这个问题?
谢谢大家的回答。
解释:
PySide2 将整数从 python 转换为 C++ 中的 LongLong (QVariant::LongLong=4),默认情况下默认 QItemEditorFactory 不处理该整数,因此使用了 QLineEdit
(在 PyQt 中被转换为 QMetaType::Int=2).
解法:
一个可能的解决方案是创建一个自定义 QItemEditorFactory,returns 适当的小部件:
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([])
<b>factory = ItemEditorFactory()
QtWidgets.QItemEditorFactory.setDefaultFactory(factory)</b>
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_()
我在我的程序中将 PySide2 和 QTableView 与 QStandardItemModel(称为 resourcesModel 的对象)一起使用。当我使用以下代码创建、填充并将项目放入 table:
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 中的这两个代码都按预期提供旋转框。
当输入的值只是一个整数时,为什么 QStandardItem 不提供 QSpinBox?是否可以在不编写自定义委托的情况下解决这个问题?
谢谢大家的回答。
解释:
PySide2 将整数从 python 转换为 C++ 中的 LongLong (QVariant::LongLong=4),默认情况下默认 QItemEditorFactory 不处理该整数,因此使用了 QLineEdit
(在 PyQt 中被转换为 QMetaType::Int=2).
解法:
一个可能的解决方案是创建一个自定义 QItemEditorFactory,returns 适当的小部件:
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([])
<b>factory = ItemEditorFactory()
QtWidgets.QItemEditorFactory.setDefaultFactory(factory)</b>
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_()