summaryrefslogtreecommitdiffstats
path: root/src/corelib
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib')
-rw-r--r--src/corelib/itemmodels/qabstractitemmodel.h3
-rw-r--r--src/corelib/itemmodels/qitemselectionmodel.cpp144
-rw-r--r--src/corelib/itemmodels/qitemselectionmodel.h32
3 files changed, 144 insertions, 35 deletions
diff --git a/src/corelib/itemmodels/qabstractitemmodel.h b/src/corelib/itemmodels/qabstractitemmodel.h
index 75c2009fe4..7699611408 100644
--- a/src/corelib/itemmodels/qabstractitemmodel.h
+++ b/src/corelib/itemmodels/qabstractitemmodel.h
@@ -481,4 +481,7 @@ inline uint qHash(const QModelIndex &index) Q_DECL_NOTHROW
QT_END_NAMESPACE
+Q_DECLARE_METATYPE(QModelIndexList)
+Q_DECLARE_METATYPE(QPersistentModelIndex)
+
#endif // QABSTRACTITEMMODEL_H
diff --git a/src/corelib/itemmodels/qitemselectionmodel.cpp b/src/corelib/itemmodels/qitemselectionmodel.cpp
index 5395fd5d09..920190e712 100644
--- a/src/corelib/itemmodels/qitemselectionmodel.cpp
+++ b/src/corelib/itemmodels/qitemselectionmodel.cpp
@@ -589,33 +589,51 @@ void QItemSelection::split(const QItemSelectionRange &range,
}
-void QItemSelectionModelPrivate::initModel(QAbstractItemModel *model)
+void QItemSelectionModelPrivate::initModel(QAbstractItemModel *m)
{
- this->model = model;
+ struct Cx {
+ const char *signal;
+ const char *slot;
+ };
+ static const Cx connections[] = {
+ { SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int)),
+ SLOT(_q_rowsAboutToBeRemoved(QModelIndex,int,int)) },
+ { SIGNAL(columnsAboutToBeRemoved(QModelIndex,int,int)),
+ SLOT(_q_columnsAboutToBeRemoved(QModelIndex,int,int)) },
+ { SIGNAL(rowsAboutToBeInserted(QModelIndex,int,int)),
+ SLOT(_q_rowsAboutToBeInserted(QModelIndex,int,int)) },
+ { SIGNAL(columnsAboutToBeInserted(QModelIndex,int,int)),
+ SLOT(_q_columnsAboutToBeInserted(QModelIndex,int,int)) },
+ { SIGNAL(rowsAboutToBeMoved(QModelIndex,int,int,QModelIndex,int)),
+ SLOT(_q_layoutAboutToBeChanged()) },
+ { SIGNAL(columnsAboutToBeMoved(QModelIndex,int,int,QModelIndex,int)),
+ SLOT(_q_layoutAboutToBeChanged()) },
+ { SIGNAL(rowsMoved(QModelIndex,int,int,QModelIndex,int)),
+ SLOT(_q_layoutChanged()) },
+ { SIGNAL(columnsMoved(QModelIndex,int,int,QModelIndex,int)),
+ SLOT(_q_layoutChanged()) },
+ { SIGNAL(layoutAboutToBeChanged(QList<QPersistentModelIndex>,QAbstractItemModel::LayoutChangeHint)),
+ SLOT(_q_layoutAboutToBeChanged(QList<QPersistentModelIndex>,QAbstractItemModel::LayoutChangeHint)) },
+ { SIGNAL(layoutChanged(QList<QPersistentModelIndex>,QAbstractItemModel::LayoutChangeHint)),
+ SLOT(_q_layoutChanged(QList<QPersistentModelIndex>,QAbstractItemModel::LayoutChangeHint)) },
+ { SIGNAL(modelReset()),
+ SLOT(reset()) },
+ { 0, 0 }
+ };
+
+ if (model == m)
+ return;
+
+ Q_Q(QItemSelectionModel);
if (model) {
- Q_Q(QItemSelectionModel);
- QObject::connect(model, SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int)),
- q, SLOT(_q_rowsAboutToBeRemoved(QModelIndex,int,int)));
- QObject::connect(model, SIGNAL(columnsAboutToBeRemoved(QModelIndex,int,int)),
- q, SLOT(_q_columnsAboutToBeRemoved(QModelIndex,int,int)));
- QObject::connect(model, SIGNAL(rowsAboutToBeInserted(QModelIndex,int,int)),
- q, SLOT(_q_rowsAboutToBeInserted(QModelIndex,int,int)));
- QObject::connect(model, SIGNAL(columnsAboutToBeInserted(QModelIndex,int,int)),
- q, SLOT(_q_columnsAboutToBeInserted(QModelIndex,int,int)));
- QObject::connect(model, SIGNAL(rowsAboutToBeMoved(QModelIndex,int,int,QModelIndex,int)),
- q, SLOT(_q_layoutAboutToBeChanged()));
- QObject::connect(model, SIGNAL(columnsAboutToBeMoved(QModelIndex,int,int,QModelIndex,int)),
- q, SLOT(_q_layoutAboutToBeChanged()));
- QObject::connect(model, SIGNAL(rowsMoved(QModelIndex,int,int,QModelIndex,int)),
- q, SLOT(_q_layoutChanged()));
- QObject::connect(model, SIGNAL(columnsMoved(QModelIndex,int,int,QModelIndex,int)),
- q, SLOT(_q_layoutChanged()));
- QObject::connect(model, SIGNAL(layoutAboutToBeChanged(QList<QPersistentModelIndex>,QAbstractItemModel::LayoutChangeHint)),
- q, SLOT(_q_layoutAboutToBeChanged(QList<QPersistentModelIndex>,QAbstractItemModel::LayoutChangeHint)));
- QObject::connect(model, SIGNAL(layoutChanged(QList<QPersistentModelIndex>,QAbstractItemModel::LayoutChangeHint)),
- q, SLOT(_q_layoutChanged(QList<QPersistentModelIndex>,QAbstractItemModel::LayoutChangeHint)));
- QObject::connect(model, SIGNAL(modelReset()),
- q, SLOT(reset()));
+ for (const Cx *cx = &connections[0]; cx->signal; cx++)
+ QObject::disconnect(model, cx->signal, q, cx->slot);
+ q->reset();
+ }
+ model = m;
+ if (model) {
+ for (const Cx *cx = &connections[0]; cx->signal; cx++)
+ QObject::connect(model, cx->signal, q, cx->slot);
}
}
@@ -1078,6 +1096,10 @@ void QItemSelectionModelPrivate::_q_layoutChanged(const QList<QPersistentModelIn
selection. All functions operate on both layers; for example,
\l {QTableWidget::selectedItems()}{selecteditems()} will return items from both layers.
+ \note Since 5.5, \l{QItemSelectionModel::model()}{model},
+ \l{QItemSelectionModel::hasSelection()}{hasSelection}, and
+ \l{QItemSelectionModel::currentIndex()}{currentIndex} are meta-object properties.
+
\sa {Model/View Programming}, QAbstractItemModel, {Chart Example}
*/
@@ -1175,6 +1197,16 @@ void QItemSelectionModel::select(const QModelIndex &index, QItemSelectionModel::
*/
/*!
+ \fn void QItemSelectionModel::modelChanged(QAbstractItemModel *model)
+ \since 5.5
+
+ This signal is emitted when the model is successfully set with setModel().
+
+ \sa model(), setModel()
+*/
+
+
+/*!
\enum QItemSelectionModel::SelectionFlag
This enum describes the way the selection model will be updated.
@@ -1205,6 +1237,10 @@ void QItemSelectionModel::select(const QModelIndex &index, QItemSelectionModel::
void QItemSelectionModel::select(const QItemSelection &selection, QItemSelectionModel::SelectionFlags command)
{
Q_D(QItemSelectionModel);
+ if (!d->model) {
+ qWarning("QItemSelectionModel: Selecting when no model has been set will result in a no-op.");
+ return;
+ }
if (command == NoUpdate)
return;
@@ -1312,6 +1348,10 @@ void QItemSelectionModel::clearSelection()
void QItemSelectionModel::setCurrentIndex(const QModelIndex &index, QItemSelectionModel::SelectionFlags command)
{
Q_D(QItemSelectionModel);
+ if (!d->model) {
+ qWarning("QItemSelectionModel: Setting the current index when no model has been set will result in a no-op.");
+ return;
+ }
if (index == d->currentIndex) {
if (command != NoUpdate)
select(index, command); // select item
@@ -1387,6 +1427,8 @@ bool QItemSelectionModel::isSelected(const QModelIndex &index) const
bool QItemSelectionModel::isRowSelected(int row, const QModelIndex &parent) const
{
Q_D(const QItemSelectionModel);
+ if (!d->model)
+ return false;
if (parent.isValid() && d->model != parent.model())
return false;
@@ -1447,6 +1489,8 @@ bool QItemSelectionModel::isRowSelected(int row, const QModelIndex &parent) cons
bool QItemSelectionModel::isColumnSelected(int column, const QModelIndex &parent) const
{
Q_D(const QItemSelectionModel);
+ if (!d->model)
+ return false;
if (parent.isValid() && d->model != parent.model())
return false;
@@ -1503,6 +1547,8 @@ bool QItemSelectionModel::isColumnSelected(int column, const QModelIndex &parent
bool QItemSelectionModel::rowIntersectsSelection(int row, const QModelIndex &parent) const
{
Q_D(const QItemSelectionModel);
+ if (!d->model)
+ return false;
if (parent.isValid() && d->model != parent.model())
return false;
@@ -1535,6 +1581,8 @@ bool QItemSelectionModel::rowIntersectsSelection(int row, const QModelIndex &par
bool QItemSelectionModel::columnIntersectsSelection(int column, const QModelIndex &parent) const
{
Q_D(const QItemSelectionModel);
+ if (!d->model)
+ return false;
if (parent.isValid() && d->model != parent.model())
return false;
@@ -1672,6 +1720,35 @@ const QItemSelection QItemSelectionModel::selection() const
}
/*!
+ \since 5.5
+
+ \property QItemSelectionModel::hasSelection
+ \internal
+*/
+/*!
+ \since 5.5
+
+ \property QItemSelectionModel::currentIndex
+ \internal
+*/
+/*!
+ \since 5.5
+
+ \property QItemSelectionModel::model
+ \internal
+*/
+
+/*!
+ \since 5.5
+
+ Returns the item model operated on by the selection model.
+*/
+QAbstractItemModel *QItemSelectionModel::model()
+{
+ return d_func()->model;
+}
+
+/*!
Returns the item model operated on by the selection model.
*/
const QAbstractItemModel *QItemSelectionModel::model() const
@@ -1680,6 +1757,23 @@ const QAbstractItemModel *QItemSelectionModel::model() const
}
/*!
+ \since 5.5
+
+ Sets the model. The modelChanged() signal will be emitted.
+
+ \sa model(), modelChanged()
+*/
+void QItemSelectionModel::setModel(QAbstractItemModel *model)
+{
+ Q_D(QItemSelectionModel);
+ if (d->model == model)
+ return;
+
+ d->initModel(model);
+ emit modelChanged(model);
+}
+
+/*!
Compares the two selections \a newSelection and \a oldSelection
and emits selectionChanged() with the deselected and selected items.
*/
diff --git a/src/corelib/itemmodels/qitemselectionmodel.h b/src/corelib/itemmodels/qitemselectionmodel.h
index 27243a2b99..f02149b2b7 100644
--- a/src/corelib/itemmodels/qitemselectionmodel.h
+++ b/src/corelib/itemmodels/qitemselectionmodel.h
@@ -143,6 +143,10 @@ class QItemSelectionModelPrivate;
class Q_CORE_EXPORT QItemSelectionModel : public QObject
{
Q_OBJECT
+ Q_PROPERTY(QAbstractItemModel *model READ model WRITE setModel NOTIFY modelChanged)
+ Q_PROPERTY(bool hasSelection READ hasSelection NOTIFY selectionChanged STORED false DESIGNABLE false)
+ Q_PROPERTY(QModelIndex currentIndex READ currentIndex NOTIFY currentChanged STORED false DESIGNABLE false)
+
Q_DECLARE_PRIVATE(QItemSelectionModel)
Q_FLAGS(SelectionFlags)
@@ -164,27 +168,31 @@ public:
Q_DECLARE_FLAGS(SelectionFlags, SelectionFlag)
- explicit QItemSelectionModel(QAbstractItemModel *model);
+ explicit QItemSelectionModel(QAbstractItemModel *model = 0);
explicit QItemSelectionModel(QAbstractItemModel *model, QObject *parent);
virtual ~QItemSelectionModel();
QModelIndex currentIndex() const;
- bool isSelected(const QModelIndex &index) const;
- bool isRowSelected(int row, const QModelIndex &parent) const;
- bool isColumnSelected(int column, const QModelIndex &parent) const;
+ Q_INVOKABLE bool isSelected(const QModelIndex &index) const;
+ Q_INVOKABLE bool isRowSelected(int row, const QModelIndex &parent) const;
+ Q_INVOKABLE bool isColumnSelected(int column, const QModelIndex &parent) const;
- bool rowIntersectsSelection(int row, const QModelIndex &parent) const;
- bool columnIntersectsSelection(int column, const QModelIndex &parent) const;
+ Q_INVOKABLE bool rowIntersectsSelection(int row, const QModelIndex &parent) const;
+ Q_INVOKABLE bool columnIntersectsSelection(int column, const QModelIndex &parent) const;
bool hasSelection() const;
- QModelIndexList selectedIndexes() const;
- QModelIndexList selectedRows(int column = 0) const;
- QModelIndexList selectedColumns(int row = 0) const;
- const QItemSelection selection() const;
+ Q_INVOKABLE QModelIndexList selectedIndexes() const;
+ Q_INVOKABLE QModelIndexList selectedRows(int column = 0) const;
+ Q_INVOKABLE QModelIndexList selectedColumns(int row = 0) const;
+ Q_INVOKABLE const QItemSelection selection() const;
+ // ### Qt 6: Merge these two as "QAbstractItemModel *model() const"
const QAbstractItemModel *model() const;
+ QAbstractItemModel *model();
+
+ void setModel(QAbstractItemModel *model);
public Q_SLOTS:
virtual void setCurrentIndex(const QModelIndex &index, QItemSelectionModel::SelectionFlags command);
@@ -201,6 +209,7 @@ Q_SIGNALS:
void currentChanged(const QModelIndex &current, const QModelIndex &previous);
void currentRowChanged(const QModelIndex &current, const QModelIndex &previous);
void currentColumnChanged(const QModelIndex &current, const QModelIndex &previous);
+ void modelChanged(QAbstractItemModel *model);
protected:
QItemSelectionModel(QItemSelectionModelPrivate &dd, QAbstractItemModel *model);
@@ -243,4 +252,7 @@ Q_CORE_EXPORT QDebug operator<<(QDebug, const QItemSelectionRange &);
QT_END_NAMESPACE
+Q_DECLARE_METATYPE(QItemSelectionRange)
+Q_DECLARE_METATYPE(QItemSelection)
+
#endif // QITEMSELECTIONMODEL_H