Russian Qt Forum
Июнь 15, 2024, 17:08 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Табличка  (Прочитано 7061 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Декабрь 10, 2013, 19:16 »

Добрый день

Табличка отображает глобальные переменные пытон-скриптов. В данном случае "глобальные" означает: переменные которые приложение будет хранить от запуска к запуску. На момент редактирования они существуют в пытоне. Три колонки: имя, тип, значение. Возможные типы: int, float, string, vector, object, tuple. Ф-ционал: редактировать ячейки, добавление и удаление строк. Окно таблицы модально, изменения по кнопке Ok, если Cancel то ничего не происходит.

С UI проблем не возникает, но вот какую модель данных выбрать?

Спасибо
Записан
Bepec
Гость
« Ответ #1 : Декабрь 10, 2013, 19:19 »

Если их немного, < 1000 то я бы просто навертел QTreeWidget без модели. Ибо максимально быстро, просто и выглядит симпатично.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Декабрь 12, 2013, 07:29 »

Да, немного, < 1000. Не вижу зачем мне здесь tree, устроит и QTableWidget. Проблема в том "что должно являться данными". Напр строка добавлена, удалена или отредактирована - ответить немедленным созданием, удалением или изменением пытон-переменной я не могу, хотя бы потому что Ok еще не было. Выходит нужно создать какой-то промежуточный формат, вот я и хотел обсудить как это лучше сделать. 
Записан
Bepec
Гость
« Ответ #3 : Декабрь 12, 2013, 08:36 »

Обосную почему TreeWidget.

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

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

В TreeWidget сущностью является строка (как и должно быть в случае модели данных).

Промежуточный формат может быть любым. Ведь вы собственно будете писать сохранение/загрузку данных. А по поводу "промежуточного" - не понимаю о чём вы.

Рассмотрим логику программы:
1) считываем данные из файла (допустим).
2) создаём модель с данными.
3) изменяем данные. (в модели)
4) по нажатию "OK" перезаписываем данные в файле.

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

Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Декабрь 12, 2013, 08:52 »

В TableWidget каждый столбец сущность.
В TreeWidget сущностью является строка (как и должно быть в случае модели данных).
Спасибо, посмотрю QTreeWidget (никогда ее не пользовал)

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

Сообщений: 4732



Просмотр профиля WWW
« Ответ #5 : Декабрь 12, 2013, 11:10 »

Проблема в том "что должно являться данными". Напр строка добавлена, удалена или отредактирована - ответить немедленным созданием, удалением или изменением пытон-переменной я не могу, хотя бы потому что Ok еще не было. Выходит нужно создать какой-то промежуточный формат, вот я и хотел обсудить как это лучше сделать. 
создать копию переменной будет дорого?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Декабрь 12, 2013, 11:35 »

создать копию переменной будет дорого?
Как минимум неудобно. Пусть на данный момент в пытоне есть переменная, напр var1. Копирование сводится к запуску скрипта

py> var2 = var1

При этом надо быть уверенным что var2 не является какой-то другой переменной и избавиться от нее если она оказалась не у дел

py> del var2

Естественно отложить все вызовы пытона до нажатия Ok

Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Декабрь 12, 2013, 17:18 »

Обосную почему TreeWidget.

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

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

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

- как из QTreeWidgetItem вытащить оригинальный/первоначальный индекс строки? topLevel ф-ции возвращают в зависимости от сортировки, поэтому сделал через UserRole, может как-то поприятнее?

- Слева оставляется место - видимо для значка collaps/expand, как сказать что не нужно?

Спасибо
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4732



Просмотр профиля WWW
« Ответ #8 : Декабрь 12, 2013, 18:59 »

- как из QTreeWidgetItem вытащить оригинальный/первоначальный индекс строки? topLevel ф-ции возвращают в зависимости от сортировки, поэтому сделал через UserRole, может как-то поприятнее?
если делать сортировку через QSortFilterProxyModel, то исходные позиции можно получить из sourceModel. иначе «поприятнее» никак (вряд ли наследование — это приятно Улыбающийся ).
- Слева оставляется место - видимо для значка collaps/expand, как сказать что не нужно?
по-моему скрытие rootItem поможет
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Декабрь 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;
 
Понимаю что трудновато понять как оно должно работать - но мне тоже  Улыбающийся Критикуем, улучшаем...
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #10 : Декабрь 12, 2013, 20:09 »

Можно сохранять не слепок всех переменных, а сами действия, которые выполняет пользователь.
Получили список всех переменных из скриптового окружения, вывели их в QTreeWidget. Дальше пользователь удаляет переменную A - сохранили в списке "удалить А" и удалили строку из виджета; пользователь добавил переменную - добавили строку в виджет и положили в список "добавить XYZ".
После редактирования, если пользователь нажал Ок, то выполнили указанные операции для скриптового окружения.
Это напоминает работу UNDO-системы.
Записан
Bepec
Гость
« Ответ #11 : Декабрь 12, 2013, 20:32 »

Я к сожалению всё ещё не понимаю вашего желания видеть какой-то контейнер. Контейнером будет являться ваша модель.

У вас в начале есть структуры "название-значение".
Код:
valueMy="123"

В конце у вас должны быть структуры "название-значение".
Код:
MyValue="321"

В принципе же вам не столь необходима система Undo.

PS если я чего - то не вижу, какой то специфике, просветите меня. Т.е. моя мысль просто делать список всех переменных со значениями, а после просто удалять старые и создавать новые.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4732



Просмотр профиля WWW
« Ответ #12 : Декабрь 12, 2013, 20:50 »

- Слева оставляется место - видимо для значка collaps/expand, как сказать что не нужно?
по-моему скрытие rootItem поможет
А каким образом?  (с UI работаю редко, так что не стесняйтесь отсылать к букварю Улыбающийся)
treeWidget->setRootIsDecorated(false);
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #13 : Декабрь 14, 2013, 09:59 »

Я к сожалению всё ещё не понимаю вашего желания видеть какой-то контейнер. Контейнером будет являться ваша модель.
Да, это желание и было ошибочным. Я думал надо где-то хранить доп данные. Напр имя переменной должно быть уникальным, также нужно ее первоначальное значение. Ну слил все это в контейнер чтобы связываться с ним по индексу строки.

Однако разобравшись понял - гораздо удобнее хранить это в setData(col, UserRole), без всяких доп контейнеров. А еще лучше поставить делегата - и необходимость почти во всех хранениях отпадает. Напр имя переменной - в делегате есть удобная точка где известны новое и старое имя.

treeWidget->setRootIsDecorated(false);
Понял, спасибо

Можно сохранять не слепок всех переменных, а сами действия, которые выполняет пользователь. Получили список всех переменных из скриптового окружения, вывели их в QTreeWidget. Дальше пользователь удаляет переменную A - сохранили в списке "удалить А" и удалили строку из виджета;
Вроде выглядит проще по Ok замочить все переменные, а потом создать все заново из таблицы. Но в любом случае нужно переводить значение переменной в QVariant - это должно быть в PythonQt, буду разбираться

Такой вопрос: переменная-вектор (то же самое что и QVector3D), как поудобнее ее редактировать? Сейчас 3 числа разделенные запятой, напр (1.0, 55.4, 66) не блеск   

Спасибо
Записан
Bepec
Гость
« Ответ #14 : Декабрь 14, 2013, 13:11 »

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

PS я за три спинбокса с переключением между ними стрелочками или ентером.

« Последнее редактирование: Декабрь 14, 2013, 13:25 от Bepec » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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