使用整数创建项目,QStandardItem不提供QSpinBox

问题描述 投票:0回答:1

我在程序中将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中的这两个代码均按预期提供了旋转框。

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

谢谢您的所有回答。

python pyside2 qstyleditemdelegate qstandarditem
1个回答
0
投票

说明:

[发生的情况是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_()
© www.soinside.com 2019 - 2024. All rights reserved.