Test connecting to virtual function pointer
The C++ standard says that the comparison between pointer to virtual function is unspecified (C++11 $5.10.2) But we still may rely on it for the Qt::UniqueConnection and the disconnection So test if it works while using the same function. Using function from different classes works for me, but we should probably not assume it works. I left it commented in the test for reference. Change-Id: I1d9b91d4cc1a424d4f43ef2ee4981b8573f1e86f Reviewed-by: Bradley T. Hughes <bradley.hughes@nokia.com> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
This commit is contained in:
parent
d584292aa2
commit
c0323cfbaf
@ -134,6 +134,7 @@ private slots:
|
||||
void returnValue();
|
||||
void returnValue2_data();
|
||||
void returnValue2();
|
||||
void connectVirtualSlots();
|
||||
};
|
||||
|
||||
class SenderObject : public QObject
|
||||
@ -5150,6 +5151,52 @@ void tst_QObject::returnValue2()
|
||||
}
|
||||
}
|
||||
|
||||
class VirtualSlotsObjectBase : public QObject {
|
||||
Q_OBJECT
|
||||
public slots:
|
||||
virtual void slot1() {
|
||||
base_counter1++;
|
||||
}
|
||||
public:
|
||||
VirtualSlotsObjectBase() : base_counter1(0) {}
|
||||
int base_counter1;
|
||||
signals:
|
||||
void signal1();
|
||||
};
|
||||
|
||||
class VirtualSlotsObject : public VirtualSlotsObjectBase {
|
||||
Q_OBJECT
|
||||
public slots:
|
||||
virtual void slot1() {
|
||||
derived_counter1++;
|
||||
}
|
||||
public:
|
||||
VirtualSlotsObject() : derived_counter1(0) {}
|
||||
int derived_counter1;
|
||||
};
|
||||
|
||||
void tst_QObject::connectVirtualSlots()
|
||||
{
|
||||
VirtualSlotsObject obj;
|
||||
QVERIFY( QObject::connect(&obj, &VirtualSlotsObjectBase::signal1, &obj, &VirtualSlotsObjectBase::slot1, Qt::UniqueConnection));
|
||||
QVERIFY(!QObject::connect(&obj, &VirtualSlotsObjectBase::signal1, &obj, &VirtualSlotsObjectBase::slot1, Qt::UniqueConnection));
|
||||
|
||||
emit obj.signal1();
|
||||
QCOMPARE(obj.base_counter1, 0);
|
||||
QCOMPARE(obj.derived_counter1, 1);
|
||||
|
||||
QVERIFY(QObject::disconnect(&obj, &VirtualSlotsObjectBase::signal1, &obj, &VirtualSlotsObjectBase::slot1));
|
||||
QVERIFY(!QObject::disconnect(&obj, &VirtualSlotsObjectBase::signal1, &obj, &VirtualSlotsObjectBase::slot1));
|
||||
|
||||
emit obj.signal1();
|
||||
QCOMPARE(obj.base_counter1, 0);
|
||||
QCOMPARE(obj.derived_counter1, 1);
|
||||
|
||||
/* the C++ standard say the comparison between pointer to virtual member function is unspecified
|
||||
QVERIFY( QObject::connect(&obj, &VirtualSlotsObjectBase::signal1, &obj, &VirtualSlotsObjectBase::slot1, Qt::UniqueConnection));
|
||||
QVERIFY(!QObject::connect(&obj, &VirtualSlotsObjectBase::signal1, &obj, &VirtualSlotsObject::slot1, Qt::UniqueConnection));
|
||||
*/
|
||||
}
|
||||
|
||||
QTEST_MAIN(tst_QObject)
|
||||
#include "tst_qobject.moc"
|
||||
|
Loading…
Reference in New Issue
Block a user