Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: -QT- от Января 30, 2008, 21:53



Название: QTableView & QSqlTableModel - кол-во разрядов цифр для отображения
Отправлено: -QT- от Января 30, 2008, 21:53
Использую связку описанную выше плюс своего делегата QDoubleSpinBox.
При отображении цифр выводит только 7 знаков и округляет, а при редактировании показывает
столько, сколько указано в делегате и соответственно хранит в базе правильные цифры,
что за паста не понял - понял только что обман (визуальный)  ;D ;D
Посмотрел в модель там вродебы ничего не менял в виджете тоже все стандартно.
Базу держу на SQLite.

Помогите кто знает, до этого все нормально работало...


Название: Re: QTableView & QSqlTableModel - кол-во разрядов цифр для отображения
Отправлено: pastor от Января 30, 2008, 22:32
Если я не ошибаюсь, то это бага. Глянь в Task Tracker 177039


Название: Re: QTableView & QSqlTableModel - кол-во разрядов цифр для отображения
Отправлено: -QT- от Января 30, 2008, 22:36
Спасибо это было оно - бага .  :-\  >:(


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


Название: Re: QTableView & QSqlTableModel - кол-во разрядов цифр для отображения
Отправлено: -QT- от Февраля 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 или мои прямые  :) руки ?
Кто с этим сталкивался и как можно это побороть ?


Название: Re: QTableView & QSqlTableModel - кол-во разрядов цифр для отображения
Отправлено: vregess от Февраля 04, 2008, 18:14
может быть для отображения использовать метод paint твоего делегата?


Название: Re: QTableView & QSqlTableModel - кол-во разрядов цифр для отображения
Отправлено: -QT- от Февраля 04, 2008, 20:56
может быть для отображения использовать метод paint твоего делегата?
Спасибо за подсказку. Я недавно думал об этом но никогда еще не использовал.
А можно дать на водку .... ;) тфу это "подсказку" - ну типа куда ползти. Хотябы кусочек...


Название: Re: QTableView & QSqlTableModel - кол-во разрядов цифр для отображения
Отправлено: vregess от Февраля 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


Название: Re: QTableView & QSqlTableModel - кол-во разрядов цифр для отображения
Отправлено: -QT- от Февраля 26, 2008, 12:39
Мдя.... моск я свой съел почти весь  ;D
Получилось так (через делегаты)

Код:
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).


Название: Re: QTableView & QSqlTableModel - кол-во разрядов цифр для отображения
Отправлено: pastor от Февраля 26, 2008, 13:07
а буква то что означает в примере одна, а в хелпе другая и молчок более за неё нигде нет.

Читани доку по QString::arg, там приведена таблица форматов


Название: Re: QTableView & QSqlTableModel - кол-во разрядов цифр для отображения
Отправлено: -QT- от Февраля 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.
Всем большое спасибо. Тема себя исчерпала.