Go
to the documentation of this file.
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042 #ifndef QSQLRELATIONALDELEGATE_H
00043 #define QSQLRELATIONALDELEGATE_H
00044
00045 #ifdef QT_GUI_LIB
00046
00047 #include <QtGui/qitemdelegate.h>
00048 #include <QtGui/qlistview.h>
00049 #include <QtGui/qcombobox.h>
00050 #include <QtSql/qsqlrelationaltablemodel.h>
00051
00052 QT_BEGIN_HEADER
00053
00054 QT_BEGIN_NAMESPACE
00055
00056 QT_MODULE(Sql)
00057
00058 class QSqlRelationalDelegate: public QItemDelegate
00059 {
00060 public:
00061
00062 explicit QSqlRelationalDelegate(QObject *parent = 0)
00063 : QItemDelegate(parent)
00064 {}
00065
00066 ~QSqlRelationalDelegate()
00067 {}
00068
00069 QWidget *createEditor(QWidget *parent,
00070 const QStyleOptionViewItem &option,
00071 const QModelIndex &index) const
00072 {
00073 const QSqlRelationalTableModel *sqlModel = qobject_cast<const QSqlRelationalTableModel *>(index.model());
00074 QSqlTableModel *childModel = sqlModel ? sqlModel->relationModel(index.column()) : 0;
00075 if (!childModel)
00076 return QItemDelegate::createEditor(parent, option, index);
00077
00078 QComboBox *combo = new QComboBox(parent);
00079 combo->setModel(childModel);
00080 combo->setModelColumn(childModel->fieldIndex(sqlModel->relation(index.column()).displayColumn()));
00081 combo->installEventFilter(const_cast<QSqlRelationalDelegate *>(this));
00082
00083 return combo;
00084 }
00085
00086 void setEditorData(QWidget *editor, const QModelIndex &index) const
00087 {
00088 const QSqlRelationalTableModel *sqlModel = qobject_cast<const QSqlRelationalTableModel *>(index.model());
00089 QComboBox *combo = qobject_cast<QComboBox *>(editor);
00090 if (!sqlModel || !combo) {
00091 QItemDelegate::setEditorData(editor, index);
00092 return;
00093 }
00094 combo->setCurrentIndex(combo->findText(sqlModel->data(index).toString()));
00095 }
00096
00097 void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
00098 {
00099 if (!index.isValid())
00100 return;
00101
00102 QSqlRelationalTableModel *sqlModel = qobject_cast<QSqlRelationalTableModel *>(model);
00103 QSqlTableModel *childModel = sqlModel ? sqlModel->relationModel(index.column()) : 0;
00104 QComboBox *combo = qobject_cast<QComboBox *>(editor);
00105 if (!sqlModel || !childModel || !combo) {
00106 QItemDelegate::setModelData(editor, model, index);
00107 return;
00108 }
00109
00110 int currentItem = combo->currentIndex();
00111 int childColIndex = childModel->fieldIndex(sqlModel->relation(index.column()).displayColumn());
00112 int childEditIndex = childModel->fieldIndex(sqlModel->relation(index.column()).indexColumn());
00113 sqlModel->setData(index,
00114 childModel->data(childModel->index(currentItem, childColIndex), Qt::DisplayRole),
00115 Qt::DisplayRole);
00116 sqlModel->setData(index,
00117 childModel->data(childModel->index(currentItem, childEditIndex), Qt::EditRole),
00118 Qt::EditRole);
00119 }
00120
00121 };
00122
00123 QT_END_NAMESPACE
00124
00125 QT_END_HEADER
00126
00127 #endif // QT_GUI_LIB
00128
00129 #endif // QSQLRELATIONALDELEGATE_H