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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: 2 таблицы на 1 модель или как?  (Прочитано 7502 раз)
djfile
Гость
« : Декабрь 28, 2011, 19:58 »

Добрый вам, сообщество! Надеюсь, что подходящая ветка.
Интерфейс пользователя должен состоять из двух таблиц: в одной собственно данные, подлежащие обработке, а в другой критерии обработки. i-й столбец первой таблицы, обрабатывается по критериям, заданным в i-м столбце второй таблицы. На выходе получаем таблицу, после отбора.

Вот такие вопросы:

1) Как связать данные с первой таблицы, с критериями из второй? Есть идея для обоих таблиц установить одну модель, но каждая таблица будет менять только свою часть модели. Но не могу в голове уложить КАК это сделать?

2) Во второй таблице в первой строке должен быть чекбокс (участвует ли этот столбец в отборе), во второй выпадающий список (тип данных: число или текст, чтобы знать по каким правилам обрабатывать этот столбец) и третья строка в зависимости от того, число или текст выбран предыдущий параметр, должно принимать либо неравенство вида k1 < x < k2, либо для текста x = {какое-то множество слов}. В примерах находил только как целому столбцу подменяют виджет на спинбокс, а мне надо чуть ли не каждой ячейке свой виджет устанавливать + динамически менять ячейку условия.

Если у кого-то есть идеи сделать интерфейс проще и удобнее, то с радостью соглашусь.

P.S. В Qt недавно.
Записан
andrew.k
Гость
« Ответ #1 : Декабрь 28, 2011, 21:47 »

лучше один раз увидеть, чем сто раз услышать.
Нарисовал бы эскиз того, что хочешь получить.
Записан
djfile
Гость
« Ответ #2 : Декабрь 28, 2011, 22:40 »



Вот примерно так.
Только в реале будут вводиться различный физические данные, по критериям в нижней таблице составляется нормирующая функция и по нормирующей функции ищем оптимальную строку.

Я тут накопал про Filter Model, но всё ещё точно определился куда двигаться.
Записан
andrew.k
Гость
« Ответ #3 : Декабрь 28, 2011, 23:31 »

примерно как?
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #4 : Декабрь 29, 2011, 06:45 »

Вот так у него написано: http://imagepost.ru/images/p/rm/prmwqbwjaafrnnxvrbybbsxjmyarqs.png
Записан
andrew.k
Гость
« Ответ #5 : Декабрь 29, 2011, 08:19 »

Вот так у него написано: http://imagepost.ru/images/p/rm/prmwqbwjaafrnnxvrbybbsxjmyarqs.png
У меня не открывается.
403 Forbidden
Записан
djfile
Гость
« Ответ #6 : Декабрь 29, 2011, 09:48 »

У меня все ок. Вот на радикале:
Записан
Tonal
Гость
« Ответ #7 : Декабрь 29, 2011, 10:39 »

Тут всяко 2 составляющие, стало быть и 2 модели.
1я - модель для данных.
2я - модель для условий.
Из первой можно состав и типы полей разве что зацепить а из въюхи их размеры. Улыбающийся

А уж потом, как фильтр на первую накладывать - вовсе отдельное действие.
Можно SQL изменить, можно в QSortFilterProxyModel отработать filterAcceptsRow или свойствами поиграться...
Записан
djfile
Гость
« Ответ #8 : Декабрь 29, 2011, 11:15 »

Почитав доки, пришёл к выводу, что для первой таблицы создаю свою модель (от чего лучше наследовать?) и для второй. В принципе модели должны получиться элементарные. Дальше создаю наследника QSortFilterProxyModel, в который как-то передаю первую и вторую модель. Дальше совсем ступор... Мне нужно сначала пройти по всем столбцам, которые участвуют в отборе и применить к ним нормирующую функцию. После этого я получу матрицу с элементами [0..1]. Дальше прохожу уже по строкам, ища ту, у которой нормирующие коэффициенты лучше, чем  у других. Найдя такую(или такие, если они равнозначны), я должен их либо подсветить в исходной таблице, либо вывести их в отдельной.
Записан
djfile
Гость
« Ответ #9 : Декабрь 29, 2011, 16:23 »

Тут всяко 2 составляющие, стало быть и 2 модели.
1я - модель для данных.
2я - модель для условий.
Из первой можно состав и типы полей разве что зацепить а из въюхи их размеры. Улыбающийся

А уж потом, как фильтр на первую накладывать - вовсе отдельное действие.
Можно SQL изменить, можно в QSortFilterProxyModel отработать filterAcceptsRow или свойствами поиграться...

Забыл на рисунке нарисовать... В таблице условий ещё + идеальное значение и погрешность.

Боюсь, что filterAcceptsRow мне никак не подойдет. Её хорошо использовать когда нужно просто выкинуть из начальной модели те элементы, которые однозначно не подходят по условиям. Мне это можно использовать, но только а самом начале всей математики.
« Последнее редактирование: Декабрь 29, 2011, 16:47 от djfile » Записан
Tonal
Гость
« Ответ #10 : Декабрь 30, 2011, 08:17 »

Т. е. е тебя получается 3 модели:
1. Модель с данными - ДМ (DataModel)
2. Модель для фильтрации сортировки данных СФПМ (наследник QSortFilterProxyModel)
3. Модель для задания условий фильтрации/отображения/сортировки СФМ (BuildFilterModel)
СФПМ всегда работает поверх ДМ.
Когда критерии не заданы - отображаются все строки.
Когда критерии заданы они передаются в СФПМ и отображаются только те строки, которые попадают под них (filterAcceptsRow).
Ежели тебе нужно ещё и дополнительно расцветить, то в СФПМ можно перехватить ещё и data(...) - возвращать цвет/шрифт.
Или вовсе декоратора какого забильбенить ежели сложное чаво. Улыбающийся
Записан
djfile
Гость
« Ответ #11 : Декабрь 30, 2011, 19:33 »

QSortFilterProxyModel не подойдет, так как он при фильтрации рассматривает отдельную строку или отдельный столбец, вне зависимости от остальных строк, а в зависимости от условий отбора. У меня же каждая строка зависит от других строк.

На прог орге такую же тему поднял, но там вообще ещё даже близко дельного ничего не сказали. Спасибо Вам, что хоть тут предлагают какие-то вещи.

Скопипастю один из моих ответов с прог орга, может станет чуть понятнее:

К SQL это дело вообще никакого отношения не имеет. То что я привел это только для примера. Пользователь сам будет забивать необходимые ему данные. Смысл программы в том, что она поможет выбрать правильное решение, точнее оптимальное. Например, у вас есть много способов провести физический эксперимент, но один дороже, другой точнее, третий быстрее по времени и тд. Все эти свойства мы отображаем в столбцах первой таблицы. При этом мы знаем, что у нас бюджет ограничен, время тоже и тп, то есть мы знаем пределы и их пишем во вторую таблицу. И вот мы хотим найти тот вариант, который для нас будет оптимальным. Но так как мы не можем сравнивать время и деньги, мы сначала нормируем все данные, а потом уже с ними работаем и по ним находим оптимальную строку.

Вся основная математика у меня есть. Нужно только реализовать удобную работу с таблицами, сделать защиту от "дурака", связать данные из первой таблицы с ограничениями из второй и получить результат.
Записан
andrew.k
Гость
« Ответ #12 : Декабрь 30, 2011, 20:11 »

На прог орге такую же тему поднял, но там вообще ещё даже близко дельного ничего не сказали. Спасибо Вам, что хоть тут предлагают какие-то вещи.
А по твоему мнению "на прог орге" это где?  Смеющийся
Записан
djfile
Гость
« Ответ #13 : Декабрь 31, 2011, 09:27 »

Извините. Конец года уже с ума сводит=) И бегаю, между этими двумя закладками, как бешеный уже. На кроссплатформе конечно.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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