CopperSpice API  1.9.1
QSqlRelationalTableModel Class Reference

Provides an editable data model for a single database table, with foreign key support. More...

Inheritance diagram for QSqlRelationalTableModel:
QSqlTableModel QSqlQueryModel QAbstractTableModel QAbstractItemModel QObject

Public Types

enum  JoinMode
 
- Public Types inherited from QSqlTableModel
enum  EditStrategy
 

Public Slots

void revertRow (int row)
 
- Public Slots inherited from QSqlTableModel
void revert ()
 
void revertAll ()
 
virtual bool select ()
 
bool submit ()
 
bool submitAll ()
 
- Public Slots inherited from QAbstractItemModel
virtual void revert ()
 
virtual bool submit ()
 
- Public Slots inherited from QObject
void deleteLater ()
 

Public Methods

 QSqlRelationalTableModel (QObject *parent=nullptr, QSqlDatabase db=QSqlDatabase ())
 
virtual ~QSqlRelationalTableModel ()
 
void clear () override
 
QVariant data (const QModelIndex &index, int role=Qt::DisplayRole) const override
 
QSqlRelation relation (int column) const
 
virtual QSqlTableModelrelationModel (int column) const
 
bool removeColumns (int column, int count, const QModelIndex &parent=QModelIndex ()) override
 
bool select () override
 
bool setData (const QModelIndex &index, const QVariant &value, int role=Qt::EditRole) override
 
void setJoinMode (QSqlRelationalTableModel::JoinMode joinMode)
 
virtual void setRelation (int column, const QSqlRelation &relation)
 
void setTable (const QString &tableName) override
 
- Public Methods inherited from QSqlTableModel
 QSqlTableModel (QObject *parent=nullptr, QSqlDatabase db=QSqlDatabase ())
 
virtual ~QSqlTableModel ()
 
void clear () override
 
QVariant data (const QModelIndex &index, int role=Qt::DisplayRole) const override
 
QSqlDatabase database () const
 
EditStrategy editStrategy () const
 
int fieldIndex (const QString &fieldName) const
 
QString filter () const
 
Qt::ItemFlags flags (const QModelIndex &index) const override
 
QVariant headerData (int section, Qt::Orientation orientation, int role=Qt::DisplayRole) const override
 
bool insertRecord (int row, const QSqlRecord &record)
 
bool insertRows (int row, int count, const QModelIndex &parent=QModelIndex ()) override
 
bool isDirty (const QModelIndex &index) const
 
QSqlIndex primaryKey () const
 
bool removeColumns (int column, int count, const QModelIndex &parent=QModelIndex ()) override
 
bool removeRows (int row, int count, const QModelIndex &parent=QModelIndex ()) override
 
virtual void revertRow (int row)
 
int rowCount (const QModelIndex &parent=QModelIndex ()) const override
 
bool setData (const QModelIndex &index, const QVariant &value, int role=Qt::EditRole) override
 
virtual void setEditStrategy (EditStrategy strategy)
 
virtual void setFilter (const QString &filter)
 
bool setRecord (int row, const QSqlRecord &record)
 
virtual void setSort (int column, Qt::SortOrder order)
 
void sort (int column, Qt::SortOrder order) override
 
QString tableName () const
 
- Public Methods inherited from QSqlQueryModel
 QSqlQueryModel (QObject *parent=nullptr)
 
virtual ~QSqlQueryModel ()
 
bool canFetchMore (const QModelIndex &parent=QModelIndex ()) const override
 
int columnCount (const QModelIndex &index=QModelIndex ()) const override
 
void fetchMore (const QModelIndex &parent=QModelIndex ()) override
 
bool insertColumns (int column, int count, const QModelIndex &parent=QModelIndex ()) override
 
QSqlError lastError () const
 
QSqlQuery query () const
 
QSqlRecord record () const
 
QSqlRecord record (int row) const
 
bool setHeaderData (int section, Qt::Orientation orientation, const QVariant &value, int role=Qt::EditRole) override
 
void setQuery (const QSqlQuery &query)
 
void setQuery (const QString &query, const QSqlDatabase &db=QSqlDatabase ())
 
- Public Methods inherited from QAbstractTableModel
 QAbstractTableModel (QObject *parent=nullptr)
 
 ~QAbstractTableModel ()
 
bool dropMimeData (const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) override
 
QModelIndex index (int row, int column, const QModelIndex &parent=QModelIndex ()) const override
 
QObjectparent () const
 
QModelIndex sibling (int row, int column, const QModelIndex &index) const override
 
- Public Methods inherited from QAbstractItemModel
 QAbstractItemModel (QObject *parent=nullptr)
 
