[英]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.