From 24192df5d674dd7277d6bfbc71cb234dd2173ddf Mon Sep 17 00:00:00 2001 From: Bent Witthold Date: Sat, 14 Mar 2026 09:35:42 +0100 Subject: [PATCH] Using the new SpinBoxDelegate in int and double columns even if the cell is empty. --- CMakeLists.txt | 1 + mainwindow.cpp | 11 +++++ widgets/controls/spinboxdelegate.cpp | 69 ++++++++++++++++++++++++++++ widgets/controls/spinboxdelegate.h | 27 +++++++++++ 4 files changed, 108 insertions(+) create mode 100644 widgets/controls/spinboxdelegate.cpp create mode 100644 widgets/controls/spinboxdelegate.h diff --git a/CMakeLists.txt b/CMakeLists.txt index e9a8733..de0866b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -36,6 +36,7 @@ if(${QT_VERSION_MAJOR} GREATER_EQUAL 6) views/itemdetailmapper.h views/itemdetailmapper.cpp widgets/controls/comboboxdelegate.h widgets/controls/comboboxdelegate.cpp widgethelper.h widgethelper.cpp + widgets/controls/spinboxdelegate.h widgets/controls/spinboxdelegate.cpp ) # Define target properties for Android with Qt 6 as: # set_property(TARGET ${TARGET_APP} APPEND PROPERTY QT_ANDROID_PACKAGE_SOURCE_DIR diff --git a/mainwindow.cpp b/mainwindow.cpp index 5f69403..514c98c 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -18,6 +18,7 @@ #include "model/metadata.h" #include "model/tablemodel.h" #include "widgets/controls/comboboxdelegate.h" +#include "widgets/controls/spinboxdelegate.h" static QStandardPaths::StandardLocation standardLocation = QStandardPaths::HomeLocation; static QString updateTextClean = "Do you want to update the application now?"; @@ -343,6 +344,16 @@ void MainWindow::setupModelViews() { // ui->tableView->setModel(m_tableModel.get()); m_proxyModel = m_core->getSortFilterModel(); + // TODO iterate over INT_ROLES and DOUBLE_ROLES to set spinbox delegate + /// setting number delegates to combo boxes + SpinboxDelegate* spinboxDelegate = new SpinboxDelegate(this); + const int amountColumn = GET_COLUMN_FOR_ROLE(AmountRole); + ui->tableView->setItemDelegateForColumn(amountColumn, spinboxDelegate); + const int factorColumn = GET_COLUMN_FOR_ROLE(FactorRole); + ui->tableView->setItemDelegateForColumn(factorColumn, spinboxDelegate); + + // TODO iterate over TYPE_ROLES to set combobox delegate + /// setting type delegates to combo boxes const int typeColumn = GET_COLUMN_FOR_ROLE(TypeRole); ComboboxDelegate* shareTypeDelegate = new ComboboxDelegate(TYPES, this); ui->tableView->setItemDelegateForColumn(typeColumn, shareTypeDelegate); diff --git a/widgets/controls/spinboxdelegate.cpp b/widgets/controls/spinboxdelegate.cpp new file mode 100644 index 0000000..8e3eb8b --- /dev/null +++ b/widgets/controls/spinboxdelegate.cpp @@ -0,0 +1,69 @@ +#include "spinboxdelegate.h" + +#include + +#include "model/metadata.h" + +SpinboxDelegate::SpinboxDelegate(QObject* parent) + : QStyledItemDelegate(parent) {} + +void SpinboxDelegate::paint(QPainter* painter, + const QStyleOptionViewItem& option, + const QModelIndex& index) const { + QStyledItemDelegate::paint(painter, option, index); +} + +QSize SpinboxDelegate::sizeHint(const QStyleOptionViewItem& option, + const QModelIndex& index) const { + return QStyledItemDelegate::sizeHint(option, index); +} + +QWidget* SpinboxDelegate::createEditor(QWidget* parent, + const QStyleOptionViewItem& /*option*/, + const QModelIndex& index) const { + const QAbstractItemModel* localModel = index.model(); + QString headerText = localModel->headerData(index.column(), Qt::Horizontal).toString(); + + const UserRoles role = GET_ROLE_FOR_COLUMN(index.column()); + const bool isInt = INT_ROLES.contains(role); + if (isInt) { + QSpinBox* editor = new QSpinBox(parent); + editor->setMinimum(0); + editor->setMaximum(23000); + return editor; + } else { + QDoubleSpinBox* editor = new QDoubleSpinBox(parent); + editor->setMinimum(0); + editor->setMaximum(23000); + return editor; + } + // return QStyledItemDelegate::createEditor(parent, option, index); +} + +void SpinboxDelegate::setEditorData(QWidget* editor, const QModelIndex& index) const { + // Get the value via index of the Model + const QAbstractItemModel* localModel = index.model(); + QString headerText = localModel->headerData(index.column(), Qt::Horizontal).toString(); + + const UserRoles role = GET_ROLE_FOR_COLUMN(index.column()); + const bool isInt = INT_ROLES.contains(role); + if (isInt) { + int value = index.model()->data(index, Qt::EditRole).toInt(); + // Put the value into the SpinBox + QSpinBox* spinbox = static_cast(editor); + spinbox->setValue(value); + } else { + // Put the value into the SpinBox + qreal value = index.model()->data(index, Qt::EditRole).toReal(); + QDoubleSpinBox* spinbox = static_cast(editor); + spinbox->setValue(value); + } + + // QStyledItemDelegate::setEditorData(editor, index); +} + +void SpinboxDelegate::setModelData(QWidget* editor, + QAbstractItemModel* model, + const QModelIndex& index) const { + QStyledItemDelegate::setModelData(editor, model, index); +} diff --git a/widgets/controls/spinboxdelegate.h b/widgets/controls/spinboxdelegate.h new file mode 100644 index 0000000..a5e9920 --- /dev/null +++ b/widgets/controls/spinboxdelegate.h @@ -0,0 +1,27 @@ +#ifndef SPINBOXDELEGATE_H +#define SPINBOXDELEGATE_H + +#include + +class SpinboxDelegate : public QStyledItemDelegate { + // TODO move source code files into subfolder "widgets/delegate" + Q_OBJECT + public: + explicit SpinboxDelegate(QObject* parent = nullptr); + + /// QAbstractItemDelegate interface + public: + void paint(QPainter* painter, + const QStyleOptionViewItem& option, + const QModelIndex& index) const override; + QSize sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) 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; +}; + +#endif // SPINBOXDELEGATE_H