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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] Изменение данных модели при изменении редактируемого значения делегата  (Прочитано 4991 раз)
vdann
Гость
« : Июнь 01, 2009, 11:52 »

День добрый!
...создаю свой делегат (с виджетом для ввода географических координат), переопределяю все 3 ф-и:
Код
C++ (Qt)
QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &style,
const QModelIndex &index) const;
void setEditorData(QWidget *editor, const QModelIndex &index) const;
void setModelData(QWidget *editor, QAbstractItemModel *model,
const QModelIndex &index) const;
 
...он (делегат) работает как и должен =>
    1. createEditor, создает мой виджет.
    2. setEditorData, устанавливает в мой виджет данные из модели данных.
    3. Ввожу свои значения, нажимаю ввод.
    4. setModelData, устанавливает данные из моего виджета в модель данных.

А мне нужно:
    ..
    3. Ввожу свои значения, данные из моего виджета устанавливаюся в модель данных.
    ...
..есть у кого-нибудь какие идеи?
« Последнее редактирование: Июнь 04, 2009, 08:52 от vdann » Записан
Barmaglodd
Гость
« Ответ #1 : Июнь 01, 2009, 12:46 »

Код setModelData покажи Улыбающийся
Записан
vdann
Гость
« Ответ #2 : Июнь 01, 2009, 15:33 »

Код
C++ (Qt)
void ItemBLDelegate::setModelData( QWidget *editor, QAbstractItemModel *model, const QModelIndex &index ) const
{
BLEditWidget *isEditor = qobject_cast<BLEditWidget *>(editor);
if (isEditor)
model->setData(index, isEditor->text());
else
QItemDelegate::setModelData(editor, model, index);
}
 

...мне нужно чтобы данные в модели изменялись при изменении делегата, а не после ввода...
Записан
Barmaglodd
Гость
« Ответ #3 : Июнь 02, 2009, 07:32 »

Невнимательно прочитал. Возможно стоит в setEditorData, как-то индекс передать в BLEditWidget, и в виджете обрабатывать ввод, и писать в модель, а setModelData оставить пустым.

А чем стандартное поведение не устраивает? Почему надо сразу заносить данные, а не после ввода?
Записан
vdann
Гость
« Ответ #4 : Июнь 02, 2009, 14:54 »

...таблица представляет собой массив географических координат какого-то линейного объекта, который отрисовывается на экране, поэтому было бы удобней видеть изменения координат прямо на экране непосредственно на момент редактирования...
..на данном этапе я нашел решение =>

Код
C++ (Qt)
ItemBLDelegate::ItemBLDelegate(QObject *parent /*= 0*/ ) : QItemDelegate(parent) { }
ItemBLDelegate::~ItemBLDelegate() { }
 
QWidget* ItemBLDelegate::createEditor( QWidget *parent,
const QStyleOptionViewItem &style, const QModelIndex &index ) const
{
int column = index.column();
int row = index.row();
 
if (column == 0)
{
QString currentText = index.model()->data(index, Qt::EditRole).toString();
BLEditSpinBox *editor = new BLEditSpinBox(BLEditSpinBox::Breadth, parent);
editor->setFrame(false);
return editor;
}
if(column == 1)
{
QString currentText = index.model()->data(index, Qt::EditRole).toString();
BLEditSpinBox *editor = new BLEditSpinBox(BLEditSpinBox::Longitude, parent);
editor->setFrame(false);
return editor;
}
 
return QItemDelegate::createEditor(parent, style, index);
}
 
void ItemBLDelegate::setEditorData( QWidget *editor, const QModelIndex &index ) const
{
BLEditSpinBox *isEditor = qobject_cast<BLEditSpinBox *>(editor);
if (isEditor)
{
isEditor->setValueFromText(index.model()->data(index, Qt::EditRole).toString());
connect(editor, SIGNAL(valueChanged(double)), SLOT(slotValueChanged(double)));
// adding connecting
}
else
QItemDelegate::setEditorData(editor, index);
}
 
void ItemBLDelegate::setModelData( QWidget *editor, QAbstractItemModel *model, const QModelIndex &index ) const
{
BLEditSpinBox *isEditor = qobject_cast<BLEditSpinBox *>(editor);
if (isEditor)
model->setData(index, isEditor->text());
else
QItemDelegate::setModelData(editor, model, index);
}
 
void ItemBLDelegate::slotValueChanged( double d )
{
BLEditSpinBox *isEditor = qobject_cast<BLEditSpinBox *>(sender());
if (isEditor)
emit commitData(isEditor);
}
...это решение работает, но по окончании редактирования дублируется сигнал (можно ввести флаг: взводить его в slotValueChanged(), перед посылкой сигнала, а сбрасывать после обработки сигнала)
Записан
Barmaglodd
Гость
« Ответ #5 : Июнь 03, 2009, 06:38 »

Ещё стоит в setModelData disconnect делать, иначе через некоторое время работы slotValueChanged будет многократно вызываться.
Записан
vdann
Гость
« Ответ #6 : Июнь 03, 2009, 10:18 »

...вот что получилось на выходе =>
...здесь видно другую проблему в теме "Виджет, похожий на QDateTameEdit" http://www.prog.org.ru/topic_9672_0.html
« Последнее редактирование: Июнь 03, 2009, 10:30 от vdann » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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