Название: Контроль ввода в ячейку, создание выпадающих списков Отправлено: vladymyr от Декабрь 06, 2007, 19:38 Есть таблица (qt4), и не qt'шный хмл класс. таблица загружается данными из объекта класса при запуске. при каждом изменении ячейки, специальный метод сохраняет изменения в объекте класса. в конце объект сохраняется в хмл файле. Как создать для отдельных колонок список выбора, выпадающий календарь или просто маску ввода.
Во всех примерах рассматривается работа через модель, а как обойтись без неё, т.к много переделывать и ее роль выполняет специальный не qt'шный хмл класс. Название: Re: Контроль ввода в ячейку, создание выпадающих списков Отправлено: Lion от Декабрь 06, 2007, 21:01 Тебе нужено сделать своего потомка QItemDelegate, подробности смотри в ассистанте, если что будет не понятно поможем.
Название: Re: Контроль ввода в ячейку, создание выпадающих списков Отправлено: vregess от Декабрь 06, 2007, 22:04 Есть таблица (qt4), и не qt'шный хмл класс. таблица загружается данными из объекта класса при запуске. при каждом изменении ячейки, специальный метод сохраняет изменения в объекте класса. в конце объект сохраняется в хмл файле. Как создать для отдельных колонок список выбора, выпадающий календарь или просто маску ввода. Во всех примерах рассматривается работа через модель, а как обойтись без неё, т.к много переделывать и ее роль выполняет специальный не qt'шный хмл класс. В твоем случае роль модели будет выполнять именно модель, а xml-класс будет выполнять роль данных для модели. без model/view тут, вроде, не обойтись(это не так уж и сложно) . Название: Re: Контроль ввода в ячейку, создание выпадающих списков Отправлено: vladymyr от Декабрь 06, 2007, 22:18 Добавил такой класс
Код: #include "tabledelegate.h" Код: #ifndef BOOKDELEGATE_H Код: void MainWindow::Edit(QTableWidgetItem *item){ Название: Re: Контроль ввода в ячейку, создание выпадающих списков Отправлено: vladymyr от Декабрь 06, 2007, 22:21 Есть таблица (qt4), и не qt'шный хмл класс. таблица загружается данными из объекта класса при запуске. при каждом изменении ячейки, специальный метод сохраняет изменения в объекте класса. в конце объект сохраняется в хмл файле. Как создать для отдельных колонок список выбора, выпадающий календарь или просто маску ввода. Во всех примерах рассматривается работа через модель, а как обойтись без неё, т.к много переделывать и ее роль выполняет специальный не qt'шный хмл класс. В твоем случае роль модели будет выполнять именно модель, а xml-класс будет выполнять роль данных для модели. без model/view тут, вроде, не обойтись(это не так уж и сложно) . Сильно запутано будет - много классов для одной задачи - редактирования хмл-файла (расписание). хотя наверное это более правильный подход, раз везде так делают. Название: Re: Контроль ввода в ячейку, создание выпадающих списков Отправлено: vladymyr от Декабрь 06, 2007, 23:01 Может у кого есть простой примерчик, вставьте, пожалуйста.
Название: Re: Контроль ввода в ячейку, создание выпадающих списков Отправлено: vregess от Декабрь 07, 2007, 07:22 Может у кого есть простой примерчик, вставьте, пожалуйста. простой примерчик чего?Делегата, модели. или приложения, использующего model/view? Скажи точнее - приведем. И еще. Глянь метод installDelegate у QTableWidget. Делегат не должен использоваться на прямую - его использует View-класс (в твоем случае, как я понял, QTableWidget). createEditor(QWidget *parent) вызывается самим View-классом, когда начинается редактирование ячейки. installDelegate - указывает View-классу, какой для этого делегат использовать. В твоем случае, можно пойти 2-мя путями: 1. Если отталкиваться от QTableWidget, то можно заполнить данными таблицу, а затем натыкать немного делегатов, и в них напрямую изменять xml-данные. 2. Написать свою модель и делегаты и запихнуть их во View-класс. Тогда xml-данные будут зменяться самой моделью (как и должно быть), а не делегатами. В делегатах будет происходить лишь редактирование. Пример могу написать позже (сюда или в личку), ща времени нет. Название: Re: Контроль ввода в ячейку, создание выпадающих списков Отправлено: Alex03 от Декабрь 07, 2007, 07:33 Примерчики есть в wxamples-ах. Их вполне хватает для понимания.
Сорри за некоторый офтопик, но: У меня вот более глобальная хотелка после прочтения вот этой статьи (http://www.ibase.ru/devinfo/xmldb.htm). Хочу готовый Qt редактор XML файла в соответствии с XSD схемой. В принципе не такая уж и сложная задача, мож соорудим сообща? Название: Re: Контроль ввода в ячейку, создание выпадающих списков Отправлено: ритт от Декабрь 07, 2007, 16:04 редактор хмл на четвёртых кутях видел то ли на кутэ-аппз, то ли на кде-аппз
а статейка не ахти. не так давно читал про возможности построения рсубд на базе любого хранилища данных (например, хмл) и либферрис - вот там изящное и универсальное решение. а это - пшик если уж на то пошло, то включи в свою хотелку интерфейс кутэ-либферрис - а там через айтеммодель и абстрактный язык запросов можно было бы работать с любым хранилещем данных! Название: Re: Контроль ввода в ячейку, создание выпадающих списков Отправлено: vladymyr от Декабрь 07, 2007, 17:15 > 1. Если отталкиваться от QTableWidget, то можно заполнить данными таблицу, а затем натыкать немного делегатов, и в них напрямую изменять xml-данные.
> 2. Написать свою модель и делегаты и запихнуть их во View-класс. Тогда xml-данные будут зменяться самой моделью (как и должно быть), а не делегатами. В делегатах будет происходить лишь редактирование. я решил пойти первым путем - мне надо несколько редакторов для колонок даты и времени. Только при изменении содержимого ячейки по сигналу изменяются xml-данные, т.е надо изменять значение в ячейке. во втором случее надо будет всё переделывать. А так большое спасибо, буду делать. если кому-нибудь будет надо - выложу Название: Re: Контроль ввода в ячейку, создание выпадающих списков Отправлено: ритт от Декабрь 07, 2007, 17:47 очень зря!
второй вариант значительно лучше первого! да, придётся полюбиться с абстрактной моделью, но в результате будет полноценный движок работы с хмл посредством модели а так поделка получится под конкретную задачу без возможности использовать в серьёзных проектах Название: Re: Контроль ввода в ячейку, создание выпадающих списков Отправлено: ритт от Декабрь 07, 2007, 18:10 я бы сделал по примеру QtSql: класс для работы с данными (чтение, запись, валидация), простая модель на базе абстрактмодели для работы с этим классом + сложная таблмодель для полнофункциональной работы с юзверем и бэкэндом
в итоге для работы с любыми данными в форме хмл будет достаточно создать инстанс твоей модели и скормить его таблвьюхе - это и есть общая цель модель/вью-программирования Название: Re: Контроль ввода в ячейку, создание выпадающих списков Отправлено: vladymyr от Декабрь 07, 2007, 18:13 Согласен, но с этого надо было начинать. А так уже сдавать пора. В следующий раз выберу второй. а пока первый
> И еще. Глянь метод installDelegate у QTableWidget. Делегат не должен использоваться на прямую - его использует View-класс (в твоем случае, как я понял, QTableWidget). > createEditor(QWidget *parent) вызывается самим View-классом, когда начинается редактирование ячейки. > installDelegate - указывает View-классу, какой для этого делегат использовать. Может у меня другая версия, но нет такого метода 4.3.2 Open Source Edition Название: Re: Контроль ввода в ячейку, создание выпадающих списков Отправлено: vregess от Декабрь 07, 2007, 21:23 Может у меня другая версия, но нет такого метода Есть, точно тебе говорю.4.3.2 Open Source Edition Не там смотришь. Посмотри общий список классов. Менять данные надо не по сигналу, а в самом делегате. переопредели метод делегата setModelData . Короч тебе надо реализовать (раз решил идти первым путем): Код: QWidget* createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const; Код: void setEditorData(QWidget *editor, const QModelIndex &index) const; Код: void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const; Воот. Не очень стройная штука получается, но раз надо быстро, то ... За подробностями обращайся к qt-примерам в дистрибутиве по model/view. Там базовая реализация есть. Либо сюда, если что. Название: Re: Контроль ввода в ячейку, создание выпадающих списков Отправлено: Alex03 от Декабрь 10, 2007, 10:55 редактор хмл на четвёртых кутях видел то ли на кутэ-аппз, то ли на кде-аппз а статейка не ахти. не так давно читал про возможности построения рсубд на базе любого хранилища данных (например, хмл) и либферрис - вот там изящное и универсальное решение. а это - пшик если уж на то пошло, то включи в свою хотелку интерфейс кутэ-либферрис - а там через айтеммодель и абстрактный язык запросов можно было бы работать с любым хранилещем данных! Мне не нужен редактор XML. Мне нужен редактор полей в некоем XML, а поля эти описываются в XSD схеме. Т.е. есть у меня прога работающая с БД. В БД в таблицах есть всё что нужно проге, но вот конечному пользователю хочется хранить рядом с записями некоторых таблиц свои данные. Притом одному пользователю одни данные, второму другие. менять структуру БД, добавлять на лету поля/таблицы и т.д. ИМХО не есть гут. А вот добавить одно универсальное поле в котором будет лежать XML c произвольными данными ИМХО очень хорошо, остаётся проблема редактирования/показа этих данных, и вот тут то XSD-схема поможет мне. Осталось найти/сделать редактор этого XML в соответствии с заданной XSD. Притом всё это д.б. расчитано на довольно бестолкового пользователя. В общем хочется подобие xmlinspector (http://www.devrace.com/ru/xmlinspector/) только на Qt Название: Re: Контроль ввода в ячейку, создание выпадающих списков Отправлено: ритт от Декабрь 10, 2007, 15:32 алекс, я понял о чём ты, мог и не уточнять
вот, владимиру и предлагал пойти по _правильному_ пути - так он убил бы сразу несколько зайцев. Название: Re: Контроль ввода в ячейку, создание выпадающих списков Отправлено: Alexandr Az от Декабрь 11, 2007, 10:33 Цитировать Сорри за некоторый офтопик, но: У меня вот более глобальная хотелка после прочтения вот этой статьи. Хочу готовый Qt редактор XML файла в соответствии с XSD схемой. В принципе не такая уж и сложная задача, мож соорудим сообща? Задача кстати востребованная, сам когда то хотел создать такое, но под QT она сложна - в куте нету парсера нормального ХМЛ, который бы поддерживал схемы (даже DTD не поддерживает), что уж тут говорить про парсер схем. Писать свой парсер для xsd - это уже отдельная задача. Из всех либ, которые исследовал по этому поводу, парсить схему (и создавать по ней хмл) умееют только 2: 1. msxml4 и выше (отличнейший парсер) 2. xerces. Первый понятно отпадает из за одноплатформености (если можно так сказать), да ещё и из-за ком интерфейса. Название: Re: Контроль ввода в ячейку, создание выпадающих списков Отправлено: vladymyr от Декабрь 11, 2007, 17:39 я как раз второй использую, точнее его сокращенную версию
http://www.applied-mathematics.net/tools/xmlParser.html Очень удобный и простой интерфейс на с++ . Ну раз об этом зашёл разговор, является правильным то , что он все значения пишет с новой строки? Код: <?xml version="1.0" encoding="utf-8"?> парсер на Питоне этого не понимает и ругается. хочет Код: <?xml version="1.0" encoding="utf-8"?> Название: Re: Контроль ввода в ячейку, создание выпадающих списков Отправлено: vregess от Декабрь 11, 2007, 20:46 Ну раз об этом зашёл разговор, является правильным то , что он все значения пишет с новой строки? Вроде пофиг парсеру должно быть......................... парсер на Питоне этого не понимает и ругается. хочет но чет вы от темы отклонились. Название: Re: Контроль ввода в ячейку, создание выпадающих списков Отправлено: vladymyr от Декабрь 11, 2007, 20:56 и я говорю пофиг, а тот, кто должен этот файл обрабатывать после моего редактора, делает на питоне и ругается на такой формат.
а по теме пока нечего, пробую на ячейку поставить регулярное выражение Название: Re: Контроль ввода в ячейку, создание выпадающих списков Отправлено: vladymyr от Декабрь 11, 2007, 22:15 Как выполнить над одним объектом метод другого объекта?
надо установить для поля QTableWidgetItem маску, типа currentTable->item(i,j)->setInputMask("0000/00/00"); или QRegExp rx("0000/00/00"); QValidator *validator = new QRegExpValidator(rx, this); currentTable->item(i,j)->setValidator(validator); |