summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStephen Kelly <stephen.kelly@kdab.com>2012-07-09 09:56:56 +0200
committerQt by Nokia <qt-info@nokia.com>2012-07-13 01:51:44 +0200
commit536ec793b69c16611e73cff4360c6f49b644f740 (patch)
treebe2a36264a4cb22a131944e10918bdc089ae24e2
parent0efa445141ce3d7243f28e7b6da730d8dec17e23 (diff)
Make it possible to use new syntax to connect to model signals.
The private signals can not be used as function pointers, as required by the new syntax, so we introduce a parameter which can only be created privately. Change-Id: I3d7bb8a163e764d685e8007cba831fb77e3c6855 Reviewed-by: Olivier Goffart <ogoffart@woboq.com>
-rw-r--r--src/corelib/itemmodels/qabstractitemmodel.cpp28
-rw-r--r--src/corelib/itemmodels/qabstractitemmodel.h86
-rw-r--r--tests/auto/corelib/itemmodels/qabstractitemmodel/tst_qabstractitemmodel.cpp107
3 files changed, 190 insertions, 31 deletions
diff --git a/src/corelib/itemmodels/qabstractitemmodel.cpp b/src/corelib/itemmodels/qabstractitemmodel.cpp
index c78287759b..e4cd8f8e01 100644
--- a/src/corelib/itemmodels/qabstractitemmodel.cpp
+++ b/src/corelib/itemmodels/qabstractitemmodel.cpp
@@ -2483,7 +2483,7 @@ void QAbstractItemModel::beginInsertRows(const QModelIndex &parent, int first, i
Q_ASSERT(last >= first);
Q_D(QAbstractItemModel);
d->changes.push(QAbstractItemModelPrivate::Change(parent, first, last));
- emit rowsAboutToBeInserted(parent, first, last);
+ emit rowsAboutToBeInserted(parent, first, last, QPrivateSignal());
d->rowsAboutToBeInserted(parent, first, last);
}
@@ -2500,7 +2500,7 @@ void QAbstractItemModel::endInsertRows()
Q_D(QAbstractItemModel);
QAbstractItemModelPrivate::Change change = d->changes.pop();
d->rowsInserted(change.parent, change.first, change.last);
- emit rowsInserted(change.parent, change.first, change.last);
+ emit rowsInserted(change.parent, change.first, change.last, QPrivateSignal());
}
/*!
@@ -2537,7 +2537,7 @@ void QAbstractItemModel::beginRemoveRows(const QModelIndex &parent, int first, i
Q_ASSERT(last >= first);
Q_D(QAbstractItemModel);
d->changes.push(QAbstractItemModelPrivate::Change(parent, first, last));
- emit rowsAboutToBeRemoved(parent, first, last);
+ emit rowsAboutToBeRemoved(parent, first, last, QPrivateSignal());
d->rowsAboutToBeRemoved(parent, first, last);
}
@@ -2554,7 +2554,7 @@ void QAbstractItemModel::endRemoveRows()
Q_D(QAbstractItemModel);
QAbstractItemModelPrivate::Change change = d->changes.pop();
d->rowsRemoved(change.parent, change.first, change.last);
- emit rowsRemoved(change.parent, change.first, change.last);
+ emit rowsRemoved(change.parent, change.first, change.last, QPrivateSignal());
}
/*!
@@ -2699,7 +2699,7 @@ bool QAbstractItemModel::beginMoveRows(const QModelIndex &sourceParent, int sour
destinationChange.needsAdjust = destinationParent.isValid() && destinationParent.row() >= sourceLast && destinationParent.parent() == sourceParent;
d->changes.push(destinationChange);
- emit rowsAboutToBeMoved(sourceParent, sourceFirst, sourceLast, destinationParent, destinationChild);
+ emit rowsAboutToBeMoved(sourceParent, sourceFirst, sourceLast, destinationParent, destinationChild, QPrivateSignal());
d->itemsAboutToBeMoved(sourceParent, sourceFirst, sourceLast, destinationParent, destinationChild, Qt::Vertical);
return true;
}
@@ -2734,7 +2734,7 @@ void QAbstractItemModel::endMoveRows()
d->itemsMoved(adjustedSource, removeChange.first, removeChange.last, adjustedDestination, insertChange.first, Qt::Vertical);
- emit rowsMoved(adjustedSource, removeChange.first, removeChange.last, adjustedDestination, insertChange.first);
+ emit rowsMoved(adjustedSource, removeChange.first, removeChange.last, adjustedDestination, insertChange.first, QPrivateSignal());
}
/*!
@@ -2784,7 +2784,7 @@ void QAbstractItemModel::beginInsertColumns(const QModelIndex &parent, int first
Q_ASSERT(last >= first);
Q_D(QAbstractItemModel);
d->changes.push(QAbstractItemModelPrivate::Change(parent, first, last));
- emit columnsAboutToBeInserted(parent, first, last);
+ emit columnsAboutToBeInserted(parent, first, last, QPrivateSignal());
d->columnsAboutToBeInserted(parent, first, last);
}
@@ -2802,7 +2802,7 @@ void QAbstractItemModel::endInsertColumns()
Q_D(QAbstractItemModel);
QAbstractItemModelPrivate::Change change = d->changes.pop();
d->columnsInserted(change.parent, change.first, change.last);
- emit columnsInserted(change.parent, change.first, change.last);
+ emit columnsInserted(change.parent, change.first, change.last, QPrivateSignal());
}
/*!
@@ -2839,7 +2839,7 @@ void QAbstractItemModel::beginRemoveColumns(const QModelIndex &parent, int first
Q_ASSERT(last >= first);
Q_D(QAbstractItemModel);
d->changes.push(QAbstractItemModelPrivate::Change(parent, first, last));
- emit columnsAboutToBeRemoved(parent, first, last);
+ emit columnsAboutToBeRemoved(parent, first, last, QPrivateSignal());
d->columnsAboutToBeRemoved(parent, first, last);
}
@@ -2856,7 +2856,7 @@ void QAbstractItemModel::endRemoveColumns()
Q_D(QAbstractItemModel);
QAbstractItemModelPrivate::Change change = d->changes.pop();
d->columnsRemoved(change.parent, change.first, change.last);
- emit columnsRemoved(change.parent, change.first, change.last);
+ emit columnsRemoved(change.parent, change.first, change.last, QPrivateSignal());
}
/*!
@@ -2918,7 +2918,7 @@ bool QAbstractItemModel::beginMoveColumns(const QModelIndex &sourceParent, int s
d->itemsAboutToBeMoved(sourceParent, sourceFirst, sourceLast, destinationParent, destinationChild, Qt::Horizontal);
- emit columnsAboutToBeMoved(sourceParent, sourceFirst, sourceLast, destinationParent, destinationChild);
+ emit columnsAboutToBeMoved(sourceParent, sourceFirst, sourceLast, destinationParent, destinationChild, QPrivateSignal());
return true;
}
@@ -2952,7 +2952,7 @@ void QAbstractItemModel::endMoveColumns()
d->itemsMoved(adjustedSource, removeChange.first, removeChange.last, adjustedDestination, insertChange.first, Qt::Horizontal);
- emit columnsMoved(adjustedSource, removeChange.first, removeChange.last, adjustedDestination, insertChange.first);
+ emit columnsMoved(adjustedSource, removeChange.first, removeChange.last, adjustedDestination, insertChange.first, QPrivateSignal());
}
/*!
@@ -3002,7 +3002,7 @@ void QAbstractItemModel::endMoveColumns()
*/
void QAbstractItemModel::beginResetModel()
{
- emit modelAboutToBeReset();
+ emit modelAboutToBeReset(QPrivateSignal());
}
/*!
@@ -3020,7 +3020,7 @@ void QAbstractItemModel::endResetModel()
{
Q_D(QAbstractItemModel);
d->invalidatePersistentIndexes();
- emit modelReset();
+ emit modelReset(QPrivateSignal());
}
/*!
diff --git a/src/corelib/itemmodels/qabstractitemmodel.h b/src/corelib/itemmodels/qabstractitemmodel.h
index 41e733919a..66af606dac 100644
--- a/src/corelib/itemmodels/qabstractitemmodel.h
+++ b/src/corelib/itemmodels/qabstractitemmodel.h
@@ -249,30 +249,82 @@ Q_SIGNALS:
void layoutChanged(const QList<QPersistentModelIndex> &parents = QList<QPersistentModelIndex>());
void layoutAboutToBeChanged(const QList<QPersistentModelIndex> &parents = QList<QPersistentModelIndex>());
-#if !defined(Q_MOC_RUN) && !defined(qdoc)
-private: // can only be emitted by QAbstractItemModel
+ void rowsAboutToBeInserted(const QModelIndex &parent, int first, int last
+#if !defined(qdoc)
+ , QPrivateSignal
#endif
- void rowsAboutToBeInserted(const QModelIndex &parent, int first, int last);
- void rowsInserted(const QModelIndex &parent, int first, int last);
-
- void rowsAboutToBeRemoved(const QModelIndex &parent, int first, int last);
- void rowsRemoved(const QModelIndex &parent, int first, int last);
+ );
+ void rowsInserted(const QModelIndex &parent, int first, int last
+#if !defined(qdoc)
+ , QPrivateSignal
+#endif
+ );
- void columnsAboutToBeInserted(const QModelIndex &parent, int first, int last);
- void columnsInserted(const QModelIndex &parent, int first, int last);
+ void rowsAboutToBeRemoved(const QModelIndex &parent, int first, int last
+#if !defined(qdoc)
+ , QPrivateSignal
+#endif
+ );
+ void rowsRemoved(const QModelIndex &parent, int first, int last
+#if !defined(qdoc)
+ , QPrivateSignal
+#endif
+ );
- void columnsAboutToBeRemoved(const QModelIndex &parent, int first, int last);
- void columnsRemoved(const QModelIndex &parent, int first, int last);
+ void columnsAboutToBeInserted(const QModelIndex &parent, int first, int last
+#if !defined(qdoc)
+ , QPrivateSignal
+#endif
+ );
+ void columnsInserted(const QModelIndex &parent, int first, int last
+#if !defined(qdoc)
+ , QPrivateSignal
+#endif
+ );
- void modelAboutToBeReset();
- void modelReset();
+ void columnsAboutToBeRemoved(const QModelIndex &parent, int first, int last
+#if !defined(qdoc)
+ , QPrivateSignal
+#endif
+ );
+ void columnsRemoved(const QModelIndex &parent, int first, int last
+#if !defined(qdoc)
+ , QPrivateSignal
+#endif
+ );
- void rowsAboutToBeMoved( const QModelIndex &sourceParent, int sourceStart, int sourceEnd, const QModelIndex &destinationParent, int destinationRow );
- void rowsMoved( const QModelIndex &parent, int start, int end, const QModelIndex &destination, int row );
+ void modelAboutToBeReset(
+#if !defined(qdoc)
+ QPrivateSignal
+#endif
+ );
+ void modelReset(
+#if !defined(qdoc)
+ QPrivateSignal
+#endif
+ );
- void columnsAboutToBeMoved( const QModelIndex &sourceParent, int sourceStart, int sourceEnd, const QModelIndex &destinationParent, int destinationColumn );
- void columnsMoved( const QModelIndex &parent, int start, int end, const QModelIndex &destination, int column );
+ void rowsAboutToBeMoved( const QModelIndex &sourceParent, int sourceStart, int sourceEnd, const QModelIndex &destinationParent, int destinationRow
+#if !defined(qdoc)
+ , QPrivateSignal
+#endif
+ );
+ void rowsMoved( const QModelIndex &parent, int start, int end, const QModelIndex &destination, int row
+#if !defined(qdoc)
+ , QPrivateSignal
+#endif
+ );
+ void columnsAboutToBeMoved( const QModelIndex &sourceParent, int sourceStart, int sourceEnd, const QModelIndex &destinationParent, int destinationColumn
+#if !defined(qdoc)
+ , QPrivateSignal
+#endif
+ );
+ void columnsMoved( const QModelIndex &parent, int start, int end, const QModelIndex &destination, int column
+#if !defined(qdoc)
+ , QPrivateSignal
+#endif
+ );
public Q_SLOTS:
virtual bool submit();
diff --git a/tests/auto/corelib/itemmodels/qabstractitemmodel/tst_qabstractitemmodel.cpp b/tests/auto/corelib/itemmodels/qabstractitemmodel/tst_qabstractitemmodel.cpp
index 7d052b225b..999335a8ef 100644
--- a/tests/auto/corelib/itemmodels/qabstractitemmodel/tst_qabstractitemmodel.cpp
+++ b/tests/auto/corelib/itemmodels/qabstractitemmodel/tst_qabstractitemmodel.cpp
@@ -118,6 +118,8 @@ private slots:
void testRoleNames();
void testDragActions();
+ void testFunctionPointerSignalConnection();
+
private:
DynamicTreeModel *m_model;
};
@@ -2177,5 +2179,110 @@ void tst_QAbstractItemModel::testDragActions()
QVERIFY(actions & Qt::MoveAction);
}
+class SignalConnectionTester : public QObject
+{
+ Q_OBJECT
+public:
+ SignalConnectionTester(QObject *parent = 0)
+ : QObject(parent), testPassed(false)
+ {
+
+ }
+
+public Q_SLOTS:
+ void testSlot()
+ {
+ testPassed = true;
+ }
+ void testSlotWithParam_1(const QModelIndex &idx)
+ {
+ testPassed = !idx.isValid();
+ }
+ void testSlotWithParam_2(const QModelIndex &idx, int start)
+ {
+ testPassed = !idx.isValid() && start == 0;
+ }
+ void testSlotWithParam_3(const QModelIndex &idx, int start, int end)
+ {
+ testPassed = !idx.isValid() && start == 0 && end == 1;
+ }
+
+public:
+ bool testPassed;
+};
+
+void tst_QAbstractItemModel::testFunctionPointerSignalConnection()
+{
+ QStringListModel model;
+ {
+ SignalConnectionTester tester;
+ QObject::connect(&model, &QAbstractItemModel::rowsInserted, &tester, &SignalConnectionTester::testSlot);
+
+ QVERIFY(!tester.testPassed);
+
+ model.insertRows(0, 2);
+
+ QVERIFY(tester.testPassed);
+ tester.testPassed = false;
+ QMetaObject::invokeMethod(&model, "rowsInserted", Q_ARG(QModelIndex, QModelIndex()), Q_ARG(int, 0), Q_ARG(int, 1));
+ QVERIFY(tester.testPassed);
+ }
+ {
+ SignalConnectionTester tester;
+ QObject::connect(&model, &QAbstractItemModel::rowsInserted, &tester, &SignalConnectionTester::testSlotWithParam_1);
+
+ QVERIFY(!tester.testPassed);
+
+ model.insertRows(0, 2);
+
+ QVERIFY(tester.testPassed);
+ tester.testPassed = false;
+ QMetaObject::invokeMethod(&model, "rowsInserted", Q_ARG(QModelIndex, QModelIndex()), Q_ARG(int, 0), Q_ARG(int, 1));
+ QVERIFY(tester.testPassed);
+ }
+ {
+ SignalConnectionTester tester;
+ QObject::connect(&model, &QAbstractItemModel::rowsInserted, &tester, &SignalConnectionTester::testSlotWithParam_2);
+
+ QVERIFY(!tester.testPassed);
+
+ model.insertRows(0, 2);
+
+ QVERIFY(tester.testPassed);
+ tester.testPassed = false;
+ QMetaObject::invokeMethod(&model, "rowsInserted", Q_ARG(QModelIndex, QModelIndex()), Q_ARG(int, 0), Q_ARG(int, 1));
+ QVERIFY(tester.testPassed);
+ }
+ {
+ SignalConnectionTester tester;
+ QObject::connect(&model, &QAbstractItemModel::rowsInserted, &tester, &SignalConnectionTester::testSlotWithParam_3);
+
+ QVERIFY(!tester.testPassed);
+
+ model.insertRows(0, 2);
+
+ QVERIFY(tester.testPassed);
+ tester.testPassed = false;
+ QMetaObject::invokeMethod(&model, "rowsInserted", Q_ARG(QModelIndex, QModelIndex()), Q_ARG(int, 0), Q_ARG(int, 1));
+ QVERIFY(tester.testPassed);
+ }
+ {
+ SignalConnectionTester tester;
+ QObject::connect(&model, SIGNAL(rowsInserted(QModelIndex,int,int)), &tester, SLOT(testSlot()));
+
+ QVERIFY(!tester.testPassed);
+
+ model.insertRows(0, 2);
+
+ QVERIFY(tester.testPassed);
+ tester.testPassed = false;
+ QMetaObject::invokeMethod(&model, "rowsInserted", Q_ARG(QModelIndex, QModelIndex()), Q_ARG(int, 0), Q_ARG(int, 1));
+ QVERIFY(tester.testPassed);
+ }
+ // Intentionally does not compile.
+// model.rowsInserted(QModelIndex(), 0, 0);
+}
+
+
QTEST_MAIN(tst_QAbstractItemModel)
#include "tst_qabstractitemmodel.moc"