2 #include <QSqlQueryModel>
3 #include "comboboxdelegate.h"
4 #include "emufrontquerymodel.h"
5 #include "emufrontobject.h"
7 ComboBoxDelegate::ComboBoxDelegate(int viewColumn, QSqlQueryModel *cbmodel, int cbmodelIdColumn, int cbmodelDisplayColumn, QWidget *parent) :
8 QStyledItemDelegate(parent), viewColumn(viewColumn), cbmodel(cbmodel), cbmodelIdColumn(cbmodelIdColumn), cbmodelDisplayColumn(cbmodelDisplayColumn)
11 void ComboBoxDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
13 if (index.column() != viewColumn) {
14 QStyledItemDelegate::paint(painter, option, index);
18 // get the item id from the hosting view's model
19 int objid = index.model()->data(index, Qt::DisplayRole).toInt();
21 // find matching object from QComboBox's model
22 QModelIndex startInd = cbmodel->index(0, cbmodelIdColumn);
23 QModelIndexList indList = cbmodel->match(startInd, Qt::DisplayRole, objid);
26 QModelIndex ind = indList.empty() ?
28 cbmodel->index(indList.first().row(), cbmodelDisplayColumn);
30 QString txt = ind.isValid() ?
31 cbmodel->data(ind).toString() : "";
34 //initStyleOption(&option, index);
35 painter->drawText(option.rect, txt);
39 //QSize ComboBoxDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const { }
41 QWidget* ComboBoxDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
43 if (index.column() != viewColumn) {
44 return QStyledItemDelegate::createEditor(parent, option, index);
47 QComboBox *editor = new QComboBox(parent);
48 editor->setEditable(false);
49 editor->setModel(cbmodel);
50 editor->setModelColumn(cbmodelDisplayColumn);
51 connect(editor, SIGNAL(editingFinished()), this, SLOT(commitAndCloseEditor()));
55 void ComboBoxDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
57 if (index.column() != viewColumn) {
58 return QStyledItemDelegate::setEditorData(editor, index);
61 // set the correct item selected for the editor:
62 // get the item id from the parent view's model
63 int id = index.model()->data(index, Qt::DisplayRole).toInt();
64 QComboBox *cbox = qobject_cast<QComboBox *>(editor);
65 // create a start index from combobox model
66 QModelIndex startInd = cbmodel->index(0, cbmodelIdColumn);
67 // search an index for selected item in parent view
68 QModelIndexList indList = cbmodel->match(startInd, Qt::DisplayRole, id);
69 // if no match set no item selected
70 int ind = indList.empty() ? -1 : indList.first().row();
71 cbox->setCurrentIndex(ind);
74 void ComboBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
76 if (index.column() != viewColumn) {
77 return QStyledItemDelegate::setModelData(editor, model, index);
79 QComboBox *cbox = qobject_cast<QComboBox *>(editor);
80 if (cbox->currentIndex() == -1) return;
81 QModelIndex mi = cbmodel->index(cbox->currentIndex(), cbmodelIdColumn);
82 int id = cbmodel->data(mi).toInt();
83 model->setData(index, id);
86 void ComboBoxDelegate::commitAndCloseEditor()
88 QComboBox *editor = qobject_cast<QComboBox *>(sender());
89 emit commitData(editor);
90 emit closeEditor(editor);