簡體   English   中英

使用整數創建項目,QStandardItem 不提供 QSpinBox

[英]Creating item with a integer, QStandardItem doesn't provide QSpinBox

我在我的程序中將 PySide2 和 QTableView 與 QStandardItemModel(稱為資源模型的對象)一起使用。 當我使用以下代碼創建、填充並將一個項目放入表中時:

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 在 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_()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM