如何借助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)
我正在使用 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)