Я не эксперт в PyQt5, может быть, мне следует сказать, что я слишком слаб и совершенно новичок в PyQt5, поэтому мне нужна помощь. Я делюсь минимальным рабочим кодом, чтобы получить помощь по PyQt5 QCompleter.
Пользовательский QCompleter, указанный в моем коде, соответствует тексту QlineEdit из заданного номера столбца, например, номера столбца 0 или 1, 2, 3 или около того... о чем я должен упомянуть через приложение.
Я действительно хочу, чтобы QCompleter сопоставлял записи во всех столбцах модели таблицы QAbstract, поэтому ограничение номер столбца больше не потребуется.
Вот код:
from PyQt5.QtWidgets import QApplication, QCompleter,
QAbstractItemView, QTableView, QMainWindow, QLabel, QLineEdit
from PyQt5.QtCore import QModelIndex, QAbstractTableModel, Qt
import sys, datetime
class CustomCompleter(QCompleter):
def __init__(self, model, label, view, obj, col=0):
super().__init__()
self.label = label
w, h = 600, 480
# self.model = model
self.setCaseSensitivity(False)
self.setFilterMode(Qt.MatchContains)
self.setModel(model)
self.setCompletionRole(Qt.DisplayRole)
self.setPopup(view)
self.setModelSorting(QCompleter.CaseSensitivelySortedModel)
# self.setCompletionMode(QCompleter.PopupCompletion)
self.popup().setMinimumWidth(w)
self.popup().setMinimumHeight(h)
self.setCompletionColumn(col)
self.setMaxVisibleItems(15)
obj.setCompleter(self)
def pathFromIndex(self, index):
index = self.model().index(index.row(), 0, QModelIndex())
self.index = index.row()
self.label.setNum(self.index)
sibling_index = index.sibling(index.row(), 0)
return super().pathFromIndex(sibling_index)
class TableModel(QAbstractTableModel):
def __init__(self, data, cols):
super().__init__()
self._data = data
self.columns = cols
def rowCount(self, parent=QModelIndex()):
return len(self._data)
def columnCount(self, parent=QModelIndex()):
return len(self._data[0]) if self._data else 0
def data(self, index, role=Qt.DisplayRole):
if role == Qt.DisplayRole:
return self._data[index.row()][index.column()]
return None
def headerData(self, section, orientation, role=Qt.DisplayRole):
if orientation == Qt.Horizontal and role == Qt.DisplayRole:
return self.columns[section]
# return 'Column {}'.format(section + 1)
return super().headerData(section, orientation, role)
class TableView(QTableView):
def __init__(self, obj, model):
super().__init__()
self.setSelectionBehavior(QAbstractItemView.SelectRows)
self.verticalHeader().hide()
self.setModel(model)
class MainWindow(QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__()
self.label_return = QLabel(parent = self)
self.label_return.setGeometry(20,200, 250, 50)
w, h = 900, 480
self.setMinimumSize(w, h)
self.lineEdit = QLineEdit(self)
self.lineEdit.setGeometry(50,80, 250, 40)
self.lineEdit.returnPressed.connect(self.get_row)
self._data = ((1975, 25000.0, datetime.date(2025, 1, 16), 3, 2, 200, 160.0, 1.0, 0.0, 3960000, 'Hello How are you', 'Sale', 19, 1),
(2025, 3000.0, datetime.date(2025, 1, 16), 3, 2, 300, 200.0, 1.0, 0.0, 594000, '', 'Sale', 20, 1))
column_names = ['Bill', 'Mtr', 'Date', 'Pur', 'Sale', 'Than', 'Rate', 'Disc', 'Dis', 'Amt', 'Dtl', 'Type', 'Days', 'QID']
self.model = TableModel(self._data, column_names)
self.completer_view = TableView(self.lineEdit, self.model)
column_number = 0 # This is what i don't want the limitation of column number. I want to match the QlineEdit's Text from all columns at once and return the rows containing matching record from any of given columns
CustomCompleter(self.model, self.label_return, self.completer_view, self.lineEdit, column_number)
def get_row(label, data):
index = label.text()
if index:
v_id = data[int(index)][0]
else:
label.clear()
def clear_search(self):
self.label.clear()
if __name__ == '__main__':
app = QApplication(sys.argv)
main = MainWindow()
main.show()
try:
sys.exit(app.exec_())
except SystemExit:
None
Когда я что-то печатаю в QlineEdit, Qcompleter отображает таблицу, показывающую все строки, имеющие совпадающие записи в 1-м столбце QAbstractTableModel. Если я изменю переменную с именем columns_number с 0 на 1 или 2, то Qcompleter покажет соответствующие записи из заданного номера столбца.
Теперь я хочу, чтобы текст qlineEdit выполнялся во всех столбцах QAbstractTablemodel вместо этого выполните поиск по любому конкретному столбцу.
Пожалуйста, помогите мне разобраться в проблеме.
Я не эксперт в PyQt5, может быть, мне следует сказать, что я слишком слаб и совершенно новичок в PyQt5, поэтому мне нужна помощь. Я делюсь минимальным рабочим кодом, чтобы получить помощь по PyQt5 QCompleter. Пользовательский QCompleter, указанный в моем коде, соответствует тексту QlineEdit из заданного номера столбца, например, номера столбца 0 или 1, 2, 3 или около того... о чем я должен упомянуть через приложение. Я действительно хочу, чтобы QCompleter сопоставлял записи во всех столбцах модели таблицы QAbstract, поэтому ограничение номер столбца больше не потребуется. Вот код: [code]from PyQt5.QtWidgets import QApplication, QCompleter, QAbstractItemView, QTableView, QMainWindow, QLabel, QLineEdit from PyQt5.QtCore import QModelIndex, QAbstractTableModel, Qt import sys, datetime
column_number = 0 # This is what i don't want the limitation of column number. I want to match the QlineEdit's Text from all columns at once and return the rows containing matching record from any of given columns
def get_row(label, data): index = label.text() if index: v_id = data[int(index)][0] else: label.clear()
def clear_search(self): self.label.clear()
if __name__ == '__main__': app = QApplication(sys.argv) main = MainWindow() main.show() try: sys.exit(app.exec_()) except SystemExit: None [/code] Когда я что-то печатаю в QlineEdit, Qcompleter отображает таблицу, показывающую все строки, имеющие совпадающие записи в 1-м столбце QAbstractTableModel. Если я изменю переменную с именем columns_number с 0 на 1 или 2, то Qcompleter покажет соответствующие записи из заданного номера столбца. Теперь я хочу, чтобы текст qlineEdit выполнялся во всех столбцах QAbstractTablemodel вместо этого выполните поиск по любому конкретному столбцу. Пожалуйста, помогите мне разобраться в проблеме.