Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: span от Ноябрь 04, 2007, 11:59



Название: ГУИ. Навигационное дерево + редактирование объектов.
Отправлено: span от Ноябрь 04, 2007, 11:59
Доброго дня!
Извиняюсь, если не совсем корректно назвал топик.

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

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

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

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





Название: Re: ГУИ. Навигационное дерево + редактирование объектов.
Отправлено: ритт от Ноябрь 04, 2007, 12:28
читаем документацию? QDataWidgetMapper


Название: Re: ГУИ. Навигационное дерево + редактирование объектов.
Отправлено: ритт от Ноябрь 04, 2007, 12:34
ммм...хотелось бы ещё уточнить: для заполнения модели таблички (списка в середине) используются простые запросы (вида "селект _поля_ фром _таблица_ вхере _вхере_клаусе_")?

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


Название: Re: ГУИ. Навигационное дерево + редактирование объектов.
Отправлено: span от Ноябрь 04, 2007, 13:10
ммм...хотелось бы ещё уточнить: для заполнения модели таблички (списка в середине) используются простые запросы (вида "селект _поля_ фром _таблица_ вхере _вхере_клаусе_")?

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

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

2) Я тоже сначала хотел в динамика сделать создание "custom" виджетов. Но, имхо, бастрее будет show\hide (или я не прав?), и еще не пойму, как избежать утечки памяти: я вызываю конструкторы своих виджетов, а в них SetupUi, в котором, естественно, множество new.


Название: Re: ГУИ. Навигационное дерево + редактирование объектов.
Отправлено: ритт от Ноябрь 04, 2007, 14:27
на часть вопросов отвечает QDataWidgetMapper. навигация вперёд/назад - тоже QDataWidgetMapper.

утечек не будет, если пишется правильно. а конструкторы-сетапуи-множество_нью мне мало о чём говорит - уж лучше код!


Название: Re: ГУИ. Навигационное дерево + редактирование объектов.
Отправлено: Вячеслав от Ноябрь 04, 2007, 15:28
Он имел ввиду ту хрень, которую uic создает из ui файла ;)


Название: Re: ГУИ. Навигационное дерево + редактирование объектов.
Отправлено: span от Ноябрь 04, 2007, 15:55
Он имел ввиду ту хрень, которую uic создает из ui файла ;)

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


Название: Re: ГУИ. Навигационное дерево + редактирование объектов.
Отправлено: pastor от Ноябрь 04, 2007, 16:09
Есть вообще возможность как-нибудь освобождать память после SetuрUi? Например, у меня свой виджет, он наследует QDialog и  класс сделанный uic`ом. в конструкторе - SetupUi(this). Что в деструктор кинуть, чтобы удалились все виджеты, созданные в дизайнере?

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


Название: Re: ГУИ. Навигационное дерево + редактирование объектов.
Отправлено: Вячеслав от Ноябрь 04, 2007, 16:29
Не народ ;) Это даж не смешно ;) Давайте фак рисовать штоль ;) Ато два разв в день одно и тож - это перебор IMHO ж) Но с другой стороны - повторенье-мать ученья ;)


Название: Re: ГУИ. Навигационное дерево + редактирование объектов.
Отправлено: ритт от Ноябрь 04, 2007, 17:40
Он имел ввиду ту хрень, которую uic создает из ui файла ;)

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

> Давайте фак рисовать штоль
+1
только на форуме это будет жестоко. надо в таком случае викулю и закрепить ветку со ссылкой на этот фак...
а потом злобно так рожей всех тыкать туда  :-\


Название: Re: ГУИ. Навигационное дерево + редактирование объектов.
Отправлено: Вячеслав от Ноябрь 04, 2007, 18:03
Гы ;) Ну тады полетели ;) Вопрос только -куда ;) Здешные админы могут Вику присобачить ?


Название: Re: ГУИ. Навигационное дерево + редактирование объектов.
Отправлено: span от Ноябрь 04, 2007, 22:18
Гы ;) Ну тады полетели ;) Вопрос только -куда ;) Здешные админы могут Вику присобачить ?

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

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

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

А вообще, всем спасибо за ответы! Трудно в рунете найти похожее место)


Название: Re: ГУИ. Навигационное дерево + редактирование объектов.
Отправлено: ритт от Ноябрь 05, 2007, 05:13
2) модель не может/не должна инициировать какие-либо действия во вьюхе. грубо говоря, модель - хранилище данных (точнее, реинтерпретация части другого хранилища) - в данном случае хранилище таблицы или её части. а вьюха - визуальныя оболочка над этим хранилищем.
/*вспомни дос и волков коммандер*/

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

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

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

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


Название: Re: ГУИ. Навигационное дерево + редактирование объектов.
Отправлено: span от Ноябрь 05, 2007, 15:35
2) модель не может/не должна инициировать какие-либо действия во вьюхе. грубо говоря, модель - хранилище данных (точнее, реинтерпретация части другого хранилища) - в данном случае хранилище таблицы или её части. а вьюха - визуальныя оболочка над этим хранилищем.
/*вспомни дос и волков коммандер*/

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

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

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

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




Название: Re: ГУИ. Навигационное дерево + редактирование объектов.
Отправлено: ритт от Ноябрь 05, 2007, 16:19
класс модели как называется?

омг...только сейчас заметил
"для таблицы выбираешь рид-онли вьюху" имелось в виду "для таблицы выбираешь рид-онли модель"


Название: Re: ГУИ. Навигационное дерево + редактирование объектов.
Отправлено: WW от Ноябрь 06, 2007, 00:26
Не в тему. Поддерживаю на счет фака. Начало уже есть. (О лицензиях.) Надо только переименоватьв miniFAQ. И отредактирорвать. И добавлять туда выжатые ответы.


Название: Re: ГУИ. Навигационное дерево + редактирование объектов.
Отправлено: span от Ноябрь 06, 2007, 12:08
"для таблицы выбираешь рид-онли вьюху" имелось в виду "для таблицы выбираешь рид-онли модель"

Хмм... У меня модель данных одна, это наследник от QSqlQueryModel. Я в ней реализовал flags() и setData().
Как же я вьюхе подсуну эту модель, как рид-онли?  static_cast<> моего класса к рид-онли модели не пройдет...


Название: Re: ГУИ. Навигационное дерево + редактирование объектов.
Отправлено: ритт от Ноябрь 06, 2007, 13:26
чегой-то ты мну запутал...

вьюха кутэйблвью? и что? при фокусе на ячейке позволяет редактировать? запрети! - setEditTriggers(QAbstractItemView::NoEditTriggers);

или какая проблема-то?


Название: Re: ГУИ. Навигационное дерево + редактирование объектов.
Отправлено: ритт от Ноябрь 06, 2007, 13:27
и вообще, проект открытый или коммерческий?


Название: Re: ГУИ. Навигационное дерево + редактирование объектов.
Отправлено: span от Ноябрь 06, 2007, 14:01
чегой-то ты мну запутал...

вьюха кутэйблвью? и что? при фокусе на ячейке позволяет редактировать? запрети! - setEditTriggers(QAbstractItemView::NoEditTriggers);

или какая проблема-то?

Как раз то что надо... А я рыл доки, искал всякие setReadOnly.


Название: Re: ГУИ. Навигационное дерево + редактирование объектов.
Отправлено: ритт от Ноябрь 06, 2007, 14:05
жаль, форум без рейтов...тут на одно ветке можно столько экспы срубить :)

на вопрос ответь...


Название: Re: ГУИ. Навигационное дерево + редактирование объектов.
Отправлено: span от Ноябрь 06, 2007, 14:10
жаль, форум без рейтов...тут на одно ветке можно столько экспы срубить :)

на вопрос ответь...

Не коммерческий. Сорцы не выкладываю, т.к. хочу сам понимать что делать на более высоком уровне. Да и надобности в них имхо не было пока.


Название: Re: ГУИ. Навигационное дерево + редактирование объектов.
Отправлено: span от Ноябрь 06, 2007, 17:21
как говорится, чем дальше в лес...

Столкнулся с очередными проблемами:
1) Использую QDataWidgetMapper. Замапил поле из модели к QTextEdit на диалоге. Теперь, если установить фокус на этот textEdit, а потом его убрать - сразу вызывается метод setData моей модели. Даже если данные вообще не менялись. Как этого избежать?
2) С тем же самым textEdit`ом (см. п.1) есть проблема с тем, что он кидает в базу помимо самого текста набор HTML тэгов. Я пытался убрать параметр html у QTextEdit через Дизайнер. Не дает!
3) Я так понял, если я использую потомка QSqlQueryModel для создания собственной модели данных, мне самому придется беспокоится о возможности подтвердить или отклонить изменения (Submit/revert). Писать самому, чтобы изменения сначала помещалис в некий кеш. Я прав?


Название: Re: ГУИ. Навигационное дерево + редактирование объектов.
Отправлено: ритт от Ноябрь 06, 2007, 17:30
1) 2) на счёт эдита сейчас ничего не подскажу
3) если ты собирался вносить/отклонять изменения, зачем выбрал риад-онли модель? бери кусклтаблмодель - там уже и промежуточное кеширование, и правильное построение запросов реализовано


Название: Re: ГУИ. Навигационное дерево + редактирование объектов.
Отправлено: stealth от Ноябрь 06, 2007, 21:10
по поводу второго пункта

Код:
 #if QT_VERSION >= 0x040300
mapper->addMapping(uiContr.textContrNotes, modelContragents->fieldIndex("Notes"), "plainText");
 #endif