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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: ГУИ. Навигационное дерево + редактирование объектов.  (Прочитано 12878 раз)
span
Гость
« : Ноябрь 04, 2007, 11:59 »

Доброго дня!
Извиняюсь, если не совсем корректно назвал топик.

В QT новичек, около 1 мес. работы.
Разрабатываю ГУИ для редактирования объектов в БД.
Хотел получить несколько общих советов.
Что хочу:
Всегда одно и то же окно. Слева - дерево объетов БД. (пользователи, группы, конфигурации и.т.д.). Справа - Table (Table view) со списком объектов в группе(если выбрана группа) + виджет для редактирования параметров объекта.
Примеров такой организации полно. MS Outlook например. Слева дерево, посреди - список, совсем справа - содержание письма.

Пока сделал следующее:
Read-only модель, описывающая дерево (как раз той структуры, которую хочу). В internal pointer`ах храню достаточно данных для получения объектов из БД. Ловлю сигналы от TreeView, анализирую, надо ли что-нибудь менять в правой части. Создал набор виджетов в дизайнере для редактирования параметров объектов. создаю в статически, и при надобности заполняю их нужными полями и вызываю у них show\hide.

Получается все как-то громоздко... не так изящно, как с model\view, реализованном в дереве навигации.

Есть ли какая-нибудь общая технология для реализации такого типа интерфейса? (отображение списка объектов в гриде + редактирование полей в самописном виджете + удобное добавление/редактирование объектов).



Записан
ритт
Гость
« Ответ #1 : Ноябрь 04, 2007, 12:28 »

читаем документацию? QDataWidgetMapper
Записан
ритт
Гость
« Ответ #2 : Ноябрь 04, 2007, 12:34 »

ммм...хотелось бы ещё уточнить: для заполнения модели таблички (списка в середине) используются простые запросы (вида "селект _поля_ фром _таблица_ вхере _вхере_клаусе_")?

и я бы сделал виджеты на виджете редактирования не статичными с шоу/хайд, а динамически создаваемыми/удаляемыми при необходимости
Записан
span
Гость
« Ответ #3 : Ноябрь 04, 2007, 13:10 »

ммм...хотелось бы ещё уточнить: для заполнения модели таблички (списка в середине) используются простые запросы (вида "селект _поля_ фром _таблица_ вхере _вхере_клаусе_")?

и я бы сделал виджеты на виджете редактирования не статичными с шоу/хайд, а динамически создаваемыми/удаляемыми при необходимости

1) Да, всегда простые селекты. Меняются только список запрашиваемых полей, названия таблиц (вьюх) и вхере. Я эти данные беру из internalPointer`ов item`ов дерева. Хотелось бы вообще не делать на каждый список разных объектов разные виджеты, а сделать какой-нить один. Еще надо бы туда стандартные ф-и навигации засунуть, опять же, одинаковые для всех типов объектов (вперед/назад, +\-, рефреш и.т.д.)

2) Я тоже сначала хотел в динамика сделать создание "custom" виджетов. Но, имхо, бастрее будет show\hide (или я не прав?), и еще не пойму, как избежать утечки памяти: я вызываю конструкторы своих виджетов, а в них SetupUi, в котором, естественно, множество new.
Записан
ритт
Гость
« Ответ #4 : Ноябрь 04, 2007, 14:27 »

на часть вопросов отвечает QDataWidgetMapper. навигация вперёд/назад - тоже QDataWidgetMapper.

утечек не будет, если пишется правильно. а конструкторы-сетапуи-множество_нью мне мало о чём говорит - уж лучше код!
Записан
Вячеслав
Гость
« Ответ #5 : Ноябрь 04, 2007, 15:28 »

Он имел ввиду ту хрень, которую uic создает из ui файла Подмигивающий
Записан
span
Гость
« Ответ #6 : Ноябрь 04, 2007, 15:55 »

Он имел ввиду ту хрень, которую uic создает из ui файла Подмигивающий

Ага, именно ту хрень в виду и имел.
Есть вообще возможность как-нибудь освобождать память после SetuрUi? Например, у меня свой виджет, он наследует QDialog и  класс сделанный uic`ом. в конструкторе - SetupUi(this). Что в деструктор кинуть, чтобы удалились все виджеты, созданные в дизайнере?
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #7 : Ноябрь 04, 2007, 16:09 »

Есть вообще возможность как-нибудь освобождать память после SetuрUi? Например, у меня свой виджет, он наследует QDialog и  класс сделанный uic`ом. в конструкторе - SetupUi(this). Что в деструктор кинуть, чтобы удалились все виджеты, созданные в дизайнере?

Дык, так они сами удаляться, когда ты удалишь свой диалог
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Вячеслав
Гость
« Ответ #8 : Ноябрь 04, 2007, 16:29 »

Не народ Подмигивающий Это даж не смешно Подмигивающий Давайте фак рисовать штоль Подмигивающий Ато два разв в день одно и тож - это перебор IMHO ж) Но с другой стороны - повторенье-мать ученья Подмигивающий
Записан
ритт
Гость
« Ответ #9 : Ноябрь 04, 2007, 17:40 »

Он имел ввиду ту хрень, которую uic создает из ui файла Подмигивающий

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

> Давайте фак рисовать штоль
+1
только на форуме это будет жестоко. надо в таком случае викулю и закрепить ветку со ссылкой на этот фак...
а потом злобно так рожей всех тыкать туда  В замешательстве
Записан
Вячеслав
Гость
« Ответ #10 : Ноябрь 04, 2007, 18:03 »

Гы Подмигивающий Ну тады полетели Подмигивающий Вопрос только -куда Подмигивающий Здешные админы могут Вику присобачить ?
Записан
span
Гость
« Ответ #11 : Ноябрь 04, 2007, 22:18 »

Гы Подмигивающий Ну тады полетели Подмигивающий Вопрос только -куда Подмигивающий Здешные админы могут Вику присобачить ?

Я вообще только рад буду, если послужу причиной создания ФАКа)). Можно даже ссылочку на меня там кинуть). Это всё шутки.

1) По поводу уничтожения объектов, созданных в дизайнере - понял. Не просто так им паренты задаются.

2) Почитал про QDataWidgetMapper. Поиграл с ним на примере Демо "books". Все просто отлично, как раз то что надо. Но! Добавил на форму кнопки для навигации, связал их сигналы clicked() соответственно с toPrevious() и toNext(). Данные в инпутах, связанных с моделью через QDataWidgetMapper меняются как надо, а TableView не меняется. Хотя связан с той же моделью. Хочется, чтобы при нажатии на кнопки "Вперед"/"Назад" менялась еще и текущая строка в tableView. Как это сделать? И еще: как сделать, чтобы данные были изменяемыми только через инпуты (lineEdit, spinBox etc.), связанные с моделью через QDataWidgetMapper Непонимающий Хочу чтобы таблица была read-only.

А вообще, всем спасибо за ответы! Трудно в рунете найти похожее место)
« Последнее редактирование: Ноябрь 04, 2007, 22:20 от span » Записан
ритт
Гость
« Ответ #12 : Ноябрь 05, 2007, 05:13 »

2) модель не может/не должна инициировать какие-либо действия во вьюхе. грубо говоря, модель - хранилище данных (точнее, реинтерпретация части другого хранилища) - в данном случае хранилище таблицы или её части. а вьюха - визуальныя оболочка над этим хранилищем.
/*вспомни дос и волков коммандер*/

чтобы связка сигналов clicked() баттонов с toPrevious() и toNext() модели как-либо отражалась на вьюхе, надо вязать эти же кликеды на селект соответствующей строки во вьюхе
об проектировании модель/вид тоже весьма развёрнуто написано в доках

>как сделать, чтобы данные были изменяемыми только через инпуты (lineEdit, spinBox etc.), связанные с моделью через QDataWidgetMapper  Хочу чтобы таблица была read-only

ты хочешь, чтобы данные нельзя было редактировать из вьюхи, а только из диалога, размаппенного на модели?
и в чём проблема? ставишь модели стратегию QSqlTableModel::OnRowChange, для таблицы выбираешь рид-онли вьюху, например, QSqlQueryModel...и всё

или я что-то пропустил?
Записан
span
Гость
« Ответ #13 : Ноябрь 05, 2007, 15:35 »

2) модель не может/не должна инициировать какие-либо действия во вьюхе. грубо говоря, модель - хранилище данных (точнее, реинтерпретация части другого хранилища) - в данном случае хранилище таблицы или её части. а вьюха - визуальныя оболочка над этим хранилищем.
/*вспомни дос и волков коммандер*/

чтобы связка сигналов clicked() баттонов с toPrevious() и toNext() модели как-либо отражалась на вьюхе, надо вязать эти же кликеды на селект соответствующей строки во вьюхе
об проектировании модель/вид тоже весьма развёрнуто написано в доках
Спасибо за совет, все так и сделал - работает отлично.

ты хочешь, чтобы данные нельзя было редактировать из вьюхи, а только из диалога, размаппенного на модели?
и в чём проблема? ставишь модели стратегию QSqlTableModel::OnRowChange, для таблицы выбираешь рид-онли вьюху, например, QSqlQueryModel...и всё

или я что-то пропустил?

Не понял ничего... Да, я хочу чтобы данные из модели можно было бы редактировать ТОЛЬКО из формы, размапленной по модели.
У меня модель read-write. И получается, что я могу редактировать данные и через замеппленные контролы и через вью (в моем случае - просто QTableView).
"для таблицы выбираешь рид-онли вьюху, например, QSqlQueryModel...и всё" - не понял. Можно прояснить чуток?


« Последнее редактирование: Ноябрь 05, 2007, 15:39 от span » Записан
ритт
Гость
« Ответ #14 : Ноябрь 05, 2007, 16:19 »

класс модели как называется?

омг...только сейчас заметил
"для таблицы выбираешь рид-онли вьюху" имелось в виду "для таблицы выбираешь рид-онли модель"
« Последнее редактирование: Ноябрь 05, 2007, 16:21 от xep » Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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