Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705

Добавление собственных колонок в QSortFilterProxyModel

10.02.2016, 23:34. Показов 2842. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужно добавить в QSortFilterProxyModel "виртуальные" колонки, которых нет в исходной модели (source).
Как это правильно сделать, что и как переопределить?
После переопределения columnCount() и headerData() дополнительные колонки с заголовками появляются в QTableView, но недоступны, не выделяются.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.02.2016, 23:34
Ответы с готовыми решениями:

Добавление собственных команд в контекстное меню
Ребята подскажите как добавить собственную команду в контекстное меню рабочего стола,только чтобы созданная строка...

БД, добавление колонок
По нажатию кнопки должны добавляться колонка в таблицу public void actionPerformed(ActionEvent e) { if...

Добавление колонок
У меня есть таблица с 3 полями(колонками). Мне надо динамически,т.е. кодом, добавить колонку в базу данных, но при добавлении записи в...

19
 Аватар для Wyn
1073 / 654 / 230
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
10.02.2016, 23:43
Колонки не выделяются? Или ячейки под ними? Для того, чтобы ячейки выделялись надо flags переопределять. Для того, чтобы там ещё появились данные(как я понимаю в виртуальных столбцах имеет смысл содержать только read-only генерируемые данные) - нужно переопределять data().
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
11.02.2016, 00:04  [ТС]
Неактивные они, фокус не получают. flags() и data() не помогают. Там что-то с индексами, наверное, надо делать.
0
 Аватар для Wyn
1073 / 654 / 230
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
11.02.2016, 00:18
Цитата Сообщение от nmcf Посмотреть сообщение
flags()
Как переопределил? ItemIsEnabled и ItemIsSelectable возвращаешь?
0
44 / 44 / 12
Регистрация: 05.04.2015
Сообщений: 345
11.02.2016, 01:18
C++ (Qt)
1
2
3
4
5
6
Qt::ItemFlags flags(const QModelIndex &index) const
{
    if(!index.isValid())
        return Qt::NoItemFlags;
    return Qt::ItemIsEnabled|Qt::ItemIsSelectable|Qt::ItemIsEditable;
}
0
 Аватар для Wyn
1073 / 654 / 230
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
11.02.2016, 01:43
Цитата Сообщение от kolts Посмотреть сообщение
return Qt::ItemIsEnabled|Qt::ItemIsSelectable|Q t::ItemIsEditable;
По хорошему надо флаги невиртуальных столбцов перенаправлять на flags базового класса.
И, если виртуальные столбцы нередактируемые(а скорее всего так и есть, иначе бы они виртуальными не были), - флаг Qt::ItemIsEditable убрать.
0
44 / 44 / 12
Регистрация: 05.04.2015
Сообщений: 345
11.02.2016, 01:58
Как-то так
C++ (Qt)
1
2
3
4
5
6
7
8
Qt::ItemFlags flags(const QModelIndex &index) const
{
if(!index.isValid())
   Qt::NoItemFlags;
if(index.column() >= sourceModel()->columnCount())
    return Qt::ItemIsEnabled|Qt::ItemIsSelectable|Qt::ItemIsEditable;
return QSortFilterProxyModel::flags(index); 
}
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
11.02.2016, 07:52  [ТС]
Цитата Сообщение от Wyn Посмотреть сообщение
Как переопределил? ItemIsEnabled и ItemIsSelectable возвращаешь?
Да.

qDebug показывает, что функции flags() и data() вызываются только для колонок исходной модели, поэтому не важно что они возвращают. Не хватает ещё чего-то.
0
 Аватар для icpu
487 / 365 / 93
Регистрация: 10.03.2011
Сообщений: 1,513
Записей в блоге: 5
11.02.2016, 08:29
Сорс
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// проблема в том, что на новые столбцы не создаётся индексов и они зависают посередине нигде. 
// Что нам нужно сделать? Переопределить функции получения индексов.
QModelIndex CustomSortFilterProxyModel::parent(const QModelIndex &child) const
{
return QModelIndex();
}
 
QModelIndex CustomSortFilterProxyModel::index(int row, int column, const QModelIndex &parent) const
{
if ( row < rowCount() ) {
switch ( column ) {
case extraCol1:
case extraCol2:
return createIndex(row, column);
}
}
return QSortFilterProxyModel::index(row, column, parent);
}
И, конечно же, нельзя забывать о тех функциях, которые возвращают данные. Нужно переопределить следующие:
columnCount()
data()
flags()
headerData()
mapToSource()
mapFromSource()

Майк

Не по теме:

То неловкое чувство, когда тебя не забанили в гугле.:resent:

0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
11.02.2016, 10:21  [ТС]
icpu, я это читал - не надо думать, что сразу написал сюда.
Этот Майк просто перечислил функции, не объяснив, что именно должно быть в них. Так же я не понял его рассуждения про parent, если используется QSqlTableModel.
0
 Аватар для Wyn
1073 / 654 / 230
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
11.02.2016, 10:28
Цитата Сообщение от icpu Посмотреть сообщение
// проблема в том, что на новые столбцы не создаётся индексов и они зависают посередине нигде.
// Что нам нужно сделать? Переопределить функции получения индексов.
QModelIndex CustomSortFilterProxyModel:arent(const QModelIndex &child) const
QModelIndex CustomSortFilterProxyModel::index(int row, int column, const QModelIndex &parent) const
Да, точно, нужно ещё как минимум эти две функции переопределить. Совсем голова в 3 часа ночи не варила уже, что забыл о них.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
11.02.2016, 10:33  [ТС]
Что именно в них должно быть? У меня программа просто зависает, если я пытаюсь изменить поведение index().
0
 Аватар для icpu
487 / 365 / 93
Регистрация: 10.03.2011
Сообщений: 1,513
Записей в блоге: 5
11.02.2016, 10:44
Цитата Сообщение от nmcf Посмотреть сообщение
не надо думать, что сразу написал сюда.
"<...> опыт, сын ошибок трудных <...>" А. С. Пушкин. «О сколько нам открытий чудных...»
Цитата Сообщение от nmcf Посмотреть сообщение
Этот Майк просто перечислил функции, не объяснив, что именно должно быть в них.
Для самых важных даже исходники выкинул. Должно было насторожить, ИМХО.
Цитата Сообщение от nmcf Посмотреть сообщение
Так же я не понял его рассуждения про parent, если используется QSqlTableModel
Не вдавался в подробности, но для табличных представлений такое поведение, как у него, корректно.
Цитата Сообщение от nmcf Посмотреть сообщение
Что именно в них должно быть? У меня программа просто зависает, если я пытаюсь изменить поведение index().
Просто скопируй приведённый код. Номера своих столбцов знаешь, по ним выдавай свои индексы. Учти, что стабильнее всего будет работать добавление столбцов ПОСЛЕ столбцов стандартной модели, иначе сравнение индексов по внутренним указателям навернётся. Столбцы отсортировать проще после их добавления.
0
 Аватар для Wyn
1073 / 654 / 230
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
11.02.2016, 10:45
Цитата Сообщение от nmcf Посмотреть сообщение
Что именно в них должно быть? У меня программа просто зависает, если я пытаюсь изменить поведение index().
Что выше написано.
0
 Аватар для icpu
487 / 365 / 93
Регистрация: 10.03.2011
Сообщений: 1,513
Записей в блоге: 5
11.02.2016, 10:46
Кажется, врубился. Ты перегружаешь модель сортировщика, а не таблицы. Это очень плохое решение, если возможно, перегружай модель данных.
0
 Аватар для Wyn
1073 / 654 / 230
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
11.02.2016, 10:51
Цитата Сообщение от icpu Посмотреть сообщение
Просто скопируй приведённый код. Номера своих столбцов знаешь, по ним выдавай свои индексы. Учти, что стабильнее всего будет работать добавление столбцов ПОСЛЕ столбцов стандартной модели, иначе сравнение индексов по внутренним указателям навернётся. Столбцы отсортировать проще после их добавления.
Да проще всего наверное сделать свою, отдельную прокси-таблицу, унаследованную от QAbstactTableModel и там прописать перенаправления.

Добавлено через 1 минуту
Или же вообще - изменить оригинальную QSQLTableModel, если она больше нигде не используется кроме этого представления с виртуальными столбцами.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
11.02.2016, 13:15  [ТС]
Цитата Сообщение от icpu Посмотреть сообщение
Просто скопируй приведённый код.
Программа зависает, я уже сказал.
Цитата Сообщение от icpu Посмотреть сообщение
Кажется, врубился. Ты перегружаешь модель сортировщика, а не таблицы. Это очень плохое решение, если возможно, перегружай модель данных.
Не возможно. Мне не нужны лишние колонки в исходной модели, она должна быть неизменной. Тем более, что я хочу, чтобы они были редактируемыми.
0
44 / 44 / 12
Регистрация: 05.04.2015
Сообщений: 345
11.02.2016, 13:26
Тогда надо будет переопределить setData() а также завести массив где будут содержаться значения дополнительных колонок.
С исходной моделью такая махинация будет проще, но нет ничего невозможного и с прокси.
0
 Аватар для icpu
487 / 365 / 93
Регистрация: 10.03.2011
Сообщений: 1,513
Записей в блоге: 5
11.02.2016, 13:36
Первое возможное решение: добавить столбцы после (и только после) всех обыкновенных столбцов, сделать их неперемещаемыми. Тогда можно фильтровать свои индексы и индексы стандартной модели. Но это настолько костыльный метод, что вас возненавидят все травмпункты вашего региона.
Второе возможное решение: сделать модель-прослойку, которая будет добавлять всё, что вам нужно. Модель-прослойка - это агрегирование, а не наследование. Уже поверх неё вешать фильтрующую модель.
Третье возможное решение: Сделать всё по-людски. Этот метод начинается с чтения документации. Начиная с описания model-view системы и заканчивая описанием требований к функциям для каждого конкретного отображения. Если вы желаете стать героем, он не для вас. Однозначно, герои не ищут лёгких путей.

Добавлено через 7 минут
Просто потому, что QSortFilterProxyModel создана для сортировки и фильтрации. Это очень неожиданно, учитывая её название, не так ли? А её особенность в том, что в своих индексах она хранит указатели на индексы фильтруемой модели. Вы же в своей модели просто добавляете столбцы (и индексы, куда ж без них) без указателей, и модель теряется от неожидонности. Так дела не делают.
0
 Аватар для Wyn
1073 / 654 / 230
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
11.02.2016, 14:09
Цитата Сообщение от nmcf Посмотреть сообщение
Не возможно. Мне не нужны лишние колонки в исходной модели, она должна быть неизменной. Тем более, что я хочу, чтобы они были редактируемыми.
Тогда нужно делать свою прокси-модель на основе QAbstactTableModel и уже в ней проводить фильтрацию событий, направленных на оригинальную модель, и реализовывать дополнительное хранилище под данные виртуальных столбцов. И уже только после её реализации всовывать её в QSortFilterProxyModel(которая нужна только как модель для сортировки и фильтрации). Это будет гораздо проще, чем реализовывать всё тоже самое в QSortFilterProxyModel.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.02.2016, 14:09
Помогаю со студенческими работами здесь

Добавление колонок
Здравствуйте! Понадобилось добавить колонки в таблицу. Вроде подправил код. Перестала работать прокрутка в форме( данные встают не в те...

Динамическое добавление колонок
Помогите пожалуйста разобраться. Первая таблица добавляет колонку второй таблице, но колона не отображается. Что можно сделать чтобы...

Добавление колонок в таблицу БД
Имеется c++ builder 6 и таблица paradox 7. Нужно удалять и добавлять столбцы у таблицы. В таблице изначально 5 столбиков &quot;F.I.O.&quot;...

Добавление колонок в цикле
добавление колонок в цикле Для х=0 По сч-1 Цикл Колонка = &quot;к&quot;+х; НоваяСтрока.Колонка=СтрокаДочь.Колонка; ...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru