Найти - Пользователи
Полная версия: PySide QTableWidget поиск по таблице
Начало » GUI » PySide QTableWidget поиск по таблице
1
astrobeglec
Добрый день!

Подскажите пожалуйста такой вопрос: Есть реализованная через QTableWidget таблица заполненная данными. Нужно сделать, чтобы был осуществляен поиск текста введенной в QLineEdit и осуществлен переход к строке содержащей этот текст.

Вывел 2 пути решения:
1. Через встроенный в PySide поиск (метод findItems таблицы) цель находит, но переход отсутствует. Получаю список объектов PySide.QtGui.QTableWidgetItem.
2. Через перевод таблицы в массив строк и поиск (find) в массиве. Получаю массив номеров строк.

Два дня мучаю поисковики и документацию.
vic57
setCurrentItem в PySide есть?
можно проще
#!-*-coding:utf8-*-
from PyQt4.Qt import *
def on_find():
    s = edit.text()
    rows = t.rowCount()
    cols = t.columnCount()
    for i in xrange(rows):
        for j in xrange(cols):
            txt = t.item(i,j).text()
            if txt.contains(s):
                t.item(i,j).setTextColor(QColor(0,0,0))
            else:
                t.item(i,j).setTextColor(QColor(222,222,222))
                
app = QApplication([])
w = QWidget()
t = QTableWidget(w)
t.setRowCount(3)
t.setColumnCount(4)
for i in xrange(3):
    for j in xrange(4):
        s= 'blabla' + str(i) + str(j)
        item = QTableWidgetItem()
        item.setText(s)
        t.setItem(i,j,item)
t.setSortingEnabled(True)
edit = QLineEdit(w)
edit.returnPressed.connect(on_find)
btnFind = QPushButton(u'Поиск',w)
btnFind.clicked.connect(on_find)
grid = QGridLayout(w)
grid.setMargin(0)
grid.addWidget(t,0,0,1,2)
grid.addWidget(edit,1,0)
grid.addWidget(btnFind,1,1)
w.resize(500,300)
w.move(0,0)
w.show()
app.exec_()
astrobeglec
Спасибо, строки находит. Но не переходит к первой найденной…
vic57
а мозги включить?
#-*-coding:utf8-*-
from PyQt4.Qt import *
def on_find():
    s = edit.text()
    rows = t.rowCount()
    cols = t.columnCount()
    first = None
    for i in xrange(rows):
        for j in xrange(cols):
            txt = t.item(i,j).text()
            if txt.contains(s):
                t.item(i,j).setTextColor(QColor(0,0,0))
                if not first: first = t.item(i,j)
            else:
                t.item(i,j).setTextColor(QColor(222,222,222))
    t.setCurrentItem(first) # я о чем спрашивал?
                
app = QApplication([])
w = QWidget()
t = QTableWidget(w)
t.setRowCount(3)
t.setColumnCount(4)
for i in xrange(3):
    for j in xrange(4):
        s= 'blabla' + str(i) + str(j)
        item = QTableWidgetItem()
        item.setText(s)
        t.setItem(i,j,item)
t.setSortingEnabled(True)
edit = QLineEdit(w)
edit.returnPressed.connect(on_find)
lbl = QLabel(u'Filter:')
grid = QGridLayout(w)
grid.setMargin(0)
grid.addWidget(t,0,0,1,2)
grid.addWidget(lbl,1,0)
grid.addWidget(edit,1,1)
w.resize(500,300)
w.move(0,0)
w.show()
app.exec_()
astrobeglec
Да в PySide есть setCurrentItem и нужна была именно эта строчка: t.setCurrentItem(first)

Спасибо
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB