tests/auto/qgraphicsproxywidget/tst_qgraphicsproxywidget.cpp
changeset 19 fcece45ef507
parent 18 2f34d5167611
child 14 c0432d11811c
equal deleted inserted replaced
18:2f34d5167611 19:fcece45ef507
  3424 {
  3424 {
  3425     QGraphicsScene scene;
  3425     QGraphicsScene scene;
  3426     scene.setItemIndexMethod(QGraphicsScene::NoIndex);
  3426     scene.setItemIndexMethod(QGraphicsScene::NoIndex);
  3427     QGraphicsProxyWidget *proxy = scene.addWidget(new QLineEdit);
  3427     QGraphicsProxyWidget *proxy = scene.addWidget(new QLineEdit);
  3428 
  3428 
  3429     EventSpy proxySpy(proxy);
       
  3430     EventSpy widgetSpy(proxy->widget());
       
  3431 
       
  3432     QGraphicsView view(&scene);
  3429     QGraphicsView view(&scene);
  3433     view.setFrameStyle(0);
  3430 
  3434     view.resize(300, 300);
  3431     {
  3435     view.show();
  3432         EventSpy proxySpy(proxy);
       
  3433         EventSpy widgetSpy(proxy->widget());
       
  3434 
       
  3435         view.setFrameStyle(0);
       
  3436         view.resize(300, 300);
       
  3437         view.show();
  3436 #ifdef Q_WS_X11
  3438 #ifdef Q_WS_X11
  3437     qt_x11_wait_for_window_manager(&view);
  3439         qt_x11_wait_for_window_manager(&view);
  3438 #endif
  3440 #endif
  3439     QApplication::setActiveWindow(&view);
  3441         QApplication::setActiveWindow(&view);
  3440     QTest::qWait(25);
  3442         QTest::qWait(25);
  3441     QTRY_COMPARE(QApplication::activeWindow(), &view);
  3443         QTRY_COMPARE(QApplication::activeWindow(), &view);
  3442 
  3444 
  3443     QVERIFY(!proxy->hasFocus());
  3445         QVERIFY(!proxy->hasFocus());
  3444     QVERIFY(!proxy->widget()->hasFocus());
  3446         QVERIFY(!proxy->widget()->hasFocus());
  3445 
  3447 
  3446     QCOMPARE(proxySpy.counts[QEvent::FocusIn], 0);
  3448         QCOMPARE(proxySpy.counts[QEvent::FocusIn], 0);
  3447     QCOMPARE(proxySpy.counts[QEvent::FocusOut], 0);
  3449         QCOMPARE(proxySpy.counts[QEvent::FocusOut], 0);
  3448     QCOMPARE(widgetSpy.counts[QEvent::FocusIn], 0);
  3450         QCOMPARE(widgetSpy.counts[QEvent::FocusIn], 0);
  3449     QCOMPARE(widgetSpy.counts[QEvent::FocusOut], 0);
  3451         QCOMPARE(widgetSpy.counts[QEvent::FocusOut], 0);
  3450 
  3452 
  3451     QPointF lineEditCenter = proxy->mapToScene(proxy->boundingRect().center());
  3453         QPointF lineEditCenter = proxy->mapToScene(proxy->boundingRect().center());
  3452     // Spontaneous mouse click sets focus on a clickable widget.
  3454         // Spontaneous mouse click sets focus on a clickable widget.
  3453     for (int retry = 0; retry < 50 && !proxy->hasFocus(); retry++)
  3455         for (int retry = 0; retry < 50 && !proxy->hasFocus(); retry++)
  3454         QTest::mouseClick(view.viewport(), Qt::LeftButton, 0, view.mapFromScene(lineEditCenter));
  3456             QTest::mouseClick(view.viewport(), Qt::LeftButton, 0, view.mapFromScene(lineEditCenter));
  3455     QVERIFY(proxy->hasFocus());
       
  3456     QVERIFY(proxy->widget()->hasFocus());
       
  3457     QCOMPARE(proxySpy.counts[QEvent::FocusIn], 1);
       
  3458     QCOMPARE(widgetSpy.counts[QEvent::FocusIn], 1);
       
  3459 
       
  3460     scene.setFocusItem(0);
       
  3461     QVERIFY(!proxy->hasFocus());
       
  3462     QVERIFY(!proxy->widget()->hasFocus());
       
  3463     QCOMPARE(proxySpy.counts[QEvent::FocusOut], 1);
       
  3464     QCOMPARE(widgetSpy.counts[QEvent::FocusOut], 1);
       
  3465 
       
  3466     // Non-spontaneous mouse click sets focus if the widget has been clicked before
       
  3467     {
       
  3468         QGraphicsSceneMouseEvent event(QEvent::GraphicsSceneMousePress);
       
  3469         event.setScenePos(lineEditCenter);
       
  3470         event.setButton(Qt::LeftButton);
       
  3471         qApp->sendEvent(&scene, &event);
       
  3472         QVERIFY(proxy->hasFocus());
  3457         QVERIFY(proxy->hasFocus());
  3473         QVERIFY(proxy->widget()->hasFocus());
  3458         QVERIFY(proxy->widget()->hasFocus());
  3474         QCOMPARE(proxySpy.counts[QEvent::FocusIn], 2);
  3459         QCOMPARE(proxySpy.counts[QEvent::FocusIn], 1);
  3475         QCOMPARE(widgetSpy.counts[QEvent::FocusIn], 2);
  3460         QCOMPARE(widgetSpy.counts[QEvent::FocusIn], 1);
       
  3461 
       
  3462         scene.setFocusItem(0);
       
  3463         QVERIFY(!proxy->hasFocus());
       
  3464         QVERIFY(!proxy->widget()->hasFocus());
       
  3465         QCOMPARE(proxySpy.counts[QEvent::FocusOut], 1);
       
  3466         QCOMPARE(widgetSpy.counts[QEvent::FocusOut], 1);
       
  3467 
       
  3468         // Non-spontaneous mouse click sets focus if the widget has been clicked before
       
  3469         {
       
  3470             QGraphicsSceneMouseEvent event(QEvent::GraphicsSceneMousePress);
       
  3471             event.setScenePos(lineEditCenter);
       
  3472             event.setButton(Qt::LeftButton);
       
  3473             qApp->sendEvent(&scene, &event);
       
  3474             QVERIFY(proxy->hasFocus());
       
  3475             QVERIFY(proxy->widget()->hasFocus());
       
  3476             QCOMPARE(proxySpy.counts[QEvent::FocusIn], 2);
       
  3477             QCOMPARE(widgetSpy.counts[QEvent::FocusIn], 2);
       
  3478         }
  3476     }
  3479     }
  3477 
  3480 
  3478     scene.setFocusItem(0);
  3481     scene.setFocusItem(0);
  3479     proxy->setWidget(new QLineEdit); // resets focusWidget
  3482     proxy->setWidget(new QLineEdit); // resets focusWidget
  3480     QVERIFY(!proxy->hasFocus());
  3483 
  3481     QVERIFY(!proxy->widget()->hasFocus());
       
  3482     QCOMPARE(proxySpy.counts[QEvent::FocusOut], 2);
       
  3483     QCOMPARE(widgetSpy.counts[QEvent::FocusOut], 2);
       
  3484 
       
  3485     // Non-spontaneous mouse click does not set focus on the embedded widget.
       
  3486     {
  3484     {
  3487         QGraphicsSceneMouseEvent event(QEvent::GraphicsSceneMousePress);
  3485         QPointF lineEditCenter = proxy->mapToScene(proxy->boundingRect().center());
  3488         event.setScenePos(lineEditCenter);
  3486         EventSpy proxySpy(proxy);
  3489         event.setButton(Qt::LeftButton);
  3487         EventSpy widgetSpy(proxy->widget());
  3490         qApp->sendEvent(&scene, &event);
       
  3491         QVERIFY(!proxy->hasFocus());
  3488         QVERIFY(!proxy->hasFocus());
  3492         QVERIFY(!proxy->widget()->hasFocus());
  3489         QVERIFY(!proxy->widget()->hasFocus());
  3493         QCOMPARE(proxySpy.counts[QEvent::FocusIn], 2);
  3490         QCOMPARE(proxySpy.counts[QEvent::FocusOut], 0);
  3494         QCOMPARE(widgetSpy.counts[QEvent::FocusIn], 2);
  3491         QCOMPARE(widgetSpy.counts[QEvent::FocusOut], 0);
  3495     }
  3492 
  3496 
  3493         // Non-spontaneous mouse click does not set focus on the embedded widget.
  3497     scene.setFocusItem(0);
  3494         {
  3498     QVERIFY(!proxy->hasFocus());
  3495             QGraphicsSceneMouseEvent event(QEvent::GraphicsSceneMousePress);
  3499     QVERIFY(!proxy->widget()->hasFocus());
  3496             event.setScenePos(lineEditCenter);
  3500     QCOMPARE(proxySpy.counts[QEvent::FocusOut], 2);
  3497             event.setButton(Qt::LeftButton);
  3501     QCOMPARE(widgetSpy.counts[QEvent::FocusOut], 2);
  3498             qApp->sendEvent(&scene, &event);
  3502 
  3499             QVERIFY(!proxy->hasFocus());
  3503     // Spontaneous click on non-clickable widget does not give focus.
  3500             QVERIFY(!proxy->widget()->hasFocus());
  3504     proxy->widget()->setFocusPolicy(Qt::NoFocus);
  3501             QCOMPARE(proxySpy.counts[QEvent::FocusIn], 0);
  3505     QTest::mouseClick(view.viewport(), Qt::LeftButton, 0, view.mapFromScene(lineEditCenter));
  3502             QCOMPARE(widgetSpy.counts[QEvent::FocusIn], 0);
  3506     QVERIFY(!proxy->hasFocus());
  3503         }
  3507     QVERIFY(!proxy->widget()->hasFocus());
  3504 
       
  3505         scene.setFocusItem(0);
       
  3506         QVERIFY(!proxy->hasFocus());
       
  3507         QVERIFY(!proxy->widget()->hasFocus());
       
  3508         QCOMPARE(proxySpy.counts[QEvent::FocusOut], 0);
       
  3509         QCOMPARE(widgetSpy.counts[QEvent::FocusOut], 0);
       
  3510 
       
  3511         // Spontaneous click on non-clickable widget does not give focus.
       
  3512         proxy->widget()->setFocusPolicy(Qt::NoFocus);
       
  3513         QTest::mouseClick(view.viewport(), Qt::LeftButton, 0, view.mapFromScene(lineEditCenter));
       
  3514         QVERIFY(!proxy->hasFocus());
       
  3515         QVERIFY(!proxy->widget()->hasFocus());
       
  3516 
       
  3517         // Multiple clicks should only result in one FocusIn.
       
  3518         proxy->widget()->setFocusPolicy(Qt::StrongFocus);
       
  3519         scene.setFocusItem(0);
       
  3520         QVERIFY(!proxy->hasFocus());
       
  3521         QVERIFY(!proxy->widget()->hasFocus());
       
  3522         QTest::mouseClick(view.viewport(), Qt::LeftButton, 0, view.mapFromScene(lineEditCenter));
       
  3523         QTest::mouseClick(view.viewport(), Qt::LeftButton, 0, view.mapFromScene(lineEditCenter));
       
  3524         QVERIFY(proxy->hasFocus());
       
  3525         QVERIFY(proxy->widget()->hasFocus());
       
  3526         QCOMPARE(widgetSpy.counts[QEvent::FocusIn], 1);
       
  3527         QCOMPARE(proxySpy.counts[QEvent::FocusIn], 1);
       
  3528     }
  3508 }
  3529 }
  3509 
  3530 
  3510 void tst_QGraphicsProxyWidget::windowFrameMargins()
  3531 void tst_QGraphicsProxyWidget::windowFrameMargins()
  3511 {
  3532 {
  3512     // Make sure the top margin is non-zero when passing Qt::Window.
  3533     // Make sure the top margin is non-zero when passing Qt::Window.