Qt 4.8
qsqlrelationaldelegate.h
Go to the documentation of this file.
1 /****************************************************************************
2 **
3 ** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
4 ** Contact: http://www.qt-project.org/legal
5 **
6 ** This file is part of the QtSql module of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and Digia. For licensing terms and
14 ** conditions see http://qt.digia.com/licensing. For further information
15 ** use the contact form at http://qt.digia.com/contact-us.
16 **
17 ** GNU Lesser General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU Lesser
19 ** General Public License version 2.1 as published by the Free Software
20 ** Foundation and appearing in the file LICENSE.LGPL included in the
21 ** packaging of this file. Please review the following information to
22 ** ensure the GNU Lesser General Public License version 2.1 requirements
23 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
24 **
25 ** In addition, as a special exception, Digia gives you certain additional
26 ** rights. These rights are described in the Digia Qt LGPL Exception
27 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
28 **
29 ** GNU General Public License Usage
30 ** Alternatively, this file may be used under the terms of the GNU
31 ** General Public License version 3.0 as published by the Free Software
32 ** Foundation and appearing in the file LICENSE.GPL included in the
33 ** packaging of this file. Please review the following information to
34 ** ensure the GNU General Public License version 3.0 requirements will be
35 ** met: http://www.gnu.org/copyleft/gpl.html.
36 **
37 **
38 ** $QT_END_LICENSE$
39 **
40 ****************************************************************************/
41 
42 #ifndef QSQLRELATIONALDELEGATE_H
43 #define QSQLRELATIONALDELEGATE_H
44 
45 #ifdef QT_GUI_LIB
46 
47 #include <QtGui/qitemdelegate.h>
48 #include <QtGui/qlistview.h>
49 #include <QtGui/qcombobox.h>
50 #include <QtSql/qsqlrelationaltablemodel.h>
51 
53 
55 
56 QT_MODULE(Sql)
57 
59 {
60 public:
61 
62 explicit QSqlRelationalDelegate(QObject *aParent = 0)
63  : QItemDelegate(aParent)
64 {}
65 
67 {}
68 
69 QWidget *createEditor(QWidget *aParent,
70  const QStyleOptionViewItem &option,
71  const QModelIndex &index) const
72 {
73  const QSqlRelationalTableModel *sqlModel = qobject_cast<const QSqlRelationalTableModel *>(index.model());
74  QSqlTableModel *childModel = sqlModel ? sqlModel->relationModel(index.column()) : 0;
75  if (!childModel)
76  return QItemDelegate::createEditor(aParent, option, index);
77 
78  QComboBox *combo = new QComboBox(aParent);
79  combo->setModel(childModel);
80  combo->setModelColumn(childModel->fieldIndex(sqlModel->relation(index.column()).displayColumn()));
81  combo->installEventFilter(const_cast<QSqlRelationalDelegate *>(this));
82 
83  return combo;
84 }
85 
86 void setEditorData(QWidget *editor, const QModelIndex &index) const
87 {
88  const QSqlRelationalTableModel *sqlModel = qobject_cast<const QSqlRelationalTableModel *>(index.model());
89  QComboBox *combo = qobject_cast<QComboBox *>(editor);
90  if (!sqlModel || !combo) {
91  QItemDelegate::setEditorData(editor, index);
92  return;
93  }
94  combo->setCurrentIndex(combo->findText(sqlModel->data(index).toString()));
95 }
96 
97 void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
98 {
99  if (!index.isValid())
100  return;
101 
103  QSqlTableModel *childModel = sqlModel ? sqlModel->relationModel(index.column()) : 0;
104  QComboBox *combo = qobject_cast<QComboBox *>(editor);
105  if (!sqlModel || !childModel || !combo) {
106  QItemDelegate::setModelData(editor, model, index);
107  return;
108  }
109 
110  int currentItem = combo->currentIndex();
111  int childColIndex = childModel->fieldIndex(sqlModel->relation(index.column()).displayColumn());
112  int childEditIndex = childModel->fieldIndex(sqlModel->relation(index.column()).indexColumn());
113  sqlModel->setData(index,
114  childModel->data(childModel->index(currentItem, childColIndex), Qt::DisplayRole),
116  sqlModel->setData(index,
117  childModel->data(childModel->index(currentItem, childEditIndex), Qt::EditRole),
118  Qt::EditRole);
119 }
120 
121 };
122 
124 
126 
127 #endif // QT_GUI_LIB
128 
129 #endif // QSQLRELATIONALDELEGATE_H
T qobject_cast(QObject *object)
Definition: qobject.h:375
The QSqlRelationalTableModel class provides an editable data model for a single database table...
#define QT_END_NAMESPACE
This macro expands to.
Definition: qglobal.h:90
virtual QSqlTableModel * relationModel(int column) const
Returns a QSqlTableModel object for accessing the table for which column is a foreign key...
#define QT_MODULE(x)
Definition: qglobal.h:2783
QVariant data(int role=Qt::DisplayRole) const
Returns the data for the given role for the item referred to by the index.
#define QT_BEGIN_HEADER
Definition: qglobal.h:136
void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
Gets data from the editor widget and stores it in the specified model at the item index...
The QWidget class is the base class of all user interface objects.
Definition: qwidget.h:150
QString toString() const
Returns the variant as a QString if the variant has type() String , Bool , ByteArray ...
Definition: qvariant.cpp:2270
void setModelColumn(int visibleColumn)
Definition: qcombobox.cpp:3492
The QObject class is the base class of all Qt objects.
Definition: qobject.h:111
#define QT_BEGIN_NAMESPACE
This macro expands to.
Definition: qglobal.h:89
const QAbstractItemModel * model() const
Returns a pointer to the model containing the item that this index refers to.
The QComboBox widget is a combined button and popup list.
Definition: qcombobox.h:62
QWidget * createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
Returns the widget used to edit the item specified by index for editing.
QSqlRelation relation(int column) const
Returns the relation for the column column, or an invalid relation if no relation is set...
bool isValid() const
Returns true if this model index is valid; otherwise returns false.
The QAbstractItemModel class provides the abstract interface for item model classes.
QVariant data(const QModelIndex &item, int role=Qt::DisplayRole) const
Reimplemented Function
void setEditorData(QWidget *editor, const QModelIndex &index) const
Sets the data to be displayed and edited by the editor from the data model item specified by the mode...
void setModel(QAbstractItemModel *model)
Sets the model to be model.
Definition: qcombobox.cpp:1984
The QItemDelegate class provides display and editing facilities for data items from a model...
Definition: qitemdelegate.h:61
void installEventFilter(QObject *)
Installs an event filter filterObj on this object.
Definition: qobject.cpp:2070
The QModelIndex class is used to locate data in a data model.
The QSqlRelationalDelegate class provides a delegate that is used to display and edit data from a QSq...
quint16 index
The QSqlTableModel class provides an editable data model for a single database table.
int currentIndex
the index of the current item in the combobox.
Definition: qcombobox.h:71
The QStyleOptionViewItem class is used to describe the parameters used to draw an item in a view widg...
Definition: qstyleoption.h:539
bool setData(const QModelIndex &item, const QVariant &value, int role=Qt::EditRole)
Sets the data for the role in the item with the specified index to the value given.
#define QT_END_HEADER
Definition: qglobal.h:137
int column() const
Returns the column this model index refers to.