virtual ~QAbstractItemModel ()
 
virtual QModelIndex buddy (const QModelIndex &index) const
 
virtual bool canDropMimeData (const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) const
 
bool hasIndex (int row, int column, const QModelIndex &parent=QModelIndex ()) const
 
bool insertColumn (int column, const QModelIndex &parent=QModelIndex ())
 
bool insertRow (int row, const QModelIndex &parent=QModelIndex ())
 
virtual QMap< int, QVariantitemData (const QModelIndex &index) const
 
virtual QModelIndexList match (const QModelIndex &start, int role, const QVariant &value, int hits=1, Qt::MatchFlags flags=Qt::MatchFlags (Qt::MatchStartsWith|Qt::MatchWrap)) const
 
virtual QMimeDatamimeData (const QModelIndexList &indexes) const
 
virtual QStringList mimeTypes () const
 
bool moveColumn (const QModelIndex &sourceParent, int sourceColumn, const QModelIndex &destinationParent, int destinationChild)
 
virtual bool moveColumns (const QModelIndex &sourceParent, int sourceColumn, int count, const QModelIndex &destinationParent, int destinationChild)
 
bool moveRow (const QModelIndex &sourceParent, int sourceRow, const QModelIndex &destinationParent, int destinationChild)
 
virtual bool moveRows (const QModelIndex &sourceParent, int sourceRow, int count, const QModelIndex &destinationParent, int destinationChild)
 
QObjectparent () const
 
bool removeColumn (int column, const QModelIndex &parent=QModelIndex ())
 
bool removeRow (int row, const QModelIndex &parent=QModelIndex ())
 
virtual QMultiHash< int, QStringroleNames () const
 
virtual bool setItemData (const QModelIndex &index, const QMap< int, QVariant > &roles)
 
virtual QSize span (const QModelIndex &index) const
 
virtual Qt::DropActions supportedDragActions () const
 
virtual Qt::DropActions supportedDropActions () const
 
- Public Methods inherited from QObject
 QObject (QObject *parent=nullptr)
 
 ~QObject ()
 
bool blockSignals (bool block)
 
const QList< QObject * > & children () const
 
bool connect (const QObject *sender, const QString &signalMethod, const QString &location, const QString &slotMethod, Qt::ConnectionType type=Qt::AutoConnection)
 
bool connect (const QObject *sender, const QString &signalMethod, const QString &slotMethod, Qt::ConnectionType type=Qt::AutoConnection)
 
bool disconnect (const QObject *receiver, const QString &slotMethod=QString ()) const
 
bool disconnect (const QString &signalMethod, const QString &location, const QObject *receiver=nullptr, const QString &slotMethod=QString ()) const
 
bool disconnect (const QString &signalMethod=QString (), const QObject *receiver=nullptr, const QString &slotMethod=QString ()) const
 
void dumpObjectInfo ()
 
void dumpObjectTree ()
 
QList< QStringdynamicPropertyNames () const
 
virtual bool event (QEvent *event)
 
virtual bool eventFilter (QObject *watched, QEvent *event)
 
template<typename T >
findChild (const QString &childName=QString ()) const
 
template<class T >
QList< T > findChildren (const QRegularExpression &regExp, Qt::FindChildOptions options=Qt::FindChildrenRecursively) const
 
template<class T >
QList< T > findChildren (const QString &childName=QString (), Qt::FindChildOptions options=Qt::FindChildrenRecursively) const
 
bool inherits (const QString &className) const
 
void installEventFilter (QObject *filterObj)
 
bool isWidgetType () const
 
bool isWindowType () const
 
void killTimer (int id)
 
const QMetaObjectmetaObject () const
 
void moveToThread (QThread *targetThread)
 
QString objectName () const
 
QObject * parent () const
 
template<class T = QVariant>
property (const QString &name) const
 
void removeEventFilter (QObject *obj)
 
void setObjectName (const QString &name)
 
void setParent (QObject *parent)
 
bool setProperty (const QString &name, const QVariant &value)
 
bool signalsBlocked () const
 
int startTimer (int interval, Qt::TimerType timerType=Qt::CoarseTimer)
 
QThreadthread () const
 

Protected Methods

bool insertRowIntoTable (const QSqlRecord &values) override
 
QString orderByClause () const override
 
QString selectStatement () const override
 
bool updateRowInTable (int row, const QSqlRecord &values) override
 
- Protected Methods inherited from QSqlTableModel
virtual bool deleteRowFromTable (int row)
 
QModelIndex indexInQuery (const QModelIndex &item) const override
 
void setPrimaryKey (const QSqlIndex &key)
 
void setQuery (const QSqlQuery &query)
 
- Protected Methods inherited from QSqlQueryModel
virtual void queryChange ()
 
void setLastError (const QSqlError &error)
 
- Protected Methods inherited from QAbstractItemModel
void beginInsertColumns (const QModelIndex &parent, int first, int last)
 
void beginInsertRows (const QModelIndex &parent, int first, int last)
 
bool beginMoveColumns (const QModelIndex &sourceParent, int sourceFirst, int sourceLast, const QModelIndex &destinationParent, int destinationColumn)
 
bool beginMoveRows (const QModelIndex &sourceParent, int sourceFirst, int sourceLast, const QModelIndex &destinationParent, int destinationRow)
 
void beginRemoveColumns (const QModelIndex &parent, int first, int last)
 
void beginRemoveRows (const QModelIndex &parent, int first, int last)
 
void beginResetModel ()
 
void changePersistentIndex (const QModelIndex &from, const QModelIndex &to)
 
void changePersistentIndexList (const QModelIndexList &from, const QModelIndexList &to)
 
QModelIndex createIndex (int row, int column, quintptr id) const
 
QModelIndex createIndex (int row, int column, void *data=nullptr) const
 
void endInsertColumns ()
 
void endInsertRows ()
 
void endMoveColumns ()
 
void endMoveRows ()
 
void endRemoveColumns ()
 
void endRemoveRows ()
 
void endResetModel ()
 
QModelIndexList persistentIndexList () const
 
- Protected Methods inherited from QObject
virtual void childEvent (QChildEvent *event)
 
virtual void connectNotify (const QMetaMethod &signalMethod) const
 
virtual void customEvent (QEvent *event)
 
virtual void disconnectNotify (const QMetaMethod &signalMethod) const
 
bool isSignalConnected (const QMetaMethod &signalMethod) const
 
int receivers (const QString &signal) const
 
QObject * sender () const
 
int senderSignalIndex () const
 
virtual void timerEvent (QTimerEvent *event)
 

Additional Inherited Members

- Public Signals inherited from QSqlTableModel
void beforeDelete (int row)
 
void beforeInsert (QSqlRecord &record)
 
void beforeUpdate (int row, QSqlRecord &record)
 
void primeInsert (int row, QSqlRecord &record)
 
- Public Signals inherited from QAbstractItemModel
void columnsAboutToBeInserted (const QModelIndex &parent, int first, int last)
 
void columnsAboutToBeMoved (const QModelIndex &sourceParent, int sourceStart, int sourceEnd, const QModelIndex &destinationParent, int destinationColumn)
 
void columnsAboutToBeRemoved (const QModelIndex &parent, int first, int last)
 
void columnsInserted (const QModelIndex &parent, int first, int last)
 
void columnsMoved (const QModelIndex &sourceParent, int sourceStart, int sourceEnd, const QModelIndex &destinationParent, int destinationColumn)
 
void columnsRemoved (const QModelIndex &parent, int first, int last)
 
void dataChanged (const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector< int > &roles=QVector< int >())
 
void headerDataChanged (Qt::Orientation orientation, int first, int last)
 
void layoutAboutToBeChanged (const QList< QPersistentModelIndex > &parents=QList< QPersistentModelIndex >(), QAbstractItemModel::LayoutChangeHint hint=QAbstractItemModel::NoLayoutChangeHint)
 
void layoutChanged (const QList< QPersistentModelIndex > &parents=QList< QPersistentModelIndex >(), QAbstractItemModel::LayoutChangeHint hint=QAbstractItemModel::NoLayoutChangeHint)
 
void modelAboutToBeReset ()
 
void modelReset ()
 
void rowsAboutToBeInserted (const QModelIndex &parent, int first, int last)
 
void rowsAboutToBeMoved (const QModelIndex &sourceParent, int sourceStart, int sourceEnd, const QModelIndex &destinationParent, int destinationRow)
 
void rowsAboutToBeRemoved (const QModelIndex &parent, int first, int last)
 
void rowsInserted (const QModelIndex &parent, int first, int last)
 
void rowsMoved (const QModelIndex &sourceParent, int sourceStart, int sourceEnd, const QModelIndex &destinationParent, int destinationRow)
 
void rowsRemoved (const QModelIndex &parent, int first, int last)
 
- Public Signals inherited from QObject
void destroyed (QObject *obj=nullptr)
 
void objectNameChanged (const QString &objectName)
 
- Static Public Methods inherited from QObject
static bool connect (const QObject *sender, const QMetaMethod &signalMethod, const QObject *receiver, const QMetaMethod &slotMethod, Qt::ConnectionType type=Qt::AutoConnection)
 
static bool connect (const QObject *sender, const QString &signalMethod, const QObject *receiver, const QString &slotMethod, Qt::ConnectionType type=Qt::AutoConnection, const QString &location=QString ())
 
static bool connect (const QObject *sender, const QString &signalMethod, const QString &location, const QObject *receiver, const QString &slotMethod, Qt::ConnectionType type=Qt::AutoConnection)
 
template<class Sender , class SignalClass , class... SignalArgs, class Receiver , class SlotClass , class... SlotArgs, class SlotReturn >
static bool connect (const Sender *sender, void (SignalClass::*signalMethod)(SignalArgs...), const Receiver *receiver, SlotReturn (SlotClass::*slotMethod)(SlotArgs...), Qt::ConnectionType type=Qt::AutoConnection)
 
template<class Sender , class SignalClass , class... SignalArgs, class Receiver , class T >
static bool connect (const Sender *sender, void (SignalClass::*signalMethod)(SignalArgs...), const Receiver *receiver, T slotLambda, Qt::ConnectionType type=Qt::AutoConnection)
 
static bool disconnect (const QObject *sender, const QMetaMethod &signalMethod, const QObject *receiver, const QMetaMethod &slotMethod)
 
static bool disconnect (const QObject *sender, const QString &signalMethod, const QObject *receiver, const QString &slotMethod)
 
static bool disconnect (const QObject *sender, const QString &signalMethod, const QString &location, const QObject *receiver, const QString &slotMethod)
 
static bool disconnect (const QObject *sender, std::nullptr_t, const QObject *receiver, std::nullptr_t)
 
template<class Sender , class SignalClass , class... SignalArgs, class Receiver , class SlotClass , class... SlotArgs, class SlotReturn >
static bool disconnect (const Sender *sender, void (SignalClass::*signalMethod)(SignalArgs...), const Receiver *receiver, SlotReturn (SlotClass::*slotMethod)(SlotArgs...))
 
template<class Sender , class SignalClass , class... SignalArgs, class Receiver >
static bool disconnect (const Sender *sender, void (SignalClass::*signalMethod)(SignalArgs...), const Receiver *receiver, std::nullptr_t slotMethod=nullptr)
 
template<class Sender , class SignalClass , class... SignalArgs, class Receiver , class T >
static bool disconnect (const Sender *sender, void (SignalClass::*signalMethod)(SignalArgs...), const Receiver *receiver, T slotMethod)
 
static QMetaObjectstaticMetaObject ()
 
static QString tr (const char *text, const char *comment=nullptr, std::optional< int > numArg=std::optional< int >())
 
- Protected Slots inherited from QAbstractItemModel
void resetInternalData ()
 
- Properties inherited from QObject
 objectName
 

Detailed Description

The QSqlRelationalTableModel class provides an editable data model for a single database table, with foreign key support. QSqlRelationalTableModel acts like QSqlTableModel, but allows columns to be set as foreign keys into other database tables.

The screenshot on the left shows a plain QSqlTableModel in a QTableView. Foreign keys (city and country) are not resolved to human-readable values. The screenshot on the right shows a QSqlRelationalTableModel, with foreign keys resolved into human-readable text strings.

The following code shows how the QSqlRelationalTableModel was configured.

model->setTable("employee");
model->setRelation(2, QSqlRelation("city", "id", "name"));
model->setRelation(3, QSqlRelation("country", "id", "name"));

The setRelation() function calls establish a relationship between two tables. The first call specifies that column 2 in table employee is a foreign key that maps with field id of table city, and that the view should present the city's name field to the user. The second call does something similar with column 3.

If you use a read-write QSqlRelationalTableModel, you probably want to use QSqlRelationalDelegate on the view. Unlike the default delegate, QSqlRelationalDelegate provides a combobox for fields that are foreign keys into other tables. To use the class, simply call QAbstractItemView::setItemDelegate() on the view with an instance of QSqlRelationalDelegate:

QTableView *view = new QTableView;
view->setModel(model);
view->setItemDelegate(new QSqlRelationalDelegate(view));

Notes:

  • The table must have a primary key declared.
  • The table's primary key may not contain a relation to another table.
  • If a relational table contains keys that refer to non-existent rows in the referenced table, the rows containing the invalid keys will not be exposed through the model. The user or the database is responsible for keeping referential integrity.
  • If a relation's display column name is also used as a column name in the main table, or if it is used as display column name in more than one relation it will be aliased. The alias is the relation's table name and display column name joined by an underscore (e.g. tablename_columnname). All occurrences of the duplicate display column name are aliased when duplication is detected, but no aliasing is done to the column names in the main table. The aliasing does not affect QSqlRelation, so QSqlRelation::displayColumn() will return the original display column name, but QSqlRecord::fieldName() will return aliases.
  • When using setData() the role should always be Qt::EditRole and when using data() the role should always be Qt::DisplayRole.
See also
QSqlRelation, QSqlRelationalDelegate

Member Enumeration Documentation

This enum specifies the type of mode to use when joining two tables.

ConstantValueDescription
QSqlRelationalTableModel::InnerJoin0 Inner join mode, return rows when there is at least one match in both tables.
QSqlRelationalTableModel::LeftJoin1 Left join mode, returns all rows from the left table (table_name1), even if there are no matches in the right table (table_name2).
See also
QSqlRelationalTableModel::setJoinMode()

Constructor & Destructor Documentation

QSqlRelationalTableModel::QSqlRelationalTableModel ( QObject parent = nullptr,
QSqlDatabase  db = QSqlDatabase() 
)
explicit

Creates an empty QSqlRelationalTableModel and sets the parent to parent and the database connection to db. If db is not valid, the default database connection will be used.

QSqlRelationalTableModel::~QSqlRelationalTableModel ( )
virtual

Destroys the object and frees any allocated resources.

Method Documentation

void QSqlRelationalTableModel::clear ( )
overridevirtual

Reimplemented from QSqlQueryModel::clear()

QVariant QSqlRelationalTableModel::data ( const QModelIndex index,
int  role = Qt::DisplayRole 
) const
overridevirtual
See also
setData()

Reimplemented from QSqlQueryModel::data()

bool QSqlRelationalTableModel::insertRowIntoTable ( const QSqlRecord values)
overrideprotectedvirtual
QString QSqlRelationalTableModel::orderByClause ( ) const
overrideprotectedvirtual

Reimplemented from QSqlTableModel::orderByClause()

QSqlRelation QSqlRelationalTableModel::relation ( int  column) const

Returns the relation for the column, or an invalid relation if no relation is set.

See also
setRelation(), QSqlRelation::isValid()
QSqlTableModel * QSqlRelationalTableModel::relationModel ( int  column) const
virtual

Returns a QSqlTableModel object for accessing the table for which column is a foreign key or a nullptr if there is no relation for the given column. The returned object is owned by the QSqlRelationalTableModel.

See also
setRelation(), relation()
bool QSqlRelationalTableModel::removeColumns ( int  column,
int  count,
const QModelIndex parent = QModelIndex() 
)
overridevirtual

Reimplemented from QSqlQueryModel::removeColumns()

void QSqlRelationalTableModel::revertRow ( int  row)
slot

Reimplemented from QSqlTableModel::revertRow()

bool QSqlRelationalTableModel::select ( )
override

Reimplemented from QSqlTableModel::select()

QString QSqlRelationalTableModel::selectStatement ( ) const
overrideprotectedvirtual
bool QSqlRelationalTableModel::setData ( const QModelIndex index,
const QVariant value,
int  role = Qt::EditRole 
)
overridevirtual

Sets the data for the role in the item with the specified index to the value given. Depending on the edit strategy, the value might be applied to the database at once, or it may be cached in the model. Returns true if the value could be set, or false on error (for example, if index is out of bounds). For relational columns, value must be the index, not the display value. The index must also exist in the referenced table, otherwise the methods returns false.

See also
editStrategy(), data(), submit(), revertRow()

Reimplemented from QAbstractItemModel::setData()

void QSqlRelationalTableModel::setJoinMode ( QSqlRelationalTableModel::JoinMode  joinMode)

Sets the SQL join mode to the value given by joinMode to show or hide rows with NULL foreign keys. In InnerJoin mode (the default) these rows will not be shown; use the LeftJoin mode if you want to show them.

See also
QSqlRelationalTableModel::JoinMode
void QSqlRelationalTableModel::setRelation ( int  column,
const QSqlRelation relation 
)
virtual

Allows the specified column to be a foreign index specified by relation. The table's primary key may not contain a relation to another table.

The setRelation() call in the following example specifies that column 2 in table employee is a foreign key that maps with field id of table city, and that the view should present the city's name field to the user.

model->setTable("employee");
model->setRelation(2, QSqlRelation("city", "id", "name"));
See also
relation()
void QSqlRelationalTableModel::setTable ( const QString tableName)
overridevirtual

Reimplemented from QSqlTableModel::setTable()

bool QSqlRelationalTableModel::updateRowInTable ( int  row,
const QSqlRecord values 
)
overrideprotectedvirtual