Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: vladymyr от Декабрь 06, 2007, 19:38



Название: Контроль ввода в ячейку, создание выпадающих списков
Отправлено: 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"

#include <QtGui>

tableDelegate::tableDelegate(QObject *parent)
    : QItemDelegate(parent)
{
}

QWidget *tableDelegate::createEditor(QWidget *parent) const
{
//if (index.column() != 4){}
    // for editing the year, return a spinbox with a range from -1000 to 2100.
QSpinBox *sb = new QSpinBox(parent);
sb->setFrame(false);
sb->setMaximum(2100);
sb->setMinimum(-1000);

return sb;
}
Код:
#ifndef BOOKDELEGATE_H
#define BOOKDELEGATE_H

#include <QModelIndex>
#include <QPixmap>
#include <QSize>
#include <QSqlRelationalDelegate>

class QPainter;

class tableDelegate : public QItemDelegate //public QItemDelegate
{
public:
    tableDelegate(QObject *parent);

    QWidget *createEditor(QWidget *parent) const;//, const QStyleOptionViewItem &option, const QModelIndex &index

private:

};

#endif
в основном классе окна добавил метод
Код:
void MainWindow::Edit(QTableWidgetItem *item){

qDebug("%d",item->column());

tableDelegate * editor=new tableDelegate(item->tableWidget());
}
на этом пока застрял


Название: 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;
- создаешь непосредственно редактор в зависимости от колонки (колонку можно узнать из index)

Код:
void setEditorData(QWidget *editor, const QModelIndex &index) const;
- устанавливаешь значение в созданный редактор.

Код:
void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;
- при завершении редактирования вызывется этот метод. Он и будет ключевым для тебя. Тут тебе надо установить отредактированные данные в модель, а также передать эти же данные твоему xml-классу (чтобы данные действительно изменились).

Воот. Не очень стройная штука получается, но раз надо быстро, то ...
За подробностями обращайся к 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"?>
<document>
<group name="Основное расписание звонков">
<task>
<title>
Звонок на первую пару
</title>
<enabled>
on
</enabled>
<start_date>
2007/10/23
</start_date>
<end_date>
2007/11/23
</end_date>
<time>
9:00
</time>
<length>
10
</length>
.......................

парсер на Питоне этого не понимает и ругается. хочет
Код:
<?xml version="1.0" encoding="utf-8"?>
<document>
<group name="Основное расписание звонков">
<task>
<title>Звонок на первую пару </title>
<enabled>on</enabled>
<start_date>2007/10/23</start_date>
<end_date>2007/11/23</end_date>
<time>9:00</time>
<length>10</length>
.......................


Название: 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);