Страницы

Поиск по вопросам

пятница, 7 февраля 2020 г.

Qt Баг с точностью после запятой в таблицах

#cpp #qt #mvc #tableview


Привет Всем, столкнулся с такой проблемой, во всех таблицах, базовых примерах да
и вообще Qt почему то допускает писать в таблицах значения только с точностью два знака
после запятой, не более. 
Как пример возьмем стандартный пример в Qt sqlbrowser.
Запускаем пример, заходим, видим в дереве 2 элемента Movies и Names, заходим в Movies,
далее в колонке Rating видим значения:
Например: 8,1
Нужно: 8,0001  , но больше двух цифр не вбивается после запятой, так во всех примерах QT.
Вопрос как данную проблему исправить, основываясь на этом примере?
Желательно привести данный участок кода, который разрешит эту проблему.
    


Ответы

Ответ 1



Это не баг, а просто соглашение, принятое в Qt по умолчанию для чисел с плавающей точкой. В одной задаче нужно показывать один знак после запятой, в другой все девяносто девять. Если не подходит количество, принятое по умолчанию, то создают собственный делегат - виджет, который предоставляет пользователю не только альтернативный вид данных в таблице, но и их редактирование. Файл delegate.h: #ifndef DELEGATE_H #define DELEGATE_H #include class Delegate : public QStyledItemDelegate { Q_OBJECT public: Delegate(QObject *parent = Q_NULLPTR); virtual QString displayText(const QVariant &value , const QLocale &locale) const; virtual QWidget *createEditor(QWidget *parent , const QStyleOptionViewItem &option , const QModelIndex &index) const; virtual void setEditorData(QWidget *editor , const QModelIndex &index) const; virtual void setModelData(QWidget *editor , QAbstractItemModel *model , const QModelIndex &index) const; }; #endif Файл delegate.cpp: #include "delegate.h" #include Delegate::Delegate(QObject *parent) : QStyledItemDelegate(parent) {} QString Delegate::displayText(const QVariant &value , const QLocale &locale) const { Q_UNUSED(locale); // Шесть знаков после запятой. return QString::number(value.toDouble(), 'f', 6); // Если нет необходимости в том, чтобы поле таблицы // содержало заканчивающие числа нули, то вместо // аргумента `f` нужно указать значение `g`. // return QString::number(value.toDouble(), 'g', 6); } QWidget *Delegate::createEditor(QWidget *parent , const QStyleOptionViewItem &option , const QModelIndex &index) const { Q_UNUSED(option); Q_UNUSED(index); QDoubleSpinBox *editor = new QDoubleSpinBox(parent); // Шесть знаков после запятой. editor->setDecimals(6); return editor; } void Delegate::setEditorData(QWidget *editor , const QModelIndex &index) const { QDoubleSpinBox *sbox = qobject_cast(editor); if(sbox != Q_NULLPTR) { sbox->setValue(index.model() ->data(index, Qt::EditRole).toDouble()); } } void Delegate::setModelData(QWidget *editor , QAbstractItemModel *model , const QModelIndex &index) const { QDoubleSpinBox *sbox = qobject_cast(editor); if(sbox != Q_NULLPTR) { model->setData(index, sbox->value(), Qt::EditRole); } } В методе Delegate::createEditor() строка editor->setDecimals(6) установит для делегата шесть знаков после запятой. Установка делегата в виджет таблицы: QTableView *view = new QTableView(); view->setModel(model); view->setItemDelegate(new Delegate(view));

Комментариев нет:

Отправить комментарий