В общем, остановился на варианте с QSortFilterModel. Переопределил метод filterAcceptsRow, там фильтрую всё так, чтобы остался 1 элемент.
Затем создал новый компонент, внутри которого есть ListView с interactive = false и в него помещаю делегат и отфильтрованную модель. По тестам работает стабильно и шустро на 1000+ записей.
PS: Поправил ошибки в своём вопросе, писал с телефона в пробке, уж прошу простить тех, кому пришлось это увидеть это до правки =)