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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Контроль ввода в ячейку, создание выпадающих списков  (Прочитано 14701 раз)
vladymyr
Гость
« : Декабрь 06, 2007, 19:38 »

Есть таблица (qt4), и не qt'шный хмл класс. таблица загружается данными из объекта класса при запуске. при каждом изменении ячейки, специальный метод сохраняет изменения в объекте класса. в конце объект сохраняется в хмл файле. Как создать для отдельных колонок список выбора, выпадающий календарь или просто маску ввода.
Во всех примерах рассматривается работа через модель, а как обойтись без неё, т.к много переделывать и ее роль выполняет специальный не qt'шный хмл класс.
Записан
Lion
Гость
« Ответ #1 : Декабрь 06, 2007, 21:01 »

Тебе нужено сделать своего потомка QItemDelegate, подробности смотри в ассистанте, если что будет не понятно поможем.
Записан
vregess
Гость
« Ответ #2 : Декабрь 06, 2007, 22:04 »

Есть таблица (qt4), и не qt'шный хмл класс. таблица загружается данными из объекта класса при запуске. при каждом изменении ячейки, специальный метод сохраняет изменения в объекте класса. в конце объект сохраняется в хмл файле. Как создать для отдельных колонок список выбора, выпадающий календарь или просто маску ввода.
Во всех примерах рассматривается работа через модель, а как обойтись без неё, т.к много переделывать и ее роль выполняет специальный не qt'шный хмл класс.

В твоем случае роль модели будет выполнять именно модель, а xml-класс будет выполнять роль данных для модели.
без model/view тут, вроде, не обойтись(это не так уж и сложно) .
Записан
vladymyr
Гость
« Ответ #3 : Декабрь 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());
}
на этом пока застрял
Записан
vladymyr
Гость
« Ответ #4 : Декабрь 06, 2007, 22:21 »

Есть таблица (qt4), и не qt'шный хмл класс. таблица загружается данными из объекта класса при запуске. при каждом изменении ячейки, специальный метод сохраняет изменения в объекте класса. в конце объект сохраняется в хмл файле. Как создать для отдельных колонок список выбора, выпадающий календарь или просто маску ввода.
Во всех примерах рассматривается работа через модель, а как обойтись без неё, т.к много переделывать и ее роль выполняет специальный не qt'шный хмл класс.

В твоем случае роль модели будет выполнять именно модель, а xml-класс будет выполнять роль данных для модели.
без model/view тут, вроде, не обойтись(это не так уж и сложно) .

Сильно запутано будет - много классов для одной задачи - редактирования хмл-файла (расписание). хотя наверное это более правильный подход, раз везде так делают.
Записан
vladymyr
Гость
« Ответ #5 : Декабрь 06, 2007, 23:01 »

Может у кого есть простой примерчик, вставьте, пожалуйста.
Записан
vregess
Гость
« Ответ #6 : Декабрь 07, 2007, 07:22 »

Может у кого есть простой примерчик, вставьте, пожалуйста.
простой примерчик чего?
Делегата, модели. или приложения, использующего model/view?

Скажи точнее - приведем.

И еще. Глянь метод installDelegate у QTableWidget. Делегат не должен использоваться на прямую - его использует View-класс (в твоем случае, как я понял, QTableWidget).

createEditor(QWidget *parent) вызывается самим View-классом, когда начинается редактирование ячейки.
installDelegate - указывает View-классу, какой для этого делегат использовать.

В твоем случае, можно пойти 2-мя путями:
1. Если отталкиваться от QTableWidget, то можно заполнить данными таблицу, а затем натыкать немного делегатов, и в них напрямую изменять xml-данные.
2. Написать свою модель и делегаты и запихнуть их во View-класс. Тогда xml-данные будут зменяться самой моделью (как и должно быть), а не делегатами. В делегатах будет происходить лишь редактирование.

Пример могу написать позже (сюда или в личку), ща времени нет.
« Последнее редактирование: Декабрь 07, 2007, 07:38 от vregess » Записан
Alex03
Гость
« Ответ #7 : Декабрь 07, 2007, 07:33 »

Примерчики есть в wxamples-ах. Их вполне хватает для понимания.

Сорри за некоторый офтопик, но:
У меня вот более глобальная хотелка после прочтения вот этой статьи.
Хочу готовый Qt редактор XML файла в соответствии с XSD схемой.
В принципе не такая уж и сложная задача, мож соорудим сообща?
Записан
ритт
Гость
« Ответ #8 : Декабрь 07, 2007, 16:04 »

редактор хмл на четвёртых кутях видел то ли на кутэ-аппз, то ли на кде-аппз

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

если уж на то пошло, то включи в свою хотелку интерфейс кутэ-либферрис - а там через айтеммодель и абстрактный язык запросов можно было бы работать с любым хранилещем данных!
« Последнее редактирование: Декабрь 07, 2007, 16:11 от xep » Записан
vladymyr
Гость
« Ответ #9 : Декабрь 07, 2007, 17:15 »

> 1. Если отталкиваться от QTableWidget, то можно заполнить данными таблицу, а затем натыкать немного делегатов, и в них напрямую изменять xml-данные.
> 2. Написать свою модель и делегаты и запихнуть их во View-класс. Тогда xml-данные будут зменяться самой моделью (как и должно быть), а не делегатами. В делегатах будет происходить лишь редактирование.

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

А так большое спасибо,  буду делать. если кому-нибудь будет надо - выложу
Записан
ритт
Гость
« Ответ #10 : Декабрь 07, 2007, 17:47 »

очень зря!
второй вариант значительно лучше первого!
да, придётся полюбиться с абстрактной моделью, но в результате будет полноценный движок работы с хмл посредством модели
а так поделка получится под конкретную задачу без возможности использовать в серьёзных проектах
Записан
ритт
Гость
« Ответ #11 : Декабрь 07, 2007, 18:10 »

я бы сделал по примеру QtSql: класс для работы с данными (чтение, запись, валидация), простая модель на базе абстрактмодели для работы с этим классом + сложная таблмодель для полнофункциональной работы с юзверем и бэкэндом
в итоге для работы с любыми данными в форме хмл будет достаточно создать инстанс твоей модели и скормить его таблвьюхе - это и есть общая цель модель/вью-программирования
Записан
vladymyr
Гость
« Ответ #12 : Декабрь 07, 2007, 18:13 »

Согласен, но с этого надо было начинать. А так уже сдавать пора. В следующий раз выберу второй. а пока первый

> И еще. Глянь метод installDelegate у QTableWidget. Делегат не должен использоваться на прямую - его использует View-класс (в твоем случае, как я понял, QTableWidget).

> createEditor(QWidget *parent) вызывается самим View-классом, когда начинается редактирование ячейки.
> installDelegate - указывает View-классу, какой для этого делегат использовать.

Может у меня другая версия, но нет такого метода
4.3.2 Open Source Edition
Записан
vregess
Гость
« Ответ #13 : Декабрь 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. Там базовая реализация есть. Либо сюда, если что.
Записан
Alex03
Гость
« Ответ #14 : Декабрь 10, 2007, 10:55 »

редактор хмл на четвёртых кутях видел то ли на кутэ-аппз, то ли на кде-аппз

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

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

Мне не нужен редактор XML.
Мне нужен редактор полей в некоем XML, а поля эти описываются в XSD схеме.
Т.е. есть у меня прога работающая с БД. В БД в таблицах есть всё что нужно проге, но вот конечному пользователю хочется хранить рядом с записями некоторых таблиц свои данные. Притом одному пользователю одни данные, второму другие. менять структуру БД, добавлять на лету поля/таблицы и т.д. ИМХО не есть гут. А вот добавить одно универсальное поле в котором будет лежать XML c произвольными данными ИМХО очень хорошо, остаётся проблема редактирования/показа этих данных, и вот тут то XSD-схема поможет мне. Осталось найти/сделать редактор этого XML в соответствии с заданной XSD. Притом всё это д.б. расчитано на довольно бестолкового пользователя.
В общем хочется подобие xmlinspector только на Qt
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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