Форум программистов, компьютерный форум, киберфорум
Python: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
0 / 0 / 0
Регистрация: 03.04.2015
Сообщений: 4

Фильтрация QTreeView с QSortFilterProxyModel

06.04.2015, 14:59. Показов 4130. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть дерево, отображающее некоторые значения параметров, нужно сделать вывод только различающихся значений с QSortFilterProxyModel. Опыта с pyqt5 у меня мало, поэтому обращаюсь к Вам. Подскажите пожалуйста, как это реализовать. Заранее спасибо!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.04.2015, 14:59
Ответы с готовыми решениями:

Фильтрация через QSortFilterProxyModel
Доброго времени суток! Переопределил модель proxy, что бы организовать нужную мне фильтрацию. В методе filterAcceptsRow пишу поведение...

В QSortFilterProxyModel не срабатывает фильтрация
Вводная: Есть две модели: исходная — дерево на QAbstractItemModel, прокси — таблица на QSortFilterProxyModel. Хочу при клике в исходной на...

Qsortfilterproxymodel фильтрация по цвету
Кто-нибудь сталкивался с задачей фильтрации данных по цвету текста ячейки или её фона? Пока не пойму, как получить цвет чего-либо в...

6
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
07.04.2015, 12:09
Хелп по QSortFilterProxyModel смотрели?
Если вам нужны уникальные значения - QSortFilterProxyModel не нужен, он не для этого.
1
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
07.04.2015, 12:29
http://gaganpreet.in/blog/2013... er-models/
1
0 / 0 / 0
Регистрация: 03.04.2015
Сообщений: 4
09.04.2015, 21:49  [ТС]
Прошу прощения за плохую формулировку вопроса. Попробую заново.
Есть дерево вида:

Нода1
--Нода2
----Нода3 Значение1 Значение2
----Нода4 Значение3 Значение4
И так далее...

(Внешний вид дерева в прикрепленном файле)

Мне надо отфильтровать модель по различающимся значениям в одной строке.
То есть, если Значение1 совпадает(равно) с Значением2, то эту строку пропускаем, если нет - выводим.

Есть пример кода:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class FindFilterProxyModel(QtCore.QSortFilterProxyModel):
    def filterAcceptsRow(self, source_row, source_parent):
        if (self.filterAcceptsRowItself(source_row, source_parent)):
            return True
 
        if (self.hasAcceptedChildren(source_row, source_parent)):
            return True
 
        return False
 
    def filterAcceptsRowItself(self, source_row, source_parent):
        return super(FindFilterProxyModel, self).\
        filterAcceptsRow(source_row, source_parent)
 
    def hasAcceptedChildren(self, source_row, source_parent):
        model = self.sourceModel()
        sourceIndex = model.index(source_row, 0, source_parent)
        if not (sourceIndex.isValid()):
            return False
 
        childCount = model.rowCount(sourceIndex)
        if (childCount == 0):
            return False
 
        for i in range (childCount): 
            if (self.filterAcceptsRowItself(i, sourceIndex)):
                return True
            if (self.hasAcceptedChildren(i, sourceIndex)):
                return True
 
        return False
Он рекурсивно сравнивает значения в первом столбце (использую для поиска).
А мне требуется, чтобы сравнение что по всем столбцам, кроме первого.
Миниатюры
Фильтрация QTreeView с QSortFilterProxyModel  
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
10.04.2015, 07:10
Для начала - фильтрация по какому-то элементарному признаку у вас работает?
Не вижу ссылки на первый столбец.
0
0 / 0 / 0
Регистрация: 03.04.2015
Сообщений: 4
10.04.2015, 15:02  [ТС]
Ссылка на первый столбец тут:

Python
1
2
3
4
5
6
7
8
9
10
11
def findTextPushButton_clicked(self):
        text = self.lineEdit.text()
        self.sourceModel = self.model
        self.proxyModel = FindFilterProxyModel(self)
        self.proxyModel.setSourceModel(self.sourceModel)
        # Если раскоментить строку ниже, то поиск будет работать
        # не только по дереву параметров, но и по содержимому ячеек
        # self.proxyModel.setFilterKeyColumn(-1)
        self.proxyModel.setFilterCaseSensitivity(0)
        self.proxyModel.setFilterWildcard(text)
        self.treeView.setModel(self.proxyModel)
0
0 / 0 / 0
Регистрация: 03.04.2015
Сообщений: 4
15.04.2015, 13:11  [ТС]
Может быть это поможет кому-то ещё. Данный код сравнивает значения в двух столбцах.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class DiffFilterProxyModel(QtCore.QSortFilterProxyModel):
def filterAcceptsRow(self, source_row, source_parent):
    # проверим, что моделька валидная
    # model = self.sourceModel()
    # if model is None:
    #     return False
 
    # index для первого столбца проверяемой строки
    src_index = model.index(source_row, 0, source_parent)
 
    # рекурсивно пробежимся по дереву
    for i in range (model.rowCount(src_index)):
        child_index = src_index.child(i, 0)
        c1 = child_index.sibling(child_index.row(), 1).data()
        c2 = child_index.sibling(child_index.row(), 2).data()
 
        # если есть хоть один потомок, удовлетворяющий условиям фильтра - ок!
        if (c1 != c2 or self.filterAcceptsRow(i, src_index)):
            return super(DiffFilterProxyModel, self).filterAcceptsRow(source_row, source_parent)                                                   
    # если потомки не отфильтрованы, проверим себя
    c1 = src_index.sibling(src_index.row(), 1).data()
    c2 = src_index.sibling(src_index.row(), 2).data()
 
    return c1 != c2 and super(DiffFilterProxyModel, self).filterAcceptsRow(source_row, source_parent)
Спасибо grondek за помощь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.04.2015, 13:11
Помогаю со студенческими работами здесь

QSortFilterProxyModel фильтрация по нескольким значениям столбца
Есть модель. В одном из столбцов могут быть данные - 1, 2 или 3. Есть форма. На ней tableView, menuBar c добавленными Action типа...

Вставка значений из одного QtreeView в другое QTreeView
Здравствуйте, форумчане. Реализовал TreeModel по документации https://doc.qt.io/qt-5/qtwidgets-itemviews-editabletreemodel-example.html...

QComboBox QSortFilterProxyModel
Привет. Такая проблема: при вводе текста в комбобоксе для сортировки выпадающего списка, если паттерн совпал с каким-то значением из...

QSortFilterProxyModel и QTreeModel
Добрый день. Интересует использование метода filterAcceptsRow для фильтрации древовидной модели. есть такое: bool...

Ошибка с QSortFilterProxyModel
Доброго времени суток. Есть исходная модель: #ifndef LWITEMMODEL_H #define LWITEMMODEL_H #include <QVariant> #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru