QStyledItemDelegate проблема с сохранением введённых данных
Когда жму энтер, или меняю фокус курсора на другую кнопку (но не на другую строку в таблице, тогда всё работает), то данные не сохраняются, при энтер вообще выделяются почему-то. setModelData не вызывается при нажатии на энтер.
sqlsuppliernumberformatdelegate.h:
#ifndef SQLSUPPLIERNUMBERFORMATDELEGATE_H
#define SQLSUPPLIERNUMBERFORMATDELEGATE_H
#include <QStyledItemDelegate>
class SqlSupplierNumberFormatDelegate : public QStyledItemDelegate {
public:
explicit SqlSupplierNumberFormatDelegate(QObject *parent = nullptr);
protected:
QString displayText(const QVariant& value, const QLocale& locale) const override;
QWidget* createEditor(QWidget *parent, const QStyleOptionViewItem& option, const QModelIndex& index) const override;
void setEditorData(QWidget *editor, const QModelIndex &index) const override;
void setModelData(QWidget *editor, QAbstractItemModel *model,
const QModelIndex &index) const override;
void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option,
const QModelIndex &index) const override;
bool eventFilter(QObject*, QEvent *event) override;
};
#endif // SQLSUPPLIERNUMBERFORMATDELEGATE_H
sqlsuppliernumberformatdelegate.cpp:
#include "sqlsuppliernumberformatdelegate.h"
#include "doublespinbox.h"
#include <QDoubleSpinBox>
#include <QEvent>
#include <QLineEdit>
#include <QValidator>
#include <QDebug>
#include <QComboBox>
SqlSupplierNumberFormatDelegate::SqlSupplierNumberFormatDelegate(QObject *parent) : QStyledItemDelegate(parent) {
}
QString SqlSupplierNumberFormatDelegate::displayText(const QVariant& value, const QLocale& locale) const {
switch(static_cast<QMetaType::Type>(value.type())){
case QMetaType::Float:
return locale.toString(value.toFloat(), 'f', 0);
case QMetaType::Double:
return locale.toString(value.toDouble(), 'f', 0);
default:
return QStyledItemDelegate::displayText(value, locale);
}
}
QWidget* SqlSupplierNumberFormatDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem& option, const QModelIndex& index) const {
DoubleSpinBox* editor = new DoubleSpinBox(parent);
return editor;
}
void SqlSupplierNumberFormatDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
double value = index.model()->data(index, Qt::EditRole).toDouble();
DoubleSpinBox *spinBox = static_cast<DoubleSpinBox*>(editor);
spinBox->setValue(value);
}
void SqlSupplierNumberFormatDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
DoubleSpinBox *spinBox = static_cast<DoubleSpinBox*>(editor);
spinBox->interpretText();
double value = spinBox->value();
model->setData(index, value, Qt::EditRole);
}
void SqlSupplierNumberFormatDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
editor->setGeometry(option.rect);
}
bool SqlSupplierNumberFormatDelegate::eventFilter(QObject*, QEvent* event) {
return event->type() == QEvent::Wheel;
}
Ответы (1 шт):
Автор решения: Глеб Труфанов
→ Ссылка
Решение состояло в ручной отправке сигналов о том, что редактирование завершено:
QWidget* SqlSupplierNumberFormatDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem& option, const QModelIndex&) const {
DoubleSpinBox* editor = new DoubleSpinBox(parent);
connect(editor, &DoubleSpinBox::editingFinished, this, &SqlSupplierNumberFormatDelegate::endEditor);
return editor;
}
Метод, отсылающий сигналы:
void SqlSupplierNumberFormatDelegate::endEditor() {
commitData(qobject_cast<DoubleSpinBox*>(sender()));
closeEditor(qobject_cast<DoubleSpinBox*>(sender()));
}