示例#1
0
void tst_QGraphicsEffect::graphicsEffectUpdateShouldNotInvalidateGraphicsItemCache()
{
    QGraphicsScene scene;
    MyGraphicsItem parent;
    parent.resize(200, 200);
    parent.setCacheMode(QGraphicsItem::ItemCoordinateCache);
    scene.addItem(&parent);

    QGraphicsView view(&scene);
    view.show();
    QApplication::setActiveWindow(&view);
    QTest::qWaitForWindowShown(&view);
    QTRY_COMPARE(parent.nbPaint, 1);

    //we set an effect on the parent
    MyGraphicsEffect* opacityEffect = new MyGraphicsEffect(&parent);
    opacityEffect->update();
    parent.setGraphicsEffect(opacityEffect);
    //flush the events
    QApplication::processEvents();
    //new effect applied->repaint
    QCOMPARE(parent.nbPaint, 1);

    opacityEffect->update();
    //flush the events
    QApplication::processEvents();
    //A change to the effect shouldn't invalidate the graphicsitem's cache
    // => it shouldn't trigger a paint
    QCOMPARE(parent.nbPaint, 1);
}
void tst_QGraphicsEffect::graphicsEffectUpdateShouldInvalidateParentGraphicsEffect()
{
    QGraphicsScene scene;
    // Add the parent
    MyGraphicsItem parent;
    parent.resize(200, 200);
    scene.addItem(&parent);
    // Add a child to the parent
    MyGraphicsItem child(&parent);
    child.resize(100, 100);

    QGraphicsView view(&scene);
    view.show();
    QApplication::setActiveWindow(&view);
    QTest::qWaitForWindowShown(&view);
    //flush the events
    QApplication::processEvents();
#ifdef Q_OS_MAC
    if (QSysInfo::MacintoshVersion == QSysInfo::MV_LION) {
        QEXPECT_FAIL("", "QTBUG-26858", Abort);
    }
#endif
    QTRY_COMPARE(parent.nbPaint, 1);
    QTRY_COMPARE(child.nbPaint, 1);

    //we set an effect on the parent and the child
    MyGraphicsEffect* effectForParent = new MyGraphicsEffect(&parent);
    parent.setGraphicsEffect(effectForParent);

    MyGraphicsEffect* effectForChild = new MyGraphicsEffect(&child);
    child.setGraphicsEffect(effectForChild);
    //flush the events
    QApplication::processEvents();
    // Both effects should start with no source invalidations
    QCOMPARE(effectForParent->nbSourceInvalidations, 0);
    QCOMPARE(effectForChild->nbSourceInvalidations, 0);

    // Trigger an update of the child graphics effect
    effectForChild->update();
    //flush the events
    QApplication::processEvents();
    // An update of the effect on the child shouldn't tell that effect that its source has been invalidated
    QCOMPARE(effectForChild->nbSourceInvalidations, 0);
    // The effect on the parent should however be notified of an invalidated source
    QCOMPARE(effectForParent->nbSourceInvalidations, 1);
}