#include #include #include class OverrideSelectedItem : public QGraphicsLineItem { public: OverrideSelectedItem(QGraphicsItem *parent = 0) : QGraphicsLineItem(parent), _overrideSelected(false) { } bool isOverrideSelected() { return _overrideSelected; } void setOverrideSelected(bool selected) { _overrideSelected = selected; } protected: QVariant itemChange(GraphicsItemChange change, const QVariant &value) { if (change == ItemSelectedChange) { return _overrideSelected; } return QGraphicsItem::itemChange(change, value); } private: bool _overrideSelected; }; class TestOverrideSelectedItem : public QObject { Q_OBJECT private slots: void testClearSelection() { QGraphicsScene scene; OverrideSelectedItem *item = new OverrideSelectedItem; item->setFlag(QGraphicsItem::ItemIsSelectable, true); scene.addItem(item); // force selection of item item->setOverrideSelected(true); item->setSelected(true); QCOMPARE(scene.selectedItems().count(), 1); // setSelected(false) is overridden to true in itemChange, // selectedItems() erroneously is cleared, it should contain item scene.clearSelection(); // selection state is not changed QVERIFY(item->isSelected()); // item with overridden selection state should not be removed QCOMPARE(scene.selectedItems().count(), 1); // fails } }; QTEST_MAIN(TestOverrideSelectedItem) #include "TestOverrideSelectedItem.moc"