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

2024-09-30 14:28:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我在程序中使用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?不编写自定义委托就可以绕过此问题吗

谢谢你的回答


Tags: 项目对象代码程序itemqtpyside2setitem
1条回答
网友
1楼 · 发布于 2024-09-30 14:28:40

说明:

PyTr2在C++中将Python转换为LongLong(qVal::LangLon=4),默认情况下,它不被默认QITEMEdEdWorkFrand处理,使用了^ {< CD1>}(在PyQt被转换为QMeta Type::int=2)。p>

解决方案:

一种可能的解决方案是创建一个自定义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_()

相关问题 更多 >