5#ifndef QSQLRELATIONALDELEGATE_H
6#define QSQLRELATIONALDELEGATE_H
8#include <QtSql/qtsqlglobal.h>
14#include <QtWidgets/qstyleditemdelegate.h>
15#if QT_CONFIG(listview)
16#include <QtWidgets/qlistview.h>
18#if QT_CONFIG(combobox)
19#include <QtWidgets/qcombobox.h>
21#include <QtSql/qsqldriver.h>
22#include <QtSql/qsqlrelationaltablemodel.h>
23#include <QtCore/qmetaobject.h>
26class QSqlRelationalDelegate :
public QStyledItemDelegate
28 static int fieldIndex(
const QSqlTableModel *
const model,
29 const QSqlDriver *
const driver,
30 const QString &fieldName)
32 const QString stripped = driver->isIdentifierEscaped(fieldName, QSqlDriver::FieldName)
33 ? driver->stripDelimiters(fieldName, QSqlDriver::FieldName)
35 return model->fieldIndex(stripped);
40 explicit QSqlRelationalDelegate(QObject *aParent =
nullptr)
41 : QStyledItemDelegate(aParent)
44 ~QSqlRelationalDelegate()
47 QWidget *createEditor(QWidget *aParent,
48 const QStyleOptionViewItem &option,
49 const QModelIndex &index)
const override
51 const QSqlRelationalTableModel *sqlModel = qobject_cast<
const QSqlRelationalTableModel *>(index.model());
52 QSqlTableModel *childModel = sqlModel ? sqlModel->relationModel(index.column()) :
nullptr;
54 return QStyledItemDelegate::createEditor(aParent, option, index);
55 const QSqlDriver *
const driver = childModel->database().driver();
57 QComboBox *combo =
new QComboBox(aParent);
58 combo->setModel(childModel);
59 combo->setModelColumn(fieldIndex(childModel, driver,
60 sqlModel->relation(index.column()).displayColumn()));
61 combo->installEventFilter(
const_cast<QSqlRelationalDelegate *>(
this));
66 void setEditorData(QWidget *editor,
const QModelIndex &index)
const override
71 if (qobject_cast<QComboBox *>(editor)) {
75 QVariant v = index.data(Qt::DisplayRole);
76 const QByteArray n = editor->metaObject()->userProperty().name();
79 v = QVariant(editor->property(n.data()).metaType());
80 editor->setProperty(n.data(), v);
84 QStyledItemDelegate::setEditorData(editor, index);
87void setModelData(QWidget *editor, QAbstractItemModel *model,
const QModelIndex &index)
const override
92 QSqlRelationalTableModel *sqlModel = qobject_cast<QSqlRelationalTableModel *>(model);
93 QSqlTableModel *childModel = sqlModel ? sqlModel->relationModel(index.column()) :
nullptr;
94 QComboBox *combo = qobject_cast<QComboBox *>(editor);
95 if (!sqlModel || !childModel || !combo) {
96 QStyledItemDelegate::setModelData(editor, model, index);
99 const QSqlDriver *
const driver = childModel->database().driver();
101 int currentItem = combo->currentIndex();
102 int childColIndex = fieldIndex(childModel, driver,
103 sqlModel->relation(index.column()).displayColumn());
104 int childEditIndex = fieldIndex(childModel, driver,
105 sqlModel->relation(index.column()).indexColumn());
106 sqlModel->setData(index,
107 childModel->data(childModel->index(currentItem, childColIndex), Qt::DisplayRole),
109 sqlModel->setData(index,
110 childModel->data(childModel->index(currentItem, childEditIndex), Qt::EditRole),
QT_REQUIRE_CONFIG(sqlmodel)