Форум сайта python.su
Доброго дня,
имеется три таблицы QTableView. Каждая последующая таблица имеет ноль и более строк связаных только с одной строкой предыдщей таблицы (master-detail relation). Необходима фильтрация строк во второй и третей таблице только связаных с соответствующей строкой первой таблицы. По видимому по колонке ID, которые во второй и третей таблице будут скрытыми.
В MainForm я делаю вызов функции TABLE2Filter когда строка из первой таблицы выбрана:
self.connect(self.ui.TABLE1.selectionModel(), QtCore.SIGNAL("currentRowChanged(QModelIndex, QModelIndex)"), self.TABLE2Filter)
def assetChanged(self, index):
if index.isValid():
record = self.assetModel.record(index.row())
id = record.value("id").toInt()[0]
self.logModel.setFilter(QString("assetid = %1").arg(id))
else:
self.logModel.setFilter("assetid = -1")
self.logModel.select()
filterTABLE2 = QtGui.QSortFilterProxyModel()
filterTABLE2.setSourceModel(self.TABLE2Model)
self.ui.TABLE2.setModel(filterTABLE2)
Офлайн
У QSortFilterProxyModel есть метод filterAcceptsRow(self,sourceRow,sourceParent)
Может это вам нужно?
Офлайн
возможно… никак не могу найти и/или понять как как этим методом пользоваться… и чем он (метод) занимается в этой жизни… :-|
Офлайн
Чем этот метод занимается в жизни, должно быть понятно из названия :)
Я им пользуюсь так:
Устанавливаю регулярку, по которой следует фильтровать
def textFilterChanged(self):
""" Фильтрация.
"""
caseSensitivity = QtCore.Qt.CaseSensitive if self.filterState.isChecked() else QtCore.Qt.CaseInsensitive
regExp = QtCore.QRegExp(self.filterText.text(), caseSensitivity)
self.mealproxyModel.setFilterRegExp(regExp)
def filterAcceptsRow(self, source_row, source_parent):
index1 = self.sourceModel().index(source_row, 1, source_parent)
index2 = self.sourceModel().index(source_row, 2, source_parent)
index3 = self.sourceModel().index(source_row, 3, source_parent)
return (
self.sourceModel().data(index1, QtCore.Qt.DisplayRole).toString().contains(self.filterRegExp()) or
self.sourceModel().data(index2, QtCore.Qt.DisplayRole).toString().contains(self.filterRegExp()) or
self.sourceModel().data(index3, QtCore.Qt.DisplayRole).toString().contains(self.filterRegExp())
)
g-kit
По видимому по колонке ID
Офлайн
спасибо, конечно. А можете еще продемонстрировать self.filterText.text() ?
Офлайн
g-kit
так это обычный QLineEdit
Офлайн
у меня что-то получилось, но несколько проще. Напомню что необходим фильтр на вторую таблицу, что бы высвечивались только данные связанные с строкой первой таблицы на которой находится курсор в данный момент.
Итак, в MainForm (наименования функций и переменных изменено (по отношению к выше приведенному примеру))
self.connect(self.ui.srcTable.selectionModel(), QtCore.SIGNAL("currentRowChanged(QModelIndex, QModelIndex)"), self.frmTableFilter)
def frmTableFilter(self):
index = self.ui.srcTable.currentIndex()
if index.isValid():
row = index.row()
srcCode = self.srcTableModel.data(self.srcTableModel.index(row, SRCCODE)).toString() # Получил ID но в текстовом формате, как того ожидает QRegExp
filterFrmTable = QtGui.QSortFilterProxyModel() # Модель
filterFrmTable.setSourceModel(self.frmTableModel) # Модель
self.ui.frmTable.setModel(filterFrmTable) # Модель
filterFrmTable.setDynamicSortFilter(True) #фильтр должен работать на лету
filterFrmTable.setFilterKeyColumn(0) # фильтр применяем по первой колонке
regExp = QtCore.QRegExp(srcCode, QtCore.Qt.CaseInsensitive) # подставил ID в фильтр
filterFrmTable.setFilterRegExp(regExp) # применил фильтр
Отредактировано (Июнь 17, 2010 14:08:57)
Офлайн
g-kitпростое лучше сложного :)
как-то подозрительно просто получилось
g-kitесли работает, то хорошо. Не ищите ошибок, только потому что “как-то просто получилось”
Боюсь, что чего-то не учел
g-kitМожет лучше их вынести из этой функции?
filterFrmTable = QtGui.QSortFilterProxyModel() # Модель
filterFrmTable.setSourceModel(self.frmTableModel) # Модель
self.ui.frmTable.setModel(filterFrmTable) # Модель
filterFrmTable.setDynamicSortFilter(True) #фильтр должен работать на лету
filterFrmTable.setFilterKeyColumn(0) # фильтр применяем по первой колонке
Офлайн