Russian Qt Forum
Ноябрь 25, 2024, 12:16 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Выделить стоку в таблице  (Прочитано 9615 раз)
deMax
Хакер
*****
Offline 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 Offline

Сообщений: 600



Просмотр профиля
« Ответ #1 : Май 04, 2018, 11:19 »

если удалить первый udpateRow перестает падать, и работает правильно(старые ячейки затирает).
Записан
ssoft
Программист
*****
Offline Offline

Сообщений: 584


Просмотр профиля
« Ответ #2 : Май 04, 2018, 11:21 »

m_selected_row правильно инициирован в конструкторе?
Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #3 : Май 04, 2018, 12:01 »

В тестовом примере не было, но программа вылетает когда я выбираю ячейки, а потом ставлю фильтр.

p.s. Программа все равно вылетает, даже с закоменченной строкой. Просто вылет сложнее сделать.
ВЫбираю несколько ячеек потом фильтрую чтобы осталась видимой только одна.

Падает только когда что то выбрано. ( Вот думаю, может заменить QSortFilterProxy model парой функций... )
« Последнее редактирование: Май 04, 2018, 12:22 от deMax » Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #4 : Май 04, 2018, 15:50 »

Если выбрать несколько строк, падает только если останутся строки в середине выделения.
например если выбрать .. ZZ13, ZZ14, ZZ15 ... и ввести ZZ14 - упадет
Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #5 : Май 04, 2018, 17:34 »

короче datachanged в модели заставляет QSortfilterProxyModel пересортировать зачем то всю таблицу, перемешав строки с одинаковыми значениями....
tableview update для ячеек строки вроде работает.
« Последнее редактирование: Май 04, 2018, 17:52 от deMax » Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #6 : Май 04, 2018, 17:49 »

За выделение должна отвечать вьюха, а не модель.
Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #7 : Май 06, 2018, 23:41 »

вьюха и отвечает за выделение(выделение по ячейкам). Но у меня есть дополнительное выделение строки для которой отображается настройка(не я придумал). Может можно реализовать одновременно две модели выделения(выделение одной строки и выделение ячеек)?

В настоящее время я в модели запоминаю выбранные строки(они не совсем совпадают с выбранными ячейками) и выделяю их серым фоном(внутри модели data() -> role == Qt::BackgroundRole.
Проблема в том что в модели QSortFilterProxyModel тупит когда вызывается datachange в базовой модели(вылеты, которые я вроде победил и перемешивание ячеек в столбце с одинаковым значением). А tableview через update ячеек ведет себя корректно, но по хорошему обновлять то нужно модель).

p.s. Еще вариант выкинуть QSortFilterProxyModel, через std::sort быстрее сортировка будет специализированных данных, да фильтрация тоже легко делается cell.text.contains(lineEditFilter->text()).
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #8 : Май 07, 2018, 10:49 »

А, я понял идею. Типа галочками потыкать нужные поля.
QSortFilterProxyModel - плохой класс, очень много оверхеда (и сложный в использовании), да, лучше написать сортировку (не забудьте о layoutAboutToBeChanged/setPersistentIndexes вместо beginReset/endReset) и фильтрацию руками
Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #9 : Май 07, 2018, 12:15 »

В идеале сделать альтернативное выделение другой кнопкой мыши, но так как интерфейс предполагает работу только с левой кнопкой, то пока из всех выбранных ячеек выбирается последняя строка,
чтобы показать данные из какой именно строки конфигурируется.

Дома почищу тестовый проект и сюда скину, qsortfilterproxy и крэшиться и сортирует без нужды.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #10 : Май 07, 2018, 15:21 »

А почему нельзя чекбоксы заюзать?
Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #11 : Май 08, 2018, 10:16 »

Неплохая идея, только я так понял в header их добавить можно только через paintevent и еще mouseevent перехватывать.

Интересно, а можно реализовать множественное выделение? Чтобы можно было выбирать разными цветами, разные ячейки? (При пересечении выделений, рисуется двумя цветами)
Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #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 Offline

Сообщений: 3260


Просмотр профиля
« Ответ #13 : Май 08, 2018, 17:48 »

Всегда можно присунуть свой хедер в виде frozen строки по аналогии с frozen column example.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.054 секунд. Запросов: 23.