You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 22:31:02