Russian Qt Forum

Qt => Model-View (MV) => Тема начата: deMax от Май 04, 2018, 11:05



Название: Выделить стоку в таблице
Отправлено: deMax от Май 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). Я меняю в модели данные.


Название: Re: Выделить стоку в таблице
Отправлено: deMax от Май 04, 2018, 11:19
если удалить первый udpateRow перестает падать, и работает правильно(старые ячейки затирает).


Название: Re: Выделить стоку в таблице
Отправлено: ssoft от Май 04, 2018, 11:21
m_selected_row правильно инициирован в конструкторе?


Название: Re: Выделить стоку в таблице
Отправлено: deMax от Май 04, 2018, 12:01
В тестовом примере не было, но программа вылетает когда я выбираю ячейки, а потом ставлю фильтр.

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

Падает только когда что то выбрано. ( Вот думаю, может заменить QSortFilterProxy model парой функций... )


Название: Re: Выделить стоку в таблице
Отправлено: deMax от Май 04, 2018, 15:50
Если выбрать несколько строк, падает только если останутся строки в середине выделения.
например если выбрать .. ZZ13, ZZ14, ZZ15 ... и ввести ZZ14 - упадет


Название: Re: Выделить стоку в таблице
Отправлено: deMax от Май 04, 2018, 17:34
короче datachanged в модели заставляет QSortfilterProxyModel пересортировать зачем то всю таблицу, перемешав строки с одинаковыми значениями....
tableview update для ячеек строки вроде работает.


Название: Re: Выделить стоку в таблице
Отправлено: Авварон от Май 04, 2018, 17:49
За выделение должна отвечать вьюха, а не модель.


Название: Re: Выделить стоку в таблице
Отправлено: deMax от Май 06, 2018, 23:41
вьюха и отвечает за выделение(выделение по ячейкам). Но у меня есть дополнительное выделение строки для которой отображается настройка(не я придумал). Может можно реализовать одновременно две модели выделения(выделение одной строки и выделение ячеек)?

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

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


Название: Re: Выделить стоку в таблице
Отправлено: Авварон от Май 07, 2018, 10:49
А, я понял идею. Типа галочками потыкать нужные поля.
QSortFilterProxyModel - плохой класс, очень много оверхеда (и сложный в использовании), да, лучше написать сортировку (не забудьте о layoutAboutToBeChanged/setPersistentIndexes вместо beginReset/endReset) и фильтрацию руками


Название: Re: Выделить стоку в таблице
Отправлено: deMax от Май 07, 2018, 12:15
В идеале сделать альтернативное выделение другой кнопкой мыши, но так как интерфейс предполагает работу только с левой кнопкой, то пока из всех выбранных ячеек выбирается последняя строка,
чтобы показать данные из какой именно строки конфигурируется.

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


Название: Re: Выделить стоку в таблице
Отправлено: Авварон от Май 07, 2018, 15:21
А почему нельзя чекбоксы заюзать?


Название: Re: Выделить стоку в таблице
Отправлено: deMax от Май 08, 2018, 10:16
Неплохая идея, только я так понял в header их добавить можно только через paintevent и еще mouseevent перехватывать.

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


Название: Re: Выделить стоку в таблице
Отправлено: deMax от Май 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 (https://wiki.qt.io/Technical_FAQ#How_can_I_insert_a_checkbox_into_the_header_of_my_view.3F)


Название: Re: Выделить стоку в таблице
Отправлено: Авварон от Май 08, 2018, 17:48
Всегда можно присунуть свой хедер в виде frozen строки по аналогии с frozen column example.