PySide QListView:无法通过QStyledItemDeleg替换默认编辑器

2024-09-30 22:20:56 发布

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

我正在看一个关于Qt的模型视图概念的教程,可能太简短了。下面的代码应该通过委托类用QSpinBox替换默认的QLineEdit。是什么问题导致仍然显示默认的QLineEdit?在

from PySide.QtGui import *
from PySide.QtCore import *
import sys


class MyListModel(QAbstractListModel):
    def __init__(self, parent=None):
        super(MyListModel, self).__init__(parent)
        self._data = [70, 90, 20, 50]

    def rowCount(self):
        return len(self._data)

    def data(self, index, role):
        if role == Qt.DisplayRole:
            return str(self._data[index.row()])
        elif role == Qt.FontRole:
            font = QFont()
            font.setPointSize(16)
            return font
        elif role == Qt.EditRole:
            return str(self._data[index.row()])

    def setData(self, index, value, role=Qt.EditRole):
        if role == Qt.EditRole:
            self._data[index.row()] = int(value)
            self.dataChanged.emit(index, index)
            return True
        return False

    def flags(self, index):
        flag = super(MyListModel, self).flags(index)
        return flag | Qt.ItemIsEditable


class MyEditDelegate(QStyledItemDelegate):
    def createEditor(self, parent, option, index):
        sbox = QSpinBox(parent)
        sbox.setRange(0, 100)
        return sbox

    def setEditorData(self, editor, index):
        item_str = index.data(Qt.DisplayRole)
        item_int = int(item_str)
        editor.setValue(item_int)

    def setModelData(self, editor, model, index):
        data_int = editor.value()
        data_str = str(data_int)
        model.setData(index, data_str)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    model = MyListModel()
    delegate = MyEditDelegate()

    view = QListView()
    view.setModel(model)
    view.setItemDelegate(delegate)
    view.show()

    sys.exit(app.exec_())

Tags: selfviewdataindexmodelreturndefitem