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. |