PyQt中QAbstractItemDelegate在QListView中显示异常求助
PyQt委托机制paint方法对齐问题求助
我正在学习PyQt的Delegate(委托)机制,编写了测试代码进行实践,但发现paint方法无法让NameAge组件在QListView的列表项中正确对齐,找不到原因。以下是我的测试代码及问题截图,恳请各位提供指导:
import sys from PyQt5.QtCore import ( Qt, QAbstractListModel, QModelIndex) from PyQt5.QtWidgets import ( QApplication, QWidget, QListView, QAbstractItemDelegate, QHBoxLayout, QLineEdit, QSpinBox, QVBoxLayout) class NameAge(QWidget): def __init__(self, name='', age=0, parent=None): super().__init__(parent) self.name_edit = QLineEdit(name) self.age_spinbox = QSpinBox() self.age_spinbox.setValue(age) layout = QHBoxLayout() layout.addWidget(self.name_edit) layout.addWidget(self.age_spinbox) self.setLayout(layout) class NameAgeModel(QAbstractListModel): def __init__(self, data, parent=None): super().__init__(parent) self.data = data def rowCount(self, parent=QModelIndex()): return len(self.data) def data(self, index, role=Qt.DisplayRole): if role == Qt.DisplayRole: return self.data[index.row()] elif role == Qt.EditRole: return self.data[index.row()] def setData(self, index, value, role): if role == Qt.EditRole: self.data[index.row()] = value self.dataChanged.emit(index, index) return True return False def flags(self, index): return Qt.ItemIsSelectable | Qt.ItemIsEditable | Qt.ItemIsEnabled class NameAgeDelegate(QAbstractItemDelegate): def setEditorData(self, editor, index): name, age = index.data() editor.name_edit.setText(name) editor.age_spinbox.setValue(age) def setModelData(self, editor, model, index): name = editor.name_edit.text() age = editor.age_spinbox.value() model.setData(index, (name, age), Qt.EditRole) def createEditor(self, parent, option, index): name, age = index.data(Qt.DisplayRole) name_age = NameAge(name, age, self.parent()) name_age.setGeometry(option.rect) return name_age def paint(self, painter, option, index): name, age = index.data(Qt.DisplayRole) name_age = NameAge(name, age, self.parent()) name_age.setGeometry(option.rect) name_age.render(painter, option.rect.topLeft()) def sizeHint(self, option, index): name, age = index.data(Qt.DisplayRole) name_age = NameAge(name, age, self.parent()) return name_age.sizeHint() def updateEditorGeometry(self, editor, option, index): editor.setGeometry(option.rect) class MainWidget(QWidget): def __init__(self, parent=None): super().__init__(parent) layout = QVBoxLayout() self.setLayout(layout) self.list_view = QListView() self.list_view.setItemDelegate(NameAgeDelegate(self.list_view)) self.list_view.setModel(NameAgeModel( [('Mark', 38), ('John', 30), ('Jane', 25)])) layout.addWidget(self.list_view) if __name__ == '__main__': app = QApplication(sys.argv) main_widget = MainWidget() main_widget.show() sys.exit(app.exec_())

目前很难找到相关示例,感谢各位的建议。
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

