crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> QTableView, QDoubleSpinBox в роли delegate, Потеря точности
kamikaze
  опции профиля:
сообщение 29.7.2009, 18:30
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 4
Регистрация: 15.5.2009
Пользователь №: 754

Спасибо сказали: 0 раз(а)




Репутация:   0  


Такая вот проблема: В QTableView на колонку вешается собственный delegate, который в роли редактора использует QDoubleSpinBox. В момент редактирования кол-во знаков после запятой в норме. Как только поле теряет фокус - отображается только целая часть и в базу (через QSqlRelationalTableModel) сохраняется тоже только целая часть. Как мне получить точные значения при отображении?

Delegate:
Раскрывающийся текст
#include <QDoubleSpinBox>
#include "qrbrealeditdelegate.h"

QRBRealEditDelegate::QRBRealEditDelegate(QObject *)
{
    this->setDecimals(8);
}

QWidget *QRBRealEditDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &/* option */, const QModelIndex &/* index */) const
{
    QDoubleSpinBox *editor = new QDoubleSpinBox(parent);
    editor->setDecimals(this->decimals);

    return editor;
}

void QRBRealEditDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
    double value = index.model()->data(index, Qt::EditRole).toDouble();
    QDoubleSpinBox *realEdit = static_cast<QDoubleSpinBox*>(editor);

    realEdit->setValue(value);
}

void QRBRealEditDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
    QDoubleSpinBox *realEdit = static_cast<QDoubleSpinBox*>(editor);
    double value;

    value = realEdit->value();

    model->setData(index, value, Qt::EditRole);
}

void QRBRealEditDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &/* index */) const
{
    editor->setGeometry(option.rect);
}

void QRBRealEditDelegate::setDecimals(int decimals)
{
    this->decimals = decimals;
}

int QRBRealEditDelegate::getDecimals()
{
    return this->decimals;
}


установка делегата в QTableView:

Раскрывающийся текст
void CurrencyCourseList::populateList(QTableView *tableView)
{
    QSqlRelationalTableModel *model = new QSqlRelationalTableModel;

    model->setTable("currency_rate");
    model->setSort(1, Qt::AscendingOrder);
    model->setEditStrategy(QSqlTableModel::OnRowChange);
    model->setRelation(2, QSqlRelation("currency", "id", "code"));
    model->select();

    model->setHeaderData(0, Qt::Horizontal, QObject::trUtf8("ID"));
    model->setHeaderData(1, Qt::Horizontal, QObject::trUtf8("Datums"));
    model->setHeaderData(2, Qt::Horizontal, QObject::trUtf8("Valūta"));
    model->setHeaderData(3, Qt::Horizontal, QObject::trUtf8("Kurss"));

    tableView->setModel(model);
    tableView->setColumnHidden(0, true);
    tableView->setItemDelegateForColumn(1, this->date_delegate);
    tableView->setItemDelegateForColumn(2, new QRBSqlRelationalDelegate(tableView));
    tableView->setItemDelegateForColumn(3, new QRBRealEditDelegate(tableView));
}


Сообщение отредактировал Litkevich Yuriy - 29.7.2009, 20:40
Причина редактирования: по многу раз "отправить" не нажимай
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гость_kamikaze_*_*
сообщение 29.7.2009, 18:55
Сообщение #2





Гости








    


тысяча извинений - в базе сохраняется правильно, проблема только в отображении
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 29.7.2009, 18:56
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Что-то много "Таких вот проблем". :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 29.7.2009, 20:41
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


kamikaze, можно в делегате роль отображения обрабатывать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kamikaze
  опции профиля:
сообщение 25.8.2009, 14:47
Сообщение #5


Новичок


Группа: Новичок
Сообщений: 4
Регистрация: 15.5.2009
Пользователь №: 754

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 29.7.2009, 20:41) *
kamikaze, можно в делегате роль отображения обрабатывать.


Спасибо, я так понял это про "paint" ?
До сих пор мучаюсь...
Проблема вот в чём:
QString value = index.model()->data(index, Qt::DisplayRole).toString();
    painter->drawText(option.rect, value);


После этого текст отображается, но без таких отступов как в других item-ах. И ко всему прочему - стиль ячейки отличается от других. Пробовал ещё так:
QStyleOptionViewItemV4 opt = option;
initStyleOption(&opt, index);
QStyle *style = QApplication::style();
QPalette palette;

style->drawItemText(painter, option.rect, 0, palette, true, "yoooooy");


но результат тот же.

Вопрос: как заполучить отступы идентичные и стиль? Хотябы ссылку на пример.
(Неужели это такая редкая задача, отображать double из базы данных в QTableView, что нигде не найти решения?)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kamikaze
  опции профиля:
сообщение 2.9.2009, 12:31
Сообщение #6


Новичок


Группа: Новичок
Сообщений: 4
Регистрация: 15.5.2009
Пользователь №: 754

Спасибо сказали: 0 раз(а)




Репутация:   0  


Нашёл интересную вещь. Если установить в базе тип колонки не "REAL", а "NUMERIC", то данные отображаются корректно. С "REAL" - только целая часть, но в модели лежит QVariant с типом "float", а значение "4", а не "4.55". Баг?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.1.2025, 20:17