Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Igors от Декабря 10, 2013, 19:16



Название: Табличка
Отправлено: 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 каждый столбец сущность.
В TreeWidget сущностью является строка (как и должно быть в случае модели данных).
Спасибо, посмотрю QTreeWidget (никогда ее не пользовал)

В качестве промежуточной модели у нас и будет эта модель, точнее её структуры в памяти.
Так вот какие это должны быть структуры? (Т.е. эта тема и предложена для обсуждения)


Название: 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.

Потому что там нормально сделана модель данных.

В TableWidget каждый столбец сущность.

В TreeWidget сущностью является строка (как и должно быть в случае модели данных).
Наверное Вы имели ввиду "в QTableWidget каждая ячейка сущность", да, это раздражает. Ладно, по ходу дела переставил на QTreeWidget. В общем все норм, но имею к Вам 2 чисто шкурных вопроса:

- как из 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 работаю редко, так что не стесняйтесь отсылать к букварю :))

Впрочем UI не проблема, вот как построить данные? Мыслей хороших нет, но, как говорил мой шеф - Игорь, если не знаешь что - делай хоть что-то, не сиди. Поменяй ряд этих ТЭЗ'ов, потом тех, глядишь и попадешь :) По этому принципу склепал такое

Код
C++ (Qt)
// строка таблицы
struct СRowData {
QString mOldName;   // имя пытон-переменной если она есть на момент редактирования, иначе пусто
QVariant nOldValue;   // значение пытон-переменной, None в пытоне = QVariant::Invalid
QString mNewName;   // новое имя присвоенное при редактировании, изначально == mOldName
QVariant mNewValue;   // новое значение
QTreeWidgetItem * mItem;  // иначе не развязаться с удалением
};
 
// данные диалога
QList <CRowData> mRowData;
QSet <QString> mNameSet;
 
Понимаю что трудновато понять как оно должно работать - но мне тоже  :) Критикуем, улучшаем...


Название: 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 поможет
А каким образом?  (с UI работаю редко, так что не стесняйтесь отсылать к букварю :))
treeWidget->setRootIsDecorated(false);


Название: 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 я за три спинбокса с переключением между ними стрелочками или ентером.