为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

呼唤远方 2022-09-06 16:55:15
我在我的程序中使用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,而输入的值只是一个整数?是否可以在不编写自定义委托的情况下解决此问题?感谢您的所有回答。
查看完整描述

1 回答

?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

解释:


发生的事情是,PySide2将整数从python转换为LongLong(QVariant::LongLong=4),C++默认情况下,默认QItemEditorFactory不会处理,因此使用了(在PyQt中转换为QMetaType::Int=2)。QLineEdit


溶液:


一种可能的解决方案是创建一个返回相应小部件的自定义 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_()


查看完整回答
反对 回复 2022-09-06
  • 1 回答
  • 0 关注
  • 153 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信