Двойной поиск в QtTable Widget

Nik_812

Новичок
Пользователь
Июл 4, 2022
10
0
1
Здравствуйте, начал изучать QT GUI (я новичок в этом вопросе) пытаюсь сделать поиск по двум категориям
в таблице (отмечу, что код работает, но поисковики перебивают друг друга), в принципе, я знаю что поиск надо производить при помощи регулярных выражений, но информации доступным языком я так и не нашел, буду безгранично благодарен за помощь

вот код:

Python:
self.lineEdit.textChanged.connect(self.search)
self.lineEdit_2.textChanged.connect(self.search)
for c in range(0, Col):
            for r in range(0, Row):
                s = self.lineEdit.setText("") and self.lineEdit_2.setText("")
                i =  QtWidgets.QTableWidgetItem(s )
                self.tableWidget.setItem(c, r, i)
          
    def search(self, s):
        items = self.tableWidget.findItems(s, QtCore.Qt.MatchContains)
        if items:
            self.tableWidget.setCurrentItem(items[0])
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 581
457
83
пытаюсь сделать поиск по двум категориям
в таблице
по каким категориям? как они выражены? что они объединяют? как вы планируете выдавать результат, если эти категории, например, противоречат друг другу?

я знаю что поиск надо производить при помощи регулярных выражений
не обязательно, можно просто по совпадению букв

в общем нужно больше инфы...
 

Nik_812

Новичок
Пользователь
Июл 4, 2022
10
0
1
по каким категориям? как они выражены? что они объединяют? как вы планируете выдавать результат, если эти категории, например, противоречат друг другу?


не обязательно, можно просто по совпадению букв

в общем нужно больше инфы...
Есть 7 столбцов, поиск нужно производить по 2 из них по региону и ассортименту, по соответствиям спискам тоже не получится, из-за большого количества категорий

Python:
item = self.tableWidget.horizontalHeaderItem(0)
        item.setText(_translate("MainWindow", "Регион"))
        item = self.tableWidget.horizontalHeaderItem(1)
        item.setText(_translate("MainWindow", "Адрес"))
        item = self.tableWidget.horizontalHeaderItem(2)
        item.setText(_translate("MainWindow", "Предприятие"))
        item = self.tableWidget.horizontalHeaderItem(3)
        item.setText(_translate("MainWindow", "Ассортимент"))
        item = self.tableWidget.horizontalHeaderItem(4)
        item.setText(_translate("MainWindow", "Количество"))
        item = self.tableWidget.horizontalHeaderItem(5)
        item.setText(_translate("MainWindow", "Результат"))
        item = self.tableWidget.horizontalHeaderItem(6)
        item.setText(_translate("MainWindow", "Примечание"))
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 581
457
83
как результат должен выдаваться?
 

Nik_812

Новичок
Пользователь
Июл 4, 2022
10
0
1
как результат должен выдаваться?
сопоставлением (какой ассортимент в регионе)
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 581
457
83
сопоставлением (какой ассортимент в регионе)
ну получается поиск только по одной категории - регион...
 

Nik_812

Новичок
Пользователь
Июл 4, 2022
10
0
1
ну получается поиск только по одной категории - регион...
Не совсем, если регион и поиск ассортимента совпадает, ячейки строки выделяются синхронно
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 581
457
83
не совсем уверен что правильно понял задачу, но вот пример, в результате выдается строка и столбец где найдено, можно переделать под ваши нужды (ячейки редактируются)

Python:
from PyQt5 import QtCore
import PyQt5.QtWidgets


class Window(PyQt5.QtWidgets.QWidget):
    def __init__(self, rows, columns):
        PyQt5.QtWidgets.QWidget.__init__(self)
        self.table = PyQt5.QtWidgets.QTableWidget(self)
        self.table.setRowCount(rows)
        self.table.setColumnCount(columns)
        for column in range(columns):
            for row in range(rows):
                item = PyQt5.QtWidgets.QTableWidgetItem(f"Текст{row}")
                self.table.setItem(row, column, item)
        self.edit = PyQt5.QtWidgets.QLineEdit(self)
        self.button = PyQt5.QtWidgets.QPushButton("Поиск", self)
        self.button.clicked.connect(self.slotButton)
        layout = PyQt5.QtWidgets.QVBoxLayout(self)
        layout.addWidget(self.table)
        layout.addWidget(self.edit)
        layout.addWidget(self.button)

    def slotButton(self):
        items = self.table.findItems(self.edit.text(), QtCore.Qt.MatchExactly)
        if items:
            results = '\n'.join(f"строка {item.row() + 1} столбец {item.column() + 1}" for item in items)
        else:
            results = "Ничего"
        PyQt5.QtWidgets.QMessageBox.information(self, "Результат", results)


if __name__ == '__main__':
    import sys
    app = PyQt5.QtWidgets.QApplication(sys.argv)
    window = Window(6, 3)
    window.resize(350, 300)
    window.show()
    sys.exit(app.exec_())
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 581
457
83
а выделением это как можно реализовать

вобщем вот код:
Python:
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import QRegularExpression


class Ui_MainWindow(QtWidgets.QMainWindow):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1920, 1000)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit.setGeometry(QtCore.QRect(10, 40, 131, 20))
        self.lineEdit.setStyleSheet(" QLineEdit {\n"
"\n"
"     border-radius: 10px;\n"
"     padding: 0 8px;\n"
"\n"
"     selection-background-color: darkgray;\n"
" }\n"
" QLineEdit[echoMode=\"2\"] {\n"
"     lineedit-password-character: 9679;\n"
" }")
        self.lineEdit.setInputMask("")
        self.lineEdit.setText("")
        self.lineEdit.setPlaceholderText("поиск...")
        self.lineEdit.textChanged.connect(self.search)
        self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_2.setGeometry(QtCore.QRect(10, 100, 131, 20))
        self.lineEdit_2.setStyleSheet(" QLineEdit {\n"
"\n"
"     border-radius: 10px;\n"
"     padding: 0 8px;\n"
"\n"
"     selection-background-color: darkgray;\n"
" }\n"
" QLineEdit[echoMode=\"2\"] {\n"
"     lineedit-password-character: 9679;\n"
" }")
        self.lineEdit_2.setInputMask("")
        self.lineEdit_2.setText("")
        self.lineEdit_2.setPlaceholderText("поиск...")
        self.lineEdit_2.textChanged.connect(self.search)
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(10, 310, 84, 23))
        self.pushButton.setStyleSheet("QPushButton {\n"
"    font: 14pt \"Segoe UI\";\n"
"\n"
"     border-radius: 6px;\n"
"     background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,\n"
"                                       stop: 0 #f6f7fa, stop: 1 #dadbde);\n"
"     min-width: 80px;\n"
" }\n"
"\n"
" QPushButton:pressed {\n"
"     background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,\n"
"                                       stop: 0 #dadbde, stop: 1 #f6f7fa);\n"
" }\n"
"\n"
" QPushButton:flat {\n"
"     border: none; /* для плоской кнопки границы нет */\n"
" }\n"
"\n"
" QPushButton:default {\n"
"     border-color: navy; /* делаем кнопку по умолчанию выпуклой */\n"
" }\n"
" QPushButton:open { /* когда собственное меню кнопки раскрыто */\n"
"     background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,\n"
"                                       stop: 0 #dadbde, stop: 1 #f6f7fa);\n"
" }\n"
"\n"
" QPushButton::menu-indicator {\n"
"     image: url(menu_indicator.png);\n"
"     subcontrol-origin: padding;\n"
"     subcontrol-position: bottom right;\n"
" }\n"
"\n"
" QPushButton::menu-indicator:pressed, QPushButton::menu-indicator:open {\n"
"     position: relative;\n"
"     top: 2px; left: 2px; /* сдвигаем стрелку на 2 px */\n"
" }")
        self.pushButton.setObjectName("pushButton")
        self.tableWidget = QtWidgets.QTableWidget(self.centralwidget)
        self.tableWidget.setGeometry(QtCore.QRect(200, 0, 1720, 1000))
        Row = 10000
        Col = 7
        self.tableWidget.setRowCount(Row)
        self.tableWidget.setColumnCount(Col)
        self.tableWidget.setObjectName("tableWidget")
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(0, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(1, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(2, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(3, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(4, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(5, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(6, item)
        self.tableWidget.horizontalHeader().setDefaultSectionSize(237)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 1920, 21))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)


        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)
       
       

        for c in range(0, Col):
            for r in range(0, Row):
                s = self.lineEdit.setText("")
                i =  QtWidgets.QTableWidgetItem(s )
                self.tableWidget.setItem(c, r, i)

               
    def search(self, s):
        items = self.tableWidget.findItems(s, QtCore.Qt.MatchContains)
        if items:
            self.tableWidget.setCurrentItem(items[0])
       


    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton.setText(_translate("MainWindow", "Старт"))
        item = self.tableWidget.horizontalHeaderItem(0)
        item.setText(_translate("MainWindow", "Регион"))
        item = self.tableWidget.horizontalHeaderItem(1)
        item.setText(_translate("MainWindow", "Адрес"))
        item = self.tableWidget.horizontalHeaderItem(2)
        item.setText(_translate("MainWindow", "Предприятие"))
        item = self.tableWidget.horizontalHeaderItem(3)
        item.setText(_translate("MainWindow", "Ассортимент"))
        item = self.tableWidget.horizontalHeaderItem(4)
        item.setText(_translate("MainWindow", "Количество"))
        item = self.tableWidget.horizontalHeaderItem(5)
        item.setText(_translate("MainWindow", "Результат"))
        item = self.tableWidget.horizontalHeaderItem(6)
        item.setText(_translate("MainWindow", "Примечание"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())
в вашей лапше я разбираться не стал, извините, вот мой пример с выделением
Python:
from PyQt5 import QtCore
import PyQt5.QtWidgets


class Window(PyQt5.QtWidgets.QWidget):
    def __init__(self, rows, columns):
        PyQt5.QtWidgets.QWidget.__init__(self)
        self.table = PyQt5.QtWidgets.QTableWidget(self)
        self.table.setRowCount(rows)
        self.table.setColumnCount(columns)
        for column in range(columns):
            for row in range(rows):
                item = PyQt5.QtWidgets.QTableWidgetItem(f"Текст{row}")
                self.table.setItem(row, column, item)
        self.edit = PyQt5.QtWidgets.QLineEdit(self)
        self.button = PyQt5.QtWidgets.QPushButton("Поиск", self)
        self.button.clicked.connect(self.slotButton)
        layout = PyQt5.QtWidgets.QVBoxLayout(self)
        layout.addWidget(self.table)
        layout.addWidget(self.edit)
        layout.addWidget(self.button)

    def slotButton(self):
        items = self.table.findItems(self.edit.text(), QtCore.Qt.MatchExactly)
        if items:
            for item in items:
                self.table.setRangeSelected(PyQt5.QtWidgets.QTableWidgetSelectionRange(item.row(),
                                                                                       item.column(),
                                                                                       item.row(),
                                                                                       item.column()), True)


if __name__ == '__main__':
    import sys
    app = PyQt5.QtWidgets.QApplication(sys.argv)
    window = Window(6, 3)
    window.resize(350, 300)
    window.show()
    sys.exit(app.exec_())
 

Nik_812

Новичок
Пользователь
Июл 4, 2022
10
0
1
в вашей лапше я разбираться не стал, извините, вот мой пример с выделением
Python:
from PyQt5 import QtCore
import PyQt5.QtWidgets


class Window(PyQt5.QtWidgets.QWidget):
    def __init__(self, rows, columns):
        PyQt5.QtWidgets.QWidget.__init__(self)
        self.table = PyQt5.QtWidgets.QTableWidget(self)
        self.table.setRowCount(rows)
        self.table.setColumnCount(columns)
        for column in range(columns):
            for row in range(rows):
                item = PyQt5.QtWidgets.QTableWidgetItem(f"Текст{row}")
                self.table.setItem(row, column, item)
        self.edit = PyQt5.QtWidgets.QLineEdit(self)
        self.button = PyQt5.QtWidgets.QPushButton("Поиск", self)
        self.button.clicked.connect(self.slotButton)
        layout = PyQt5.QtWidgets.QVBoxLayout(self)
        layout.addWidget(self.table)
        layout.addWidget(self.edit)
        layout.addWidget(self.button)

    def slotButton(self):
        items = self.table.findItems(self.edit.text(), QtCore.Qt.MatchExactly)
        if items:
            for item in items:
                self.table.setRangeSelected(PyQt5.QtWidgets.QTableWidgetSelectionRange(item.row(),
                                                                                       item.column(),
                                                                                       item.row(),
                                                                                       item.column()), True)


if __name__ == '__main__':
    import sys
    app = PyQt5.QtWidgets.QApplication(sys.argv)
    window = Window(6, 3)
    window.resize(350, 300)
    window.show()
    sys.exit(app.exec_())
Это не мое,это QT Desidner😭

но все же спасибо,вы единственный на всех форумах,кто нормально ответил😊
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 581
457
83
Это не мое,это QT Desidner😭
есть такое понятие как минимально рабочий пример - то есть маленький код, который демонстрирует вашу проблему
и в вопросах на форумах, желательно, показывать именно его
но все же спасибо,вы единственный на всех форумах,кто нормально ответил😊
рад был помочь
 

Nik_812

Новичок
Пользователь
Июл 4, 2022
10
0
1
есть такое понятие как минимально рабочий пример - то есть маленький код, который демонстрирует вашу проблему
и в вопросах на форумах, желательно, показывать именно его

рад был помочь
Прошу прощения, ещё такой вопрос,по вашему примеру как сделать поиск только по 1вой колонке
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 581
457
83
Прошу прощения, ещё такой вопрос,по вашему примеру как сделать поиск только по 1вой колонке
findItems ищет по всей таблице, если искать по строкам/столбцам, нужно писать свой функционал
как вариант можно так (пример не оптимизирован, так сказать в лоб)

Python:
from PyQt5 import QtCore
import PyQt5.QtWidgets


class Window(PyQt5.QtWidgets.QWidget):
    def __init__(self, rows, columns):
        PyQt5.QtWidgets.QWidget.__init__(self)
        self.rows = rows
        self.table = PyQt5.QtWidgets.QTableWidget(self)
        self.table.setRowCount(rows)
        self.table.setColumnCount(columns)
        for column in range(columns):
            for row in range(rows):
                item = PyQt5.QtWidgets.QTableWidgetItem(f"Текст{row}")
                self.table.setItem(row, column, item)
        self.edit = PyQt5.QtWidgets.QLineEdit(self)
        self.button = PyQt5.QtWidgets.QPushButton("Поиск", self)
        self.button.clicked.connect(self.slotButton)
        layout = PyQt5.QtWidgets.QVBoxLayout(self)
        layout.addWidget(self.table)
        layout.addWidget(self.edit)
        layout.addWidget(self.button)

    def slotButton(self):
        for row in range(self.rows):
            if self.table.item(row, 0).text() == self.edit.text():
                self.table.setRangeSelected(PyQt5.QtWidgets.QTableWidgetSelectionRange(row,
                                                                                       0,
                                                                                       row,
                                                                                       0), True)
        # items = self.table.findItems(self.edit.text(), QtCore.Qt.MatchExactly)
        # if items:
        #     for item in items:
        #         self.table.setRangeSelected(PyQt5.QtWidgets.QTableWidgetSelectionRange(item.row(),
        #                                                                                item.column(),
        #                                                                                item.row(),
        #                                                                                item.column()), True)


if __name__ == '__main__':
    import sys
    app = PyQt5.QtWidgets.QApplication(sys.argv)
    window = Window(6, 3)
    window.resize(350, 300)
    window.show()
    sys.exit(app.exec_())
 
  • Мне нравится
Реакции: Анатолий

Nik_812

Новичок
Пользователь
Июл 4, 2022
10
0
1
findItems ищет по всей таблице, если искать по строкам/столбцам, нужно писать свой функционал
как вариант можно так (пример не оптимизирован, так как сказать в лоб)

Python:
from PyQt5 import QtCore
import PyQt5.QtWidgets


class Window(PyQt5.QtWidgets.QWidget):
    def __init__(self, rows, columns):
        PyQt5.QtWidgets.QWidget.__init__(self)
        self.rows = rows
        self.table = PyQt5.QtWidgets.QTableWidget(self)
        self.table.setRowCount(rows)
        self.table.setColumnCount(columns)
        for column in range(columns):
            for row in range(rows):
                item = PyQt5.QtWidgets.QTableWidgetItem(f"Текст{row}")
                self.table.setItem(row, column, item)
        self.edit = PyQt5.QtWidgets.QLineEdit(self)
        self.button = PyQt5.QtWidgets.QPushButton("Поиск", self)
        self.button.clicked.connect(self.slotButton)
        layout = PyQt5.QtWidgets.QVBoxLayout(self)
        layout.addWidget(self.table)
        layout.addWidget(self.edit)
        layout.addWidget(self.button)

    def slotButton(self):
        for row in range(self.rows):
            if self.table.item(row, 0).text() == self.edit.text():
                self.table.setRangeSelected(PyQt5.QtWidgets.QTableWidgetSelectionRange(row,
                                                                                       0,
                                                                                       row,
                                                                                       0), True)
        # items = self.table.findItems(self.edit.text(), QtCore.Qt.MatchExactly)
        # if items:
        #     for item in items:
        #         self.table.setRangeSelected(PyQt5.QtWidgets.QTableWidgetSelectionRange(item.row(),
        #                                                                                item.column(),
        #                                                                                item.row(),
        #                                                                                item.column()), True)


if __name__ == '__main__':
    import sys
    app = PyQt5.QtWidgets.QApplication(sys.argv)
    window = Window(6, 3)
    window.resize(350, 300)
    window.show()
    sys.exit(app.exec_())
Вот оно, дай тебе бог здоровья богатырского, мил человек
 

Форум IT Специалистов