Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用整数创建项,QStandardItem不';不要提供QSpinBox_Python_Pyside2_Qstyleditemdelegate_Qstandarditem - Fatal编程技术网

Python 使用整数创建项,QStandardItem不';不要提供QSpinBox

Python 使用整数创建项,QStandardItem不';不要提供QSpinBox,python,pyside2,qstyleditemdelegate,qstandarditem,Python,Pyside2,Qstyleditemdelegate,Qstandarditem,我在程序中使用PySide2和QTableView以及QStandardItemModel(称为resourcesModel的对象)。当我使用以下代码创建、填充项目并将其放入表中时: item = QStandardItem() item.setData(123123, Qt.EditRole) resourcesModel.setItem(1, 1, item) 当我双击包含该值的单元格时,它会提供一个框来编辑数据,我可以将字母放入其中。我期望的行为是有一个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?不编写自定义委托就可以绕过此问题吗


谢谢您的回答。

解释:

PyTr2 C++中的Pyth2将整数从Python转换为LongLong(qVal::LangLoad=4),默认情况下,它不由默认QITEMeDeDeWorkFrand处理,使用<代码> QLINEEDIT < /C> >(在PyQt被转换为QMeta Type::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_()
从PySide2导入QtCore、QtGui、QtWidgets
类ItemEditorFactory(QtWidgets.QItemEditorFactory):
def createEditor(自身、用户类型、父项):
如果userType==4:
返回qtwidts.QSpinBox(父项,最小值=-2147483648,最大值=2147483647)
return super().createEditor(用户类型,父级)
如果名称=“\uuuuu main\uuuuuuuu”:
app=QtWidgets.QApplication([])
工厂=ItemEditorFactory()
qtwidts.QItemEditorFactory.setDefaultFactory(工厂)
w=qtwidts.QTableView()
resourcesModel=QtGui.QStandardItemModel(2,2)
w、 setModel(资源模型)
item=QtGui.QStandardItem()
item.setData(123123,QtCore.Qt.EditRole)
resourcesModel.setItem(1,1,item)
w、 调整大小(640480)
w、 show()

app.exec()
谢谢,您的解决方案适合我!然而,我很惊讶,你必须使用一个神奇的数字(4代表QVariant::LongLong=4)才能在PySIde2中工作,这样做似乎不是很优雅。@kunek在我看来这是一个bug。看起来是这样的。我提交了bug,并感谢您的解释。再次感谢你!