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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] QTableView форматирование значения ячейки  (Прочитано 5164 раз)
arial
Гость
« : Сентябрь 17, 2009, 12:31 »

Есть QSqlTableModel, связанная с таблицей в базе данных, одно из полей которой хранит сумму платежа в копейках. Т.е. сумма 10 рублей 25 копеек хранится в этом поле как 1025.
Мне нужно вывести данные из этой таблицы в QTableView так, чтобы сумма в ячейке выводилась в более привычном для пользователя формате, чтобы копейки были через разделитель, например: 10,25. Как это сделать? Или, хотя бы, в какую сторону копать?
« Последнее редактирование: Сентябрь 25, 2009, 08:53 от arial » Записан
f0x
Гость
« Ответ #1 : Сентябрь 17, 2009, 13:05 »

один из вариантов написать свой делегат и переопределить в нем метод  paint.
а там русуй как тебе угодно...
Записан
arial
Гость
« Ответ #2 : Сентябрь 25, 2009, 08:53 »

Если кому интересно - написал делегат по совету alFoX:

currency_item_editor.h:
Код
C++ (Qt)
#include <QItemDelegate>
 
class CurrencyItemEditor : public QItemDelegate
{
Q_OBJECT
 
public:
CurrencyItemEditor(QObject *parent);
~CurrencyItemEditor();
 
QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;
void setEditorData(QWidget *parent, const QModelIndex &index) const;
void setModelData(QWidget *parent, QAbstractItemModel *model, const QModelIndex &index) const;
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex & index ) const;
 
private:
 
};

currency_item_editor.cpp:
Код
C++ (Qt)
#include "currency_item_editor.h"
#include "limits.h"
#include "math.h"
 
#include <QApplication>
#include <QtCore>
#include <QDoubleSpinBox>
#include <QPainter>
#include <QStyle>
 
CurrencyItemEditor::CurrencyItemEditor(QObject *parent)
: QItemDelegate(parent)
{
}
 
CurrencyItemEditor::~CurrencyItemEditor()
{
}
 
QWidget *CurrencyItemEditor::createEditor(QWidget *parent, const QStyleOptionViewItem &/* option */, const QModelIndex &/* index */) const
{
QDoubleSpinBox *editor = new QDoubleSpinBox(parent);
editor->setMaximum(floor(static_cast<double>(INT_MAX) / 100 + 0.5));
editor->setMinimum(floor(static_cast<double>(INT_MIN) / 100 + 0.5));
editor->setAlignment(Qt::AlignRight);
return editor;
}
 
void CurrencyItemEditor::setEditorData(QWidget *parent, const QModelIndex &index) const
{
double value = index.model()->data(index).toDouble() / 100;
QDoubleSpinBox *editor = static_cast<QDoubleSpinBox*>(parent);
editor->setValue(value);
}
 
void CurrencyItemEditor::setModelData(QWidget *parent, QAbstractItemModel *model, const QModelIndex &index) const
{
QDoubleSpinBox *editor = static_cast<QDoubleSpinBox*>(parent);
editor->interpretText();
int value = static_cast<int>(floor(editor->value() * 100 + 0.5));
model->setData(index, value);
}
 
void CurrencyItemEditor::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex & index ) const
{
   if (option.state & QStyle::State_Selected) {
       painter->fillRect(option.rect, option.palette.highlight());
       painter->setPen(option.palette.highlightedText().color());
   } else {
       painter->setPen(option.palette.text().color());
   }
 
   double value = index.model()->data(index).toDouble() / 100;
   painter->drawText(option.rect, QString("%L1\t").arg(value, 0, 'f', 2), QTextOption(Qt::AlignRight | Qt::AlignVCenter));
 
   if (option.state & QStyle::State_HasFocus) {
       QStyleOptionFocusRect optionFocusRect;
       optionFocusRect.QStyleOption::operator = (option);
       optionFocusRect.rect = option.rect;
       optionFocusRect.state |= QStyle::State_KeyboardFocusChange;
       QPalette::ColorGroup colorgroup = (option.state & QStyle::State_Enabled)
                  ? QPalette::Normal
                  : QPalette::Disabled;
       option.palette.color(colorgroup, (option.state & QStyle::State_Selected)
                                         ? QPalette::Highlight
                                         : QPalette::Background );
       QApplication::style()->drawPrimitive(QStyle::PE_FrameFocusRect, &optionFocusRect, painter);
   }
}
« Последнее редактирование: Сентябрь 25, 2009, 15:48 от arial » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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