Название: ГУИ. Навигационное дерево + редактирование объектов. Отправлено: 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 |