Фильтрация строк QTableWidget в PyQt5Python

Программы на Python
Ответить
Anonymous
 Фильтрация строк QTableWidget в PyQt5

Сообщение Anonymous »

Изначально у меня была простая функция фильтра, которая брала текст из QLineEdit и сопоставляла его с текстом из всех ячеек QTableWidget следующим образом:

Код: Выделить всё

class MainWindow(QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
# ...
hlayout = QHBoxLayout()
fltrlbl = QLabel("Filter on: ")
hlayout.addWidget(fltrlbl)
self.fltrle = QLineEdit()
self.fltrle.textChanged.connect(self.filterer)
self.fltrle.setClearButtonEnabled(True)
hlayout.addWidget(self.fltrle)
# ...

def filterer(self, filtertext):
for i in range(self.table.rowCount()):
for j in range(self.table.columnCount()):
item = self.table.item(i, j).text()
match = filtertext.lower() not in item.lower()
self.table.setRowHidden(i, match)
if not match:
break
Это работало отлично, но пользователи просили предоставить им возможность указать, к какому столбцу применяется фильтр. Поэтому я добавил QComboBox со списком столбцов и обновил код следующим образом:

Код: Выделить всё

class MainWindow(QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
# ...
hlayout = QHBoxLayout()
fltrlbl = QLabel("Filter on: ")
hlayout.addWidget(fltrlbl)
self.fltrcb = QComboBox()
self.fltrcb.addItems(["Name", "Email", "Address",
"City", "State", "Zip"])
hlayout.addWidget(self.fltrcb)
self.fltrle = QLineEdit()
self.fltrle.textChanged.connect(self.filterer)
self.fltrle.setClearButtonEnabled(True)
hlayout.addWidget(self.fltrle)
# ...

def filterer(self, filtertext):
icol = self.fltrcb.currentIndex()
for irow in range(self.table.rowCount()):
item = self.table.item(irow, icol).text()
match = filtertext.lower() not in item.lower()
self.table.setRowHidden(irow, match)
if not match:
break
Теперь функция фильтра останавливается после 1 итерации. Например, предположим, что есть 100 строк. Если я ищу «Джон Смит», а «Джон Смит» находится в строке 12, то вместо строки 12 будут отображаться строки с 12 по 100. Затем, когда я очищаю QLineEdit, возвращается только строка 1 (поэтому отображаются строки с 1 и с 12 по 100).
Заранее спасибо.

Подробнее здесь: https://stackoverflow.com/questions/799 ... t-in-pyqt5
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»