如何借助QcomboBox从QlineEdit中搜索数据QSqlTableModel、Qtableview?

How to search data QSqlTableModel, Qtableview from QlineEdit with the help of QcomboBox?

我正在使用 QSqlTableModel (FilterProxyModel) 作为自定义代理模型与 QtCore.QSortFilterProxyModel、QTableView、Qcombobox。

self.lineEdit       = QtWidgets.QLineEdit(self.centralwidget)
self.view           = QtWidgets.QTableView(self.centralwidget)
self.comboBox       = QtWidgets.QComboBox(self.centralwidget)

下面的代码是自定义过滤器 class,用于从 tableview 中获取列菜单:

class FilterProxyModel(QtCore.QSortFilterProxyModel):
    def __init__(self, parent=None):
        super().__init__(parent)
        self._filter_value = None

    @property
    def filter_value(self):
        return self._filter_value

    @filter_value.setter
    def filter_value(self, value):
        self._filter_value = value
        self.invalidateFilter()

    def filterAcceptsRow(self, sourceRow, sourceParent):
        if self.filter_value is None:
            return True
        value = (
            self.sourceModel()
            .index(sourceRow, self.filterKeyColumn(), sourceParent)
            .data(self.filterRole())
        )
        return value == self.filter_value

下面是数据库模型:

    db = QSqlDatabase.addDatabase("QSQLITE")
    db.setDatabaseName("model.db")
    db.open()

    self.model = QSqlTableModel(self)
    self.model.setTable("sheet")
    self.model.select()
    self.view.setModel(self.model)

    self.proxy = FilterProxyModel(self)###
    self.proxy.setSourceModel(self.model)

    self.view.setModel(self.proxy)

下面是我的问题详情

    column_names = (["All","Name", "Age", "Adress"])
    self.comboBox.addItems([x for x in column_names])


@QtCore.pyqtSlot(str)
def msa_lineEdit_textChanged(self, text):
    self.proxy = QtCore.QSortFilterProxyModel(self)
    self.proxy.setSourceModel(self.model)
    self.view.setModel(self.proxy)
    search = QtCore.QRegExp(    text,
                                QtCore.Qt.CaseInsensitive,
                                QtCore.QRegExp.RegExp
                                )

    self.proxy.setFilterRegExp(search)

例如:我尝试使用上面的函数 QtCore.QRegExp.RegExp 它在第一列中显示数据,select在 Qcombobox 中编辑“全部”。

我在组合框中添加了项目“All”、“Name”、“Age”和“Adress”,并且我正在尝试使用 QcomboBox 从 QlineEdit 中搜索或过滤数据,就好像我 select “全部”在 cobobox 中,当我在 QlineEdit 中输入单词时,应该从所有列中过滤数据。

如果我 select QcomboBox 上的“姓名”或“年龄”或“地址”应该根据 Qcombobox 中的列名 selection 过滤数据。我的数据库有 String 和 Int 值。有没有可用的示例?

你必须正确使用 filterKeyColumn:

This property holds the column where the key used to filter the contents of the source model is read from.

The default value is 0. If the value is -1, the keys will be read from all columns.

因此您可以将行编辑 textChanged 信号和组合的 currentIndexChanged 信号连接到函数,然后相应地设置过滤器:

def msa_lineEdit_textChanged(self):
    search = QtCore.QRegExp(self.lineEdit.text(), 
        QtCore.Qt.CaseInsensitive, QtCore.QRegExp.RegExp)
    self.proxy.setFilterKeyColumn(self.combo.currentIndex() - 1)
    self.proxy.setFilterRegExp(search)

请注意,如果您使用 setFilterRegExp,您的自定义代理将无法按预期工作,这是因为您已经覆盖了 filterAcceptsRow 方法。

您应该像这样更改实现:

    def filterAcceptsRow(self, sourceRow, sourceParent):
        if self.filter_value is None:
            return super().filterAcceptsRow(sourceRow, sourceParent)
        if self.filterKeyColumn() >= 0:
            value = (
                self.sourceModel()
                .index(sourceRow, self.filterKeyColumn(), sourceParent)
                .data(self.filterRole())
            )
            return value == self.filter_value
        for column in range(self.columnCount()):
            value = (
                self.sourceModel()
                .index(sourceRow, column, sourceParent)
                .data(self.filterRole())
            )
            if value == self.filter_value:
                return True
        return False

您还应该在应用正则表达式过滤器时清除 属性:

    def setFilterRegExp(self, filter):
        self.filter_value = None
        super().setFilterRegExp(filter)