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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTableView & QSqlTableModel - кол-во разрядов цифр для отображения  (Прочитано 10592 раз)
-QT-
Гость
« : Января 30, 2008, 21:53 »

Использую связку описанную выше плюс своего делегата QDoubleSpinBox.
При отображении цифр выводит только 7 знаков и округляет, а при редактировании показывает
столько, сколько указано в делегате и соответственно хранит в базе правильные цифры,
что за паста не понял - понял только что обман (визуальный)  Смеющийся Смеющийся
Посмотрел в модель там вродебы ничего не менял в виджете тоже все стандартно.
Базу держу на SQLite.

Помогите кто знает, до этого все нормально работало...
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #1 : Января 30, 2008, 22:32 »

Если я не ошибаюсь, то это бага. Глянь в Task Tracker 177039
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
-QT-
Гость
« Ответ #2 : Января 30, 2008, 22:36 »

Спасибо это было оно - бага .  В замешательстве  Злой
Записан
-QT-
Гость
« Ответ #3 : Февраля 04, 2008, 08:51 »

Ну вот и пришло оно.  Непонимающий Светлое будущее.
http://trolltech.com/developer/task-tracker/index_html?id=177039&method=entry
Они пофиксили багу .. . .. Ага тьфу .... теперь отображается 10 знаков. Я хренею воще.
Они наверное специально издиваються ?
Для правильного округления при работе с курсами валют необходимо как минимум 4 знака
после запятой, а суммы могут быть в рублях по несколько сот миллионов. Ну как тут не плеваться а ?
Записан
-QT-
Гость
« Ответ #4 : Февраля 04, 2008, 10:07 »

Да вот ещё.
Код:
void MainWindowImpl::on_tableView_doubleClicked(QModelIndex index)
{
    EditInvoiceImpl editInvoice(this);
    QDataWidgetMapper *mapper = new QDataWidgetMapper(this);
    mapper->setModel(modelInvoice);
    mapper->setSubmitPolicy(QDataWidgetMapper::ManualSubmit);
    mapper->addMapping(editInvoice.lineEditNumberInvoice, 1);
    mapper->addMapping(editInvoice.doubleSpinBoxExchenge, 2);
    mapper->addMapping(editInvoice.doubleSpinBoxDelivery, 3);
    mapper->setCurrentModelIndex(index);
   
    if ( editInvoice.exec() == QDialog::Accepted )
        mapper->submit();
    else
        mapper->revert();
    return;
}
И получается что редактируються данные только lineEditNumberInvoice а
значения с плавающей точкой не редактируються, мутькакаятовообще ррр....ляяяя.
Это все кривая реализация doubleSpinBox или мои прямые  Улыбающийся руки ?
Кто с этим сталкивался и как можно это побороть ?
Записан
vregess
Гость
« Ответ #5 : Февраля 04, 2008, 18:14 »

может быть для отображения использовать метод paint твоего делегата?
Записан
-QT-
Гость
« Ответ #6 : Февраля 04, 2008, 20:56 »

может быть для отображения использовать метод paint твоего делегата?
Спасибо за подсказку. Я недавно думал об этом но никогда еще не использовал.
А можно дать на водку .... Подмигивающий тфу это "подсказку" - ну типа куда ползти. Хотябы кусочек...
Записан
vregess
Гость
« Ответ #7 : Февраля 04, 2008, 22:44 »

Спасибо за подсказку. Я недавно думал об этом но никогда еще не использовал.
А можно дать на водку .... Подмигивающий тфу это "подсказку" - ну типа куда ползти. Хотябы кусочек...

Ну что-то типа этого:
Код:

void MClass::paint ( QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index ) const
{
  // дотягиваемся до элемента таблицы через index и вытаскиваем из него double-значение.
  // допустим, мы положили double-значение в переменную value
  double value;
  ...
  value=...;
  drawDisplay(painter, option, option.rect, QString("%1").arg(value, 0, 'g', 15));
}

Ключевые моменты:
    void QItemDelegate::drawDisplay ( QPainter * painter, const QStyleOptionViewItem & option, const QRect & rect, const QString & text ) const

    QString QString::arg ( double a, int fieldWidth = 0, char format = 'g', int precision = -1, const QChar & fillChar = QLatin1Char( ' ' ) ) const
« Последнее редактирование: Февраля 05, 2008, 10:21 от vregess » Записан
-QT-
Гость
« Ответ #8 : Февраля 26, 2008, 12:39 »

Мдя.... моск я свой съел почти весь  Смеющийся
Получилось так (через делегаты)

Код:
void QmyDsbDelegate::paint (
        QPainter *painter,
        const QStyleOptionViewItem& option,
        const QModelIndex& index ) const {

    QString text;
    QRect rect;
    QVariant value;
    QStyleOptionViewItemV2 opt = setOptions(index, option);
    value = index.data(Qt::DisplayRole);
    text = QLocale().toString(value.toDouble(), 'f', 2);
    opt.displayAlignment = Qt::AlignRight | Qt::AlignVCenter;
    drawDisplay(painter, opt, opt.rect, text);

Вот только пока не понял что за паста text = QLocale().toString(value.toDouble(), 'f', 2);
а именно параметры, в хелпе написано только это и все - подскажите люди добрые,
не хочется использовать то чего не понимаешь  Грустный  что за 'f' двойка я подразумеваю кол-во знаков после запятой а буква
то что означает в примере одна, а в хелпе другая и молчок более за неё нигде нет.

Цитировать
QString QLocale::toString ( double i, char f = 'g', int prec = 6 ) const
This is an overloaded member function, provided for convenience.
f and prec have the same meaning as in QString::number(double, char, int).
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #9 : Февраля 26, 2008, 13:07 »

а буква то что означает в примере одна, а в хелпе другая и молчок более за неё нигде нет.

Читани доку по QString::arg, там приведена таблица форматов
« Последнее редактирование: Февраля 26, 2008, 13:37 от pastor » Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
-QT-
Гость
« Ответ #10 : Февраля 26, 2008, 13:34 »

Цитировать
QString QString::arg ( double a, int fieldWidth = 0, char format = 'g', int precision = -1, const QChar & fillChar = QLatin1Char( ' ' ) ) const
This is an overloaded member function, provided for convenience.
Argument a is formatted according to the specified format, which is 'g' by default and can be any of the following:

Format                               Meaning
______________________________________________
e             format as [-]9.9e[+|-]999
E             format as [-]9.9E[+|-]999
f              format as [-]9.9
g            use e or f format, whichever is the most concise
G            use E or f format, whichever is the most concise

With 'e', 'E', and 'f', precision is the number of digits after the decimal point. With 'g' and 'G', precision is the maximum number of significant digits (trailing zeroes are omitted).
 double d = 12.34;
 QString str = QString("delta: %1").arg(d, 0, 'E', 3);
 // str == "delta: 1.234E+01"
The '%' can be followed by an 'L', in which case the sequence is replaced with a localized representation of a. The conversion uses the default locale, set by QLocale::setDefaultLocale(). If no default locale was specified, the "C" locale is used.
Всем большое спасибо. Тема себя исчерпала.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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