使用QSortFilterProxyModel时setHeaderData函数编译报错求助
解决QSortFilterProxyModel中setHeaderData报错及代码问题
1. 核心报错原因:混用PyQt6和PySide6模块
代码同时导入了PyQt6和PySide6的核心模块(QtCore、QtGui、QtWidgets),这两个是独立的Qt Python绑定,枚举值、类结构存在差异,直接混用会导致类型不匹配,这是setHeaderData报错的主要原因。
- 解决方案:统一使用PyQt6或PySide6,不要交叉导入。
2. 代码中的其他错误及修复
2.1 未正确引用实例变量
__init__方法中调用self.create_model(liste),但liste未定义,需改为实例变量self.liste:
self.create_model(self.liste)
2.2 模型数据填充逻辑错误
create_model方法中,model.setItem(row, column, item)写在了嵌套循环外面,导致仅最后一个item被添加到模型,需将该行移到内层循环内:
for row in range(model.rowCount()): itemr = lis[row] for column in range(model.columnCount()): item = QStandardItem(str(itemr[column])) model.setItem(row, column, item) # 移至内层循环
2.3 实例方法缺少self参数
add_item方法作为类的实例方法,未声明self参数,需补充:
def add_item(self, model, id, nom): model.insertRow(0) model.setData(model.index(0, 0), str(id)) model.setData(model.index(0, 1), nom)
2.4 清理无用导入
导入的string、QStringConverterBase、QStringEncoder未被使用,可直接删除,减少代码冗余。
修复后的完整代码(统一使用PySide6)
from PySide6.QtCore import (Qt, Slot, QSortFilterProxyModel, QRegularExpression) from PySide6.QtGui import (QStandardItem, QStandardItemModel) from PySide6.QtWidgets import (QLabel, QLineEdit, QWidget, QGroupBox, QTreeView, QGridLayout, QVBoxLayout) class vueliste(QWidget): def __init__(self, table): super().__init__() self.liste = [(1, "INDEPENDANT"), (2, "BGMP")] self._proxy_model = QSortFilterProxyModel() self._proxy_model.setDynamicSortFilter(True) self._proxy_group_box = QGroupBox("Liste") self._proxy_view = QTreeView() self._proxy_view.setRootIsDecorated(False) self._proxy_view.setAlternatingRowColors(True) self._proxy_view.setModel(self._proxy_model) self._proxy_view.setSortingEnabled(True) self._filter_line_edit = QLineEdit() self._filter_line_edit.setClearButtonEnabled(True) self._filter_label = QLabel("&Nom:") self._filter_label.setBuddy(self._filter_line_edit) self._filter_line_edit.textChanged.connect(self.filter_changed) proxy_layout = QGridLayout() proxy_layout.addWidget(self._proxy_view, 0, 0, 1, 3) proxy_layout.addWidget(self._filter_label, 1, 0) proxy_layout.addWidget(self._filter_line_edit, 1, 1, 1, 2) self._proxy_group_box.setLayout(proxy_layout) main_layout = QVBoxLayout() main_layout.addWidget(self._proxy_group_box) self.setLayout(main_layout) self.setWindowTitle("Listes des " + table) self.resize(500, 450) self._proxy_view.sortByColumn(1, Qt.AscendingOrder) self._filter_line_edit.setText("") self.create_model(self.liste) def set_source_model(self, model): self._proxy_model.setSourceModel(model) def add_item(self, model, id, nom): model.insertRow(0) model.setData(model.index(0, 0), str(id)) model.setData(model.index(0, 1), nom) def create_model(self, lis): model = QStandardItemModel(len(lis), 2) model.setHeaderData(0, Qt.Orientation.Horizontal, "id") model.setHeaderData(1, Qt.Orientation.Horizontal, "nom") for row in range(model.rowCount()): itemr = lis[row] for column in range(model.columnCount()): item = QStandardItem(str(itemr[column])) model.setItem(row, column, item) self._proxy_model.setSourceModel(model) @Slot() def filter_changed(self): pattern = self._filter_line_edit.text() pattern = QRegularExpression.escape(pattern) reg_exp = QRegularExpression(pattern) options = reg_exp.patternOptions() options |= QRegularExpression.CaseInsensitiveOption reg_exp.setPatternOptions(options) self._proxy_model.setFilterRegularExpression(reg_exp)
内容的提问来源于stack exchange,提问作者chemli_ls
相关产品推荐
相关产品推荐

