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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Визуализация типа Numeric  (Прочитано 5741 раз)
Whiplash
Гость
« : Сентябрь 09, 2011, 16:06 »

Коллеги, подскажите по небольшой проблеме.
Использую БД FireBird 2.5, через драйвер QSqlFirebird. Qt 4.7.4.
При выводе в TableView полей типа numeric(18,2) незначащие нули обрезаются. Как этого избежать?

К примеру, вот такое поле:
Код:
"10:" QSqlField("SS_SUMM", qlonglong, length: 8, precision: 2, generated: yes, typeID: 8)
Как видно, precision установлен. Но если в этом поле содержится число 165,10, то вьюха его показывает как 165,1. Это мне не нравится, как можно поправить?
Вариант есть - кастовать на стороне сервера в строку ( cast(summ as varchar(18)) ), но это, так-то, бяка. Не только потому, что это костыль, но и потому, что в зависимости от типа поля у меня автоматически выбирается TextAligment для ячейки - числа выравниваются по правому краю, а строки - по левому.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Сентябрь 09, 2011, 16:28 »

Свой делегат заюзать.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Странник
Гость
« Ответ #2 : Сентябрь 09, 2011, 19:47 »

унаследоваться от QStyledItemDelegate и переопределить QString displayText(const QVariant &value, const QLocale &locale) const
Записан
Whiplash
Гость
« Ответ #3 : Сентябрь 10, 2011, 10:47 »

Точно, спасибо, так и поступлю.
Записан
Whiplash
Гость
« Ответ #4 : Сентябрь 12, 2011, 13:55 »

Унаследовался, переопределил... displayText почему-то вообще не вызывается Грустный

Вот так унаследовался и переопределил:
Код:
class MoneyDelegate : public QStyledItemDelegate
{
    Q_OBJECT

public:
    MoneyDelegate(int precision=2, QWidget *parent=0) : QStyledItemDelegate(parent), prec(precision) {}
    QString displayText (const QVariant & value, const QLocale & locale);

private:
    int prec;
};

Код:
QString MoneyDelegate::displayText(const QVariant &value, const QLocale &locale)
{
    QString str=QStyledItemDelegate::displayText(value, locale);
    if((value.type()==QVariant::Int)||
            (value.type()==QVariant::LongLong)||
            (value.type()==QVariant::ULongLong)||
            (value.type()==QVariant::UInt)||
            (value.type()==QVariant::Double)
            ){
        int dp=str.indexOf(locale.decimalPoint());
        if(dp==-1){
            //добавить decimal point
            str.append(locale.decimalPoint());
            dp=str.length()-1;
        }
        str=str.leftJustified(prec+dp+1,'0',true);
    }
    return str;
}

Вот так ставлю делегат:
Код:
QList<QTableView*> list=findChildren <QTableView*>();
    for(int i=0;i<list.count();i++){
        if(list[i]->property(queryPropertyName.toLatin1()).isValid()){
            model=new QSqlQueryModelXVis(list.at(i));
...............
            model->setQuery(query,db->db);
            list.at(i)->setModel(model);
...............

            //автоформатирование чисел под precison
            QHash<int, int> prec=model->precisions();
            QHashIterator<int, int> it(prec);
            while(it.hasNext()){
                it.next();
                list.at(i)->setItemDelegateForColumn(it.key(),new MoneyDelegate(it.value()));
            }

....................
        }
    }
Записан
Странник
Гость
« Ответ #5 : Сентябрь 12, 2011, 15:21 »

у меня реализовано так:
Код:
QString QFloatItemDelegate::displayText(const QVariant &value, const QLocale &locale) const
{
    switch (value.type())
    {
        case QVariant::Int:
        case QVariant::UInt:
        case QVariant::LongLong:
        case QVariant::ULongLong:
        case QVariant::Double:
        case QMetaType::Float:
            return locale.toString(value.toReal(), 'f', prec);

        default:
            return QStyledItemDelegate::displayText(value, locale);
    }
}

попробуйте устанавливать делегат так:
Код:
list[i]->setItemDelegateForColumn(it.key(),new MoneyDelegate(it.value(), list.at(i)));
« Последнее редактирование: Сентябрь 12, 2011, 15:25 от Странник » Записан
Whiplash
Гость
« Ответ #6 : Сентябрь 12, 2011, 16:39 »

Ну, реализация displayText почти такая же...

Спасибо за совет, но не помогло Грустный
Записан
Whiplash
Гость
« Ответ #7 : Сентябрь 12, 2011, 16:43 »

Может это быть из-за того, что у меня в модели переопределён data?
Код:
QVariant QSqlQueryModelXVis::data(const QModelIndex &item, int role) const
{
    if(visColumnsHash.contains(item.column())){
        diapVHash h=visColumnsHash[item.column()];

        QSqlQuery q=query();
        q.seek(item.row());
        double d;
        if(dataColumns.contains(item.column())){
            d=q.value(dataColumns[item.column()]).toDouble();
        }else{
            d=q.value(item.column()).toDouble();
        }

        if(!h.get(d).contains(role))return QSqlQueryModel::data(item,role);
        else return h.get(d).data(role);
    }
    return QSqlQueryModel::data(item,role);
}

Но для DisplayRole всегда QSqlQueryModel::data вызывается... Попробую проверить в это мнаправлении.
Записан
Whiplash
Гость
« Ответ #8 : Сентябрь 12, 2011, 16:45 »

Сделал так:
Код:
QVariant QSqlQueryModelXVis::data(const QModelIndex &item, int role) const
{
    return QSqlQueryModel::data(item,role);
}

Непомогло.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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