Я не вижу ничего явно неправильного в том, что вы делаете.Имейте в виду, что filterAcceptsRow
вызывается для каждого элемента в вашей модели, и это, конечно, будет вялым, поскольку накладные расходы на вызов функции Python из C ++ составляют несколько миллисекунд.Это складывается довольно быстро, если у вас есть модель с несколькими сотнями предметов.Добавьте к этому количество функций C ++, вызываемых из Python, и вы можете легко получить 3 секунды, которые вы заметили.
Кроме того, QTableView
и QSortFilterProxyModel
делают очень много умных вещей длясводите сигналы, которые они излучают, и количество обновлений к минимуму.К сожалению, это приводит к очень плохой производительности, если строки, которые удаляются или добавляются после сброса фильтра, сильно разбросаны по вашей модели.
В наших проектах мы приняли решение реализовать большинство из этих элементов.основанные на C ++ модели, по крайней мере для тех методов, которые вызываются для каждого элемента в модели, который содержит более чем тривиальное количество строк или столбцов.Однако это может быть не тот ответ, который вы ищете, особенно если задержки обновления вызваны, например, другими обработчиками сигналов, подключенными к той же модели.Передача сигнала обычно аналогична вызову метода.
Короче говоря, вам лучше использовать профилировщик, чтобы увидеть, где ваше приложение проводит большую часть своего времени, и использовать C ++, если в этих методахВызываются один раз (или даже более одного раза) для каждого элемента в вашей модели.