Название: Табличка Отправлено: Igors от Декабря 10, 2013, 19:16 Добрый день
Табличка отображает глобальные переменные пытон-скриптов. В данном случае "глобальные" означает: переменные которые приложение будет хранить от запуска к запуску. На момент редактирования они существуют в пытоне. Три колонки: имя, тип, значение. Возможные типы: int, float, string, vector, object, tuple. Ф-ционал: редактировать ячейки, добавление и удаление строк. Окно таблицы модально, изменения по кнопке Ok, если Cancel то ничего не происходит. С UI проблем не возникает, но вот какую модель данных выбрать? Спасибо Название: Re: Табличка Отправлено: Bepec от Декабря 10, 2013, 19:19 Если их немного, < 1000 то я бы просто навертел QTreeWidget без модели. Ибо максимально быстро, просто и выглядит симпатично.
Название: Re: Табличка Отправлено: Igors от Декабря 12, 2013, 07:29 Да, немного, < 1000. Не вижу зачем мне здесь tree, устроит и QTableWidget. Проблема в том "что должно являться данными". Напр строка добавлена, удалена или отредактирована - ответить немедленным созданием, удалением или изменением пытон-переменной я не могу, хотя бы потому что Ok еще не было. Выходит нужно создать какой-то промежуточный формат, вот я и хотел обсудить как это лучше сделать.
Название: Re: Табличка Отправлено: Bepec от Декабря 12, 2013, 08:36 Обосную почему TreeWidget.
Потому что там нормально сделана модель данных. В TableWidget каждый столбец сущность. В TreeWidget сущностью является строка (как и должно быть в случае модели данных). Промежуточный формат может быть любым. Ведь вы собственно будете писать сохранение/загрузку данных. А по поводу "промежуточного" - не понимаю о чём вы. Рассмотрим логику программы: 1) считываем данные из файла (допустим). 2) создаём модель с данными. 3) изменяем данные. (в модели) 4) по нажатию "OK" перезаписываем данные в файле. В качестве промежуточной модели у нас и будет эта модель, точнее её структуры в памяти. Название: Re: Табличка Отправлено: Igors от Декабря 12, 2013, 08:52 В TableWidget каждый столбец сущность. Спасибо, посмотрю QTreeWidget (никогда ее не пользовал)В TreeWidget сущностью является строка (как и должно быть в случае модели данных). В качестве промежуточной модели у нас и будет эта модель, точнее её структуры в памяти. Так вот какие это должны быть структуры? (Т.е. эта тема и предложена для обсуждения)Название: Re: Табличка Отправлено: kambala от Декабря 12, 2013, 11:10 Проблема в том "что должно являться данными". Напр строка добавлена, удалена или отредактирована - ответить немедленным созданием, удалением или изменением пытон-переменной я не могу, хотя бы потому что Ok еще не было. Выходит нужно создать какой-то промежуточный формат, вот я и хотел обсудить как это лучше сделать. создать копию переменной будет дорого?Название: Re: Табличка Отправлено: Igors от Декабря 12, 2013, 11:35 создать копию переменной будет дорого? Как минимум неудобно. Пусть на данный момент в пытоне есть переменная, напр var1. Копирование сводится к запуску скриптаpy> var2 = var1 При этом надо быть уверенным что var2 не является какой-то другой переменной и избавиться от нее если она оказалась не у дел py> del var2 Естественно отложить все вызовы пытона до нажатия Ok Название: Re: Табличка Отправлено: Igors от Декабря 12, 2013, 17:18 Обосную почему TreeWidget. Наверное Вы имели ввиду "в QTableWidget каждая ячейка сущность", да, это раздражает. Ладно, по ходу дела переставил на QTreeWidget. В общем все норм, но имею к Вам 2 чисто шкурных вопроса:Потому что там нормально сделана модель данных. В TableWidget каждый столбец сущность. В TreeWidget сущностью является строка (как и должно быть в случае модели данных). - как из QTreeWidgetItem вытащить оригинальный/первоначальный индекс строки? topLevel ф-ции возвращают в зависимости от сортировки, поэтому сделал через UserRole, может как-то поприятнее? - Слева оставляется место - видимо для значка collaps/expand, как сказать что не нужно? Спасибо Название: Re: Табличка Отправлено: kambala от Декабря 12, 2013, 18:59 - как из QTreeWidgetItem вытащить оригинальный/первоначальный индекс строки? topLevel ф-ции возвращают в зависимости от сортировки, поэтому сделал через UserRole, может как-то поприятнее? если делать сортировку через QSortFilterProxyModel, то исходные позиции можно получить из sourceModel. иначе «поприятнее» никак (вряд ли наследование — это приятно :) ).- Слева оставляется место - видимо для значка collaps/expand, как сказать что не нужно? по-моему скрытие rootItem поможетНазвание: Re: Табличка Отправлено: Igors от Декабря 12, 2013, 19:34 - Слева оставляется место - видимо для значка collaps/expand, как сказать что не нужно? по-моему скрытие rootItem поможетВпрочем UI не проблема, вот как построить данные? Мыслей хороших нет, но, как говорил мой шеф - Игорь, если не знаешь что - делай хоть что-то, не сиди. Поменяй ряд этих ТЭЗ'ов, потом тех, глядишь и попадешь :) По этому принципу склепал такое Код Понимаю что трудновато понять как оно должно работать - но мне тоже :) Критикуем, улучшаем... Название: Re: Табличка Отправлено: Old от Декабря 12, 2013, 20:09 Можно сохранять не слепок всех переменных, а сами действия, которые выполняет пользователь.
Получили список всех переменных из скриптового окружения, вывели их в QTreeWidget. Дальше пользователь удаляет переменную A - сохранили в списке "удалить А" и удалили строку из виджета; пользователь добавил переменную - добавили строку в виджет и положили в список "добавить XYZ". После редактирования, если пользователь нажал Ок, то выполнили указанные операции для скриптового окружения. Это напоминает работу UNDO-системы. Название: Re: Табличка Отправлено: Bepec от Декабря 12, 2013, 20:32 Я к сожалению всё ещё не понимаю вашего желания видеть какой-то контейнер. Контейнером будет являться ваша модель.
У вас в начале есть структуры "название-значение". Код: valueMy="123" В конце у вас должны быть структуры "название-значение". Код: MyValue="321" В принципе же вам не столь необходима система Undo. PS если я чего - то не вижу, какой то специфике, просветите меня. Т.е. моя мысль просто делать список всех переменных со значениями, а после просто удалять старые и создавать новые. Название: Re: Табличка Отправлено: kambala от Декабря 12, 2013, 20:50 - Слева оставляется место - видимо для значка collaps/expand, как сказать что не нужно? по-моему скрытие rootItem поможетНазвание: Re: Табличка Отправлено: Igors от Декабря 14, 2013, 09:59 Я к сожалению всё ещё не понимаю вашего желания видеть какой-то контейнер. Контейнером будет являться ваша модель. Да, это желание и было ошибочным. Я думал надо где-то хранить доп данные. Напр имя переменной должно быть уникальным, также нужно ее первоначальное значение. Ну слил все это в контейнер чтобы связываться с ним по индексу строки. Однако разобравшись понял - гораздо удобнее хранить это в setData(col, UserRole), без всяких доп контейнеров. А еще лучше поставить делегата - и необходимость почти во всех хранениях отпадает. Напр имя переменной - в делегате есть удобная точка где известны новое и старое имя. treeWidget->setRootIsDecorated(false); Понял, спасибоМожно сохранять не слепок всех переменных, а сами действия, которые выполняет пользователь. Получили список всех переменных из скриптового окружения, вывели их в QTreeWidget. Дальше пользователь удаляет переменную A - сохранили в списке "удалить А" и удалили строку из виджета; Вроде выглядит проще по Ok замочить все переменные, а потом создать все заново из таблицы. Но в любом случае нужно переводить значение переменной в QVariant - это должно быть в PythonQt, буду разбиратьсяТакой вопрос: переменная-вектор (то же самое что и QVector3D), как поудобнее ее редактировать? Сейчас 3 числа разделенные запятой, напр (1.0, 55.4, 66) не блеск Спасибо Название: Re: Табличка Отправлено: Bepec от Декабря 14, 2013, 13:11 Я бы сделал на каждый тип свой редактор. Ну, объединив простые, конечно же. Их у вас немного, так что спокойно можно за часик набросать достойные редакторы.
PS я за три спинбокса с переключением между ними стрелочками или ентером. |