LINUX.ORG.RU

Редактирование чисел в QTableView.

 , , ,


0

2

У меня есть QTableView, который заполняется с помощью QSqlTableModel из Sqlite-базы. В таблице есть числовые поля (были объявлены как numeric). Хотелось бы, чтобы в QTableView для их правки использовался QDoubleSpinBox. Примеры в сети указывают на то, что нужно создавать свой класс, унаследованный от Q(Styled)ItemDelegate и делать все ручками. Однако, читая документацию получаем:

The standard views provided with Qt use instances of QItemDelegate to provide editing facilities. This default implementation of the delegate interface renders items in the usual style for each of the standard views: QListView, QTableView, and QTreeView. All the standard roles are handled by the default delegate used by the standard views. The way these are interpreted is described in the QItemDelegate documentation.

Т.е. стандартный QTableView использует дефолтный QItemDelegate, если не указано иное.

When editing data in an item view, QItemDelegate provides an editor widget, which is a widget that is placed on top of the view while editing takes place. Editors are created with a QItemEditorFactory; a default static instance provided by QItemEditorFactory is installed on all item delegates.

Т.е. для редактирования QItemDelegate использует дефолтный QItemEditorFactory, если не указано иное.

The standard factory implementation provides editors for a variety of data types. These are created whenever a delegate needs to provide an editor for data supplied by a model. The following table shows the relationship between types and the standard editors provided. ... double: QDoubleSpinBox

Т.е. дефолтная реализация QItemEditorFactory должна предоставлять QDoubleSpinBox для редактирования данных с типом Double.

Где фундаментальная ошибка в моих рассуждениях и почему на самом деле такого не происходит? На всякий случай пример моего кода будет в первом комментарии.

★★★

На текущий момент код выглядит так:

compModel.setTable(«tbl»);
compModel.setEditStrategy(QSqlTableModel::OnManualSubmit);
ui->compView->setModel(&compModel);
ui->compView->setItemDelegate(new QItemDelegate(ui->compView));
compModel.select();

//ЧТО ЗА ХЕРНЯ? Почему я не могу форматировать комментарии LORCODE'ом?

unikoid ★★★
() автор топика
Ответ на: комментарий от seed_stil

Ох ты ж! Полгода назад как-то это все лучше было! Хоть бы задокументировали где.

unikoid ★★★
() автор топика

Итак, покурив и поразбиравшись осознал:
Я все правильно понял и Qt сам умеет использовать QDoubleSpinBox в QTableView при работе с SQL.
Проблема оказалась в SQLite. У меня столбец в базе был объявлен как NUMERIC, а лежали в нем целые. Как выяснилось, в SQLite это обозначает примерно следующее: если можно сохранить как целое - сохраняем как целое, можно как float - храним так, если нет - храним как текст. Соотв. целые числа сохранялись как INTEGER, Qt вытаскивал их как QVariant(qulonglong), а для него стандартный QItemEditorFactory использует QLineEdit.
Такие дела. Ушел эмулировать нормальный Numeric (точнее, fixed point) на INTEGER (мне нужна работа с денежными суммами) и писать Delegate для их отображения и редактирования.

unikoid ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.