Russian Qt Forum
Апрель 18, 2024, 12:33
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Model-View (MV)
>
Выделить стоку в таблице
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Выделить стоку в таблице (Прочитано 8645 раз)
deMax
Хакер
Offline
Сообщений: 600
Выделить стоку в таблице
«
:
Май 04, 2018, 11:05 »
Помимо стандартного выделения нужно добавить легкую подсветку выбранных строк в таблицу.
QTableView QSortFilterProxyModel QTableModel, ставлю модели Qt::backgroundrole цвет и при изменении выделения вызвываю в модели
Код:
void setSelected_row(int value) { // QAbstractTableModel child
auto updateRow = [this](int row){
if( row != -1 ) dataChanged( QAbstractTableModel::index( row, 0 ), QAbstractTableModel::index( row, columnCount() - 1 ) );
};
updateRow( m_selected_row );
m_selected_row= value;
updateRow( m_selected_row);
}
проблема начинается когда работает фильтрация, если исчезают все строки программа падает. если убрать dataChanged(), то все нормально. (она нужна чтобы стереть старую строку и нарисовать новую, tableview update ячеек не работает)
Я сообщаю модели что данные изменились, ну и что что их нет на отображение (отфильтровал QProxySortFilter). Я меняю в модели данные.
«
Последнее редактирование: Май 04, 2018, 11:12 от deMax
»
Записан
deMax
Хакер
Offline
Сообщений: 600
Re: Выделить стоку в таблице
«
Ответ #1 :
Май 04, 2018, 11:19 »
если удалить первый udpateRow перестает падать, и работает правильно(старые ячейки затирает).
Записан
ssoft
Программист
Offline
Сообщений: 579
Re: Выделить стоку в таблице
«
Ответ #2 :
Май 04, 2018, 11:21 »
m_selected_row правильно инициирован в конструкторе?
Записан
deMax
Хакер
Offline
Сообщений: 600
Re: Выделить стоку в таблице
«
Ответ #3 :
Май 04, 2018, 12:01 »
В тестовом примере не было, но программа вылетает когда я выбираю ячейки, а потом ставлю фильтр.
p.s. Программа все равно вылетает, даже с закоменченной строкой. Просто вылет сложнее сделать.
ВЫбираю несколько ячеек потом фильтрую чтобы осталась видимой только одна.
Падает только когда что то выбрано. ( Вот думаю, может заменить QSortFilterProxy model парой функций... )
«
Последнее редактирование: Май 04, 2018, 12:22 от deMax
»
Записан
deMax
Хакер
Offline
Сообщений: 600
Re: Выделить стоку в таблице
«
Ответ #4 :
Май 04, 2018, 15:50 »
Если выбрать несколько строк, падает только если останутся строки в середине выделения.
например если выбрать .. ZZ13, ZZ14, ZZ15 ... и ввести ZZ14 - упадет
Записан
deMax
Хакер
Offline
Сообщений: 600
Re: Выделить стоку в таблице
«
Ответ #5 :
Май 04, 2018, 17:34 »
короче datachanged в модели заставляет QSortfilterProxyModel пересортировать зачем то всю таблицу, перемешав строки с одинаковыми значениями....
tableview update для ячеек строки вроде работает.
«
Последнее редактирование: Май 04, 2018, 17:52 от deMax
»
Записан
Авварон
Джедай : наставник для всех
Offline
Сообщений: 3258
Re: Выделить стоку в таблице
«
Ответ #6 :
Май 04, 2018, 17:49 »
За выделение должна отвечать вьюха, а не модель.
Записан
deMax
Хакер
Offline
Сообщений: 600
Re: Выделить стоку в таблице
«
Ответ #7 :
Май 06, 2018, 23:41 »
вьюха и отвечает за выделение(выделение по ячейкам). Но у меня есть дополнительное выделение строки для которой отображается настройка(не я придумал). Может можно реализовать одновременно две модели выделения(выделение одной строки и выделение ячеек)?
В настоящее время я в модели запоминаю выбранные строки(они не совсем совпадают с выбранными ячейками) и выделяю их серым фоном(внутри модели data() -> role == Qt::BackgroundRole.
Проблема в том что в модели QSortFilterProxyModel тупит когда вызывается datachange в базовой модели(вылеты, которые я вроде победил и перемешивание ячеек в столбце с одинаковым значением). А tableview через update ячеек ведет себя корректно, но по хорошему обновлять то нужно модель).
p.s. Еще вариант выкинуть QSortFilterProxyModel, через std::sort быстрее сортировка будет специализированных данных, да фильтрация тоже легко делается cell.text.contains(lineEditFilter->text()).
Записан
Авварон
Джедай : наставник для всех
Offline
Сообщений: 3258
Re: Выделить стоку в таблице
«
Ответ #8 :
Май 07, 2018, 10:49 »
А, я понял идею. Типа галочками потыкать нужные поля.
QSortFilterProxyModel - плохой класс, очень много оверхеда (и сложный в использовании), да, лучше написать сортировку (не забудьте о layoutAboutToBeChanged/setPersistentIndexes вместо beginReset/endReset) и фильтрацию руками
Записан
deMax
Хакер
Offline
Сообщений: 600
Re: Выделить стоку в таблице
«
Ответ #9 :
Май 07, 2018, 12:15 »
В идеале сделать альтернативное выделение другой кнопкой мыши, но так как интерфейс предполагает работу только с левой кнопкой, то пока из всех выбранных ячеек выбирается последняя строка,
чтобы показать данные из какой именно строки конфигурируется.
Дома почищу тестовый проект и сюда скину, qsortfilterproxy и крэшиться и сортирует без нужды.
Записан
Авварон
Джедай : наставник для всех
Offline
Сообщений: 3258
Re: Выделить стоку в таблице
«
Ответ #10 :
Май 07, 2018, 15:21 »
А почему нельзя чекбоксы заюзать?
Записан
deMax
Хакер
Offline
Сообщений: 600
Re: Выделить стоку в таблице
«
Ответ #11 :
Май 08, 2018, 10:16 »
Неплохая идея, только я так понял в header их добавить можно только через paintevent и еще mouseevent перехватывать.
Интересно, а можно реализовать множественное выделение? Чтобы можно было выбирать разными цветами, разные ячейки? (При пересечении выделений, рисуется двумя цветами)
Записан
deMax
Хакер
Offline
Сообщений: 600
Re: Выделить стоку в таблице
«
Ответ #12 :
Май 08, 2018, 11:53 »
В принципе вставляется, только this->update(); не перерисовывает ячейку QHeaderView::updateSection(0); работает.
https://wiki.qt.io/Technical_FAQ#How_can_I_insert_a_checkbox_into_the_header_of_my_view.3F
Записан
Авварон
Джедай : наставник для всех
Offline
Сообщений: 3258
Re: Выделить стоку в таблице
«
Ответ #13 :
Май 08, 2018, 17:48 »
Всегда можно присунуть свой хедер в виде frozen строки по аналогии с frozen column example.
Записан
Страниц: [
1
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...