diff options
author | Jo Asplin <jo.asplin@nokia.com> | 2011-10-20 13:17:26 +0200 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2011-10-20 19:45:41 +0200 |
commit | 9f1aa866bda7678261f2f441d4cfd5bb524c2411 (patch) | |
tree | 5028f578122e7feb9200d571405494c73d96db89 /tests/auto/qwidget/tst_qwidget.cpp | |
parent | 78d02e93aca5325fc5be9bfd275862795207abaa (diff) |
Moved tests into integrationtests/ and widgets/
Task-number: QTBUG-19013
Change-Id: Ibb776f5967c0645ce6d22ef7afdc40657c575461
Reviewed-by: Holger Ihrig <holger.ihrig@nokia.com>
Diffstat (limited to 'tests/auto/qwidget/tst_qwidget.cpp')
-rw-r--r-- | tests/auto/qwidget/tst_qwidget.cpp | 9472 |
1 files changed, 0 insertions, 9472 deletions
diff --git a/tests/auto/qwidget/tst_qwidget.cpp b/tests/auto/qwidget/tst_qwidget.cpp deleted file mode 100644 index ded0c5e061..0000000000 --- a/tests/auto/qwidget/tst_qwidget.cpp +++ /dev/null @@ -1,9472 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - - -#include <qboxlayout.h> -#include <qapplication.h> -#include <qbitmap.h> -#include <qdebug.h> -#include <qeventloop.h> -#include <qlabel.h> -#include <qlayout.h> -#include <qlineedit.h> -#include <qlistview.h> -#include <qmessagebox.h> -#include <qpainter.h> -#include <qpoint.h> -#include <qpushbutton.h> -#include <qstyle.h> -#include <qwidget.h> -#include <qwindowsstyle.h> -#include <qinputcontext.h> -#include <qdesktopwidget.h> -#include <private/qwidget_p.h> -#include <private/qapplication_p.h> -#include <qcalendarwidget.h> -#include <qmainwindow.h> -#include <qdockwidget.h> -#include <qtoolbar.h> -#include <QtGui/qpaintengine.h> -#include <QtGui/qbackingstore.h> -#include <QtGui/qguiapplication.h> -#include <qmenubar.h> -#include <qtableview.h> - -#include <QtWidgets/QGraphicsView> -#include <QtWidgets/QGraphicsProxyWidget> - -#ifdef Q_WS_QWS -# include <qscreen_qws.h> -#endif - -// I *MUST* have QtTest afterwards or this test won't work with newer headers -#if defined(Q_WS_MAC) -# include <private/qt_mac_p.h> -#undef verify -#include "tst_qwidget_mac_helpers.h" // Abstract the ObjC stuff out so not everyone must run an ObjC++ compile. -#endif - -#include <QtTest/QtTest> - -#if defined(Q_OS_WIN) -# include <QtCore/qt_windows.h> -# include <QtGui/private/qguiapplication_p.h> -# include <QtGui/QPlatformNativeInterface> -# include <QtGui/QPlatformIntegration> - -static HWND winHandleOf(const QWidget *w) -{ - static QPlatformNativeInterface *nativeInterface - = QGuiApplicationPrivate::instance()->platformIntegration()->nativeInterface(); - if (void *handle = nativeInterface->nativeResourceForWindow("handle", w->window()->windowHandle())) - return reinterpret_cast<HWND>(handle); - qWarning() << "Cannot obtain native handle for " << w; - return 0; -} -#endif - -#if defined(Q_WS_WIN) -# include <qt_windows.h> -# if !defined(Q_OS_WINCE) -#define Q_CHECK_PAINTEVENTS \ - if (::SwitchDesktop(::GetThreadDesktop(::GetCurrentThreadId())) == 0) \ - QSKIP("desktop is not visible, this test would fail", SkipSingle); -# else -# define Q_CHECK_PAINTEVENTS -# endif -#elif defined(Q_WS_X11) -# include <private/qt_x11_p.h> -# include <qx11info_x11.h> -#elif defined(Q_WS_QWS) -# include <qwindowsystem_qws.h> -#endif - -#if !defined(Q_WS_WIN) -#define Q_CHECK_PAINTEVENTS -#endif - -#if defined(Q_OS_WINCE_WM) -#include <qguifunctions_wince.h> -// taken from qguifunctions_wce.cpp -#define SPI_GETPLATFORMTYPE 257 -bool qt_wince_is_platform(const QString &platformString) { - wchar_t tszPlatform[64]; - if (SystemParametersInfo(SPI_GETPLATFORMTYPE, - sizeof(tszPlatform)/sizeof(*tszPlatform),tszPlatform,0)) - if (0 == _tcsicmp(reinterpret_cast<const wchar_t *> (platformString.utf16()), tszPlatform)) - return true; - return false; -} -bool qt_wince_is_smartphone() { - return qt_wince_is_platform(QString::fromLatin1("Smartphone")); -} -#endif - -#ifdef Q_WS_MAC -#include <Security/AuthSession.h> -bool macHasAccessToWindowsServer() -{ - SecuritySessionId mySession; - SessionAttributeBits sessionInfo; - SessionGetInfo(callerSecuritySession, &mySession, &sessionInfo); - return (sessionInfo & sessionHasGraphicAccess); -} -#endif - - -#if defined(Bool) -#undef Bool -#endif - -//TESTED_CLASS= -//TESTED_FILES= - -class tst_QWidget : public QObject -{ - Q_OBJECT - -public: - tst_QWidget(); - virtual ~tst_QWidget(); - -public slots: - void initTestCase(); - void cleanupTestCase(); - void init(); - void cleanup(); -private slots: - void getSetCheck(); - void fontPropagation(); - void fontPropagation2(); - void palettePropagation(); - void palettePropagation2(); - void enabledPropagation(); -#ifndef QT_NO_DRAGANDDROP - void acceptDropsPropagation(); -#endif - void isEnabledTo(); - void visible(); - void visible_setWindowOpacity(); - void isVisibleTo(); - void isHidden(); - void fonts(); - void mapFromAndTo_data(); - void mapFromAndTo(); - void focusChainOnHide(); - void focusChainOnReparent(); - void setTabOrder(); -#ifdef Q_WS_WIN - void activation(); -#endif - void reparent(); -#ifndef Q_WS_X11 - void windowState(); -#endif - void showMaximized(); - void showFullScreen(); - void showMinimized(); - void showMinimizedKeepsFocus(); -#ifndef Q_WS_QWS - void icon(); -#endif - void hideWhenFocusWidgetIsChild(); -#ifndef Q_OS_IRIX - void normalGeometry(); -#endif - void setGeometry(); -#ifndef Q_OS_WINCE - void windowOpacity(); -#endif - void raise(); - void lower(); -#ifndef QT_MAC_USE_COCOA - void stackUnder(); -#endif - void testContentsPropagation(); -#ifndef Q_OS_IRIX - void saveRestoreGeometry(); - void restoreVersion1Geometry_data(); - void restoreVersion1Geometry(); -#endif - - void widgetAt(); -#ifdef Q_WS_MAC - void retainHIView(); - void sheetOpacity(); - void setMask(); -#endif - void optimizedResizeMove(); - void optimizedResize_topLevel(); - void resizeEvent(); - void task110173(); - - void testDeletionInEventHandlers(); - - void childDeletesItsSibling(); - - void setMinimumSize(); - void setMaximumSize(); - void setFixedSize(); - - void ensureCreated(); - void winIdChangeEvent(); - void persistentWinId(); - void showNativeChild(); - void qobject_castInDestroyedSlot(); - - void showHideEvent_data(); - void showHideEvent(); - - void lostUpdatesOnHide(); - - void update(); - void isOpaque(); - -#ifndef Q_WS_MAC - void scroll(); -#endif - -#ifndef Q_WS_X11 - // tests QWidget::setGeometry() - void setWindowGeometry_data(); - void setWindowGeometry(); -#endif - -#if !defined(Q_WS_X11) && !defined(Q_OS_IRIX) - // tests QWidget::move() and resize() - void windowMoveResize_data(); - void windowMoveResize(); -#endif - - void moveChild_data(); - void moveChild(); - void showAndMoveChild(); - -#ifndef QT_MAC_USE_COCOA - void subtractOpaqueSiblings(); -#endif - -#ifdef Q_WS_WIN - void getDC(); -#ifndef Q_OS_WINCE - void setGeometry_win(); -#endif -#endif - - void setLocale(); - void deleteStyle(); - void multipleToplevelFocusCheck(); - void setFocus(); - void setCursor(); - void setToolTip(); - void testWindowIconChangeEventPropagation(); -#ifdef Q_WS_X11 - void minAndMaxSizeWithX11BypassWindowManagerHint(); - void showHideShow(); - void clean_qt_x11_enforce_cursor(); -#endif - - void compatibilityChildInsertedEvents(); - void render(); - void renderInvisible(); - void renderWithPainter(); - void render_task188133(); - void render_task211796(); - void render_task217815(); -#ifndef Q_OS_WINCE - void render_windowOpacity(); -#endif - void render_systemClip(); - void render_systemClip2_data(); - void render_systemClip2(); - void render_systemClip3_data(); - void render_systemClip3(); - void render_task252837(); - void render_worldTransform(); - - void setContentsMargins(); - -#ifndef Q_OS_IRIX - void moveWindowInShowEvent_data(); - void moveWindowInShowEvent(); -#endif - - void repaintWhenChildDeleted(); - void hideOpaqueChildWhileHidden(); -#if !defined(Q_OS_WINCE) && !defined(Q_WS_QWS) - void updateWhileMinimized(); -#endif -#if defined(Q_WS_WIN) || defined(Q_WS_X11) - void alienWidgets(); -#endif - void adjustSize(); - void adjustSize_data(); - void updateGeometry(); - void updateGeometry_data(); - void sendUpdateRequestImmediately(); -#ifndef Q_OS_IRIX - void doubleRepaint(); -#endif -#ifndef Q_WS_MAC - void resizeInPaintEvent(); - void opaqueChildren(); -#endif - - void setMaskInResizeEvent(); - void moveInResizeEvent(); - -#if defined(Q_WS_WIN) || defined(Q_WS_X11) - // We don't support immediate repaint right after show on - // other platforms. Must be compatible with Qt 4.3. - void immediateRepaintAfterShow(); - void immediateRepaintAfterInvalidateBuffer(); -#endif - void effectiveWinId(); - void effectiveWinId2(); - void customDpi(); - void customDpiProperty(); - - void quitOnCloseAttribute(); - void moveRect(); - -#if defined (Q_WS_WIN) - void gdiPainting(); - void paintOnScreenPossible(); -#endif - void reparentStaticWidget(); - void QTBUG6883_reparentStaticWidget2(); -#ifdef Q_WS_QWS - void updateOutsideSurfaceClip(); -#endif - void translucentWidget(); - - void setClearAndResizeMask(); - void maskedUpdate(); -#if defined(Q_WS_X11) || (defined(Q_WS_WIN) && !defined(Q_OS_WINCE_WM)) || defined(Q_WS_QWS) || defined(Q_WS_QPA) - void syntheticEnterLeave(); - void taskQTBUG_4055_sendSyntheticEnterLeave(); -#endif - void windowFlags(); - void initialPosForDontShowOnScreenWidgets(); -#ifdef Q_WS_X11 - void paintOutsidePaintEvent(); -#endif - void updateOnDestroyedSignal(); - void toplevelLineEditFocus(); - void inputFocus_task257832(); - - void focusWidget_task254563(); -#ifndef Q_OS_WINCE_WM - void rectOutsideCoordinatesLimit_task144779(); -#endif - void setGraphicsEffect(); - -#ifdef QT_BUILD_INTERNAL - void destroyBackingStore(); -#endif - - void activateWindow(); - - void openModal_taskQTBUG_5804(); - - void focusProxyAndInputMethods(); -#ifdef QT_BUILD_INTERNAL - void scrollWithoutBackingStore(); -#endif - - void taskQTBUG_7532_tabOrderWithFocusProxy(); - void movedAndResizedAttributes(); - void childAt(); -#ifdef Q_WS_MAC - void childAt_unifiedToolBar(); - void taskQTBUG_11373(); -#endif - void taskQTBUG_17333_ResizeInfiniteRecursion(); - - void nativeChildFocus(); - -private: - bool ensureScreenSize(int width, int height); - QWidget *testWidget; -}; - -bool tst_QWidget::ensureScreenSize(int width, int height) -{ - QSize available; -#ifdef Q_WS_QWS - available = QDesktopWidget().availableGeometry().size(); - if (available.width() < width || available.height() < height) { - QScreen *screen = QScreen::instance(); - if (!screen) - return false; - screen->setMode(width, height, screen->depth()); - } -#endif // Q_WS_QWS - - available = QDesktopWidget().availableGeometry().size(); - return (available.width() >= width && available.height() >= height); -} - -class MyInputContext : public QInputContext -{ -public: - MyInputContext() : QInputContext() {} - QString identifierName() { return QString("NoName"); } - QString language() { return QString("NoLanguage"); } - void reset() {} - bool isComposing() const { return false; } -}; - -// Testing get/set functions -void tst_QWidget::getSetCheck() -{ - QWidget obj1; - QWidget child1(&obj1); - // QStyle * QWidget::style() - // void QWidget::setStyle(QStyle *) - QWindowsStyle *var1 = new QWindowsStyle; - obj1.setStyle(var1); - QCOMPARE(static_cast<QStyle *>(var1), obj1.style()); - obj1.setStyle((QStyle *)0); - QVERIFY(var1 != obj1.style()); - QVERIFY(0 != obj1.style()); // style can never be 0 for a widget - - // int QWidget::minimumWidth() - // void QWidget::setMinimumWidth(int) - obj1.setMinimumWidth(0); - QCOMPARE(obj1.minimumWidth(), 0); - obj1.setMinimumWidth(INT_MIN); - QCOMPARE(obj1.minimumWidth(), 0); // A widgets width can never be less than 0 - obj1.setMinimumWidth(INT_MAX); -#ifndef Q_WS_QWS //QWS doesn't allow toplevels to be bigger than the screen - QCOMPARE(obj1.minimumWidth(), QWIDGETSIZE_MAX); // The largest minimum size should only be as big as the maximium -#endif - - child1.setMinimumWidth(0); - QCOMPARE(child1.minimumWidth(), 0); - child1.setMinimumWidth(INT_MIN); - QCOMPARE(child1.minimumWidth(), 0); // A widgets width can never be less than 0 - child1.setMinimumWidth(INT_MAX); - QCOMPARE(child1.minimumWidth(), QWIDGETSIZE_MAX); // The largest minimum size should only be as big as the maximium - - // int QWidget::minimumHeight() - // void QWidget::setMinimumHeight(int) - obj1.setMinimumHeight(0); - QCOMPARE(obj1.minimumHeight(), 0); - obj1.setMinimumHeight(INT_MIN); - QCOMPARE(obj1.minimumHeight(), 0); // A widgets height can never be less than 0 - obj1.setMinimumHeight(INT_MAX); -#ifndef Q_WS_QWS //QWS doesn't allow toplevels to be bigger than the screen - QCOMPARE(obj1.minimumHeight(), QWIDGETSIZE_MAX); // The largest minimum size should only be as big as the maximium -#endif - - child1.setMinimumHeight(0); - QCOMPARE(child1.minimumHeight(), 0); - child1.setMinimumHeight(INT_MIN); - QCOMPARE(child1.minimumHeight(), 0); // A widgets height can never be less than 0 - child1.setMinimumHeight(INT_MAX); - QCOMPARE(child1.minimumHeight(), QWIDGETSIZE_MAX); // The largest minimum size should only be as big as the maximium - - // int QWidget::maximumWidth() - // void QWidget::setMaximumWidth(int) - obj1.setMaximumWidth(0); - QCOMPARE(obj1.maximumWidth(), 0); - obj1.setMaximumWidth(INT_MIN); - QCOMPARE(obj1.maximumWidth(), 0); // A widgets width can never be less than 0 - obj1.setMaximumWidth(INT_MAX); - QCOMPARE(obj1.maximumWidth(), QWIDGETSIZE_MAX); // QWIDGETSIZE_MAX is the abs max, not INT_MAX - - // int QWidget::maximumHeight() - // void QWidget::setMaximumHeight(int) - obj1.setMaximumHeight(0); - QCOMPARE(obj1.maximumHeight(), 0); - obj1.setMaximumHeight(INT_MIN); - QCOMPARE(obj1.maximumHeight(), 0); // A widgets height can never be less than 0 - obj1.setMaximumHeight(INT_MAX); - QCOMPARE(obj1.maximumHeight(), QWIDGETSIZE_MAX); // QWIDGETSIZE_MAX is the abs max, not INT_MAX - - // back to normal - obj1.setMinimumWidth(0); - obj1.setMinimumHeight(0); - obj1.setMaximumWidth(QWIDGETSIZE_MAX); - obj1.setMaximumHeight(QWIDGETSIZE_MAX); - - // const QPalette & QWidget::palette() - // void QWidget::setPalette(const QPalette &) - QPalette var6; - obj1.setPalette(var6); - QCOMPARE(var6, obj1.palette()); - obj1.setPalette(QPalette()); - QCOMPARE(QPalette(), obj1.palette()); - - // const QFont & QWidget::font() - // void QWidget::setFont(const QFont &) - QFont var7; - obj1.setFont(var7); - QCOMPARE(var7, obj1.font()); - obj1.setFont(QFont()); - QCOMPARE(QFont(), obj1.font()); - - // qreal QWidget::windowOpacity() - // void QWidget::setWindowOpacity(qreal) - obj1.setWindowOpacity(0.0); - QCOMPARE(0.0, obj1.windowOpacity()); - obj1.setWindowOpacity(1.1f); - QCOMPARE(1.0, obj1.windowOpacity()); // 1.0 is the fullest opacity possible - - // QWidget * QWidget::focusProxy() - // void QWidget::setFocusProxy(QWidget *) - QWidget *var9 = new QWidget(); - obj1.setFocusProxy(var9); - QCOMPARE(var9, obj1.focusProxy()); - obj1.setFocusProxy((QWidget *)0); - QCOMPARE((QWidget *)0, obj1.focusProxy()); - delete var9; - - // const QRect & QWidget::geometry() - // void QWidget::setGeometry(const QRect &) - qApp->processEvents(); - QRect var10(10, 10, 100, 100); - obj1.setGeometry(var10); - qApp->processEvents(); - qDebug() << obj1.geometry(); - QCOMPARE(var10, obj1.geometry()); - obj1.setGeometry(QRect(0,0,0,0)); - qDebug() << obj1.geometry(); - QCOMPARE(QRect(0,0,0,0), obj1.geometry()); - - // QLayout * QWidget::layout() - // void QWidget::setLayout(QLayout *) - QBoxLayout *var11 = new QBoxLayout(QBoxLayout::LeftToRight); - obj1.setLayout(var11); - QCOMPARE(static_cast<QLayout *>(var11), obj1.layout()); - obj1.setLayout((QLayout *)0); - QCOMPARE(static_cast<QLayout *>(var11), obj1.layout()); // You cannot set a 0-pointer layout, that keeps the current - delete var11; // This will remove the layout from the widget - QCOMPARE((QLayout *)0, obj1.layout()); - - // bool QWidget::acceptDrops() - // void QWidget::setAcceptDrops(bool) - obj1.setAcceptDrops(false); - QCOMPARE(false, obj1.acceptDrops()); - obj1.setAcceptDrops(true); - QCOMPARE(true, obj1.acceptDrops()); - - // QInputContext * QWidget::inputContext() - MyInputContext *var13 = new MyInputContext; - qApp->setInputContext(var13); - QCOMPARE((QInputContext *)0, obj1.inputContext()); // The widget by default doesn't have the WA_InputMethodEnabled attribute - obj1.setAttribute(Qt::WA_InputMethodEnabled); - QCOMPARE(static_cast<QInputContext *>(var13), obj1.inputContext()); - - // bool QWidget::autoFillBackground() - // void QWidget::setAutoFillBackground(bool) - obj1.setAutoFillBackground(false); - QCOMPARE(false, obj1.autoFillBackground()); - obj1.setAutoFillBackground(true); - QCOMPARE(true, obj1.autoFillBackground()); - - delete var1; -#if defined (Q_WS_WIN) && !defined(Q_OS_WINCE) - obj1.setWindowFlags(Qt::FramelessWindowHint | Qt::WindowSystemMenuHint); - HWND handle = obj1.winId(); - long flags = GetWindowLong(handle, GWL_STYLE); - QVERIFY(flags & WS_POPUP); -#endif -} - -tst_QWidget::tst_QWidget() -{ - QFont font; - font.setBold(true); - font.setPointSize(42); - qApp->setFont(font, "QPropagationTestWidget"); - - QPalette palette; - palette.setColor(QPalette::ToolTipBase, QColor(12, 13, 14)); - palette.setColor(QPalette::Text, QColor(21, 22, 23)); - qApp->setPalette(palette, "QPropagationTestWidget"); - - testWidget = 0; -} - -tst_QWidget::~tst_QWidget() -{ -} - -class BezierViewer : public QWidget { -public: - BezierViewer( QWidget* parent=0, const char* name=0 ); - void paintEvent( QPaintEvent* ); - void setPoints( const QPolygonF& poly ); -private: - QPolygonF points; - -}; - -void tst_QWidget::initTestCase() -{ -#ifdef Q_OS_WINCE //disable magic for WindowsCE - qApp->setAutoMaximizeThreshold(-1); -#endif - // Create the test class - testWidget = new BezierViewer( 0, "testObject"); - testWidget->resize(200,200); - testWidget->show(); - QTest::qWaitForWindowShown(testWidget); - QTest::qWait(50); -} - -void tst_QWidget::cleanupTestCase() -{ - delete testWidget; - testWidget = 0; -} - -void tst_QWidget::init() -{ -// TODO: Add initialization code here. -// This will be executed immediately before each test is run. - testWidget->setFont(QFont()); - testWidget->setPalette(QPalette()); -} - -void tst_QWidget::cleanup() -{ -} - -// Helper class... - -BezierViewer::BezierViewer( QWidget* parent, const char* name ) - : QWidget( parent ) -{ - setObjectName(name); - QPalette pal; - pal.setColor(backgroundRole(), Qt::white); - setPalette(pal); -} - - -void BezierViewer::setPoints( const QPolygonF& a ) -{ - points = a; -} - -#include "private/qbezier_p.h" -void BezierViewer::paintEvent( QPaintEvent* ) -{ - if ( points.size() != 4 ) { -#if defined(QT_CHECK_RANGE) - qWarning( "QPolygon::bezier: The array must have 4 control points" ); -#endif - return; - } - - /* Calculate Bezier curve */ - QPolygonF bezier = QBezier::fromPoints(points.at(0),points.at(1),points.at(2),points.at(3)).toPolygon(); - - QPainter painter( this ); - - /* Calculate scale to fit in window */ - QRectF br = bezier.boundingRect() | points.boundingRect(); - QRectF pr = rect(); - int scl = qMax( qMin(pr.width()/br.width(), pr.height()/br.height()), qreal(1.) ); - int border = scl-1; - - /* Scale Bezier curve vertices */ - for ( QPolygonF::Iterator it = bezier.begin(); it != bezier.end(); ++it ) { - it->setX( (it->x()-br.x()) * scl + border ); - it->setY( (it->y()-br.y()) * scl + border ); - } - - /* Draw grid */ - painter.setPen( Qt::lightGray ); - int i; - for ( i = border; i <= pr.width(); i += scl ) { - painter.drawLine( i, 0, i, pr.height() ); - } - for ( int j = border; j <= pr.height(); j += scl ) { - painter.drawLine( 0, j, pr.width(), j ); - } - - /* Write number of vertices */ - painter.setPen( Qt::red ); - painter.setFont( QFont("Helvetica", 14, QFont::DemiBold, TRUE ) ); - QString caption; - caption.setNum( bezier.size() ); - caption += QString::fromLatin1( " vertices" ); - painter.drawText( 10, pr.height()-10, caption ); - - /* Draw Bezier curve */ - painter.setPen( Qt::black ); - painter.drawPolyline( bezier ); - - /* Scale and draw control points */ - painter.setPen( Qt::darkGreen ); - for ( QPolygonF::Iterator p1 = points.begin(); p1 != points.end(); ++p1 ) { - int x = (p1->x()-br.x()) * scl + border; - int y = (p1->y()-br.y()) * scl + border; - painter.drawLine( x-4, y-4, x+4, y+4 ); - painter.drawLine( x+4, y-4, x-4, y+4 ); - } - - /* Draw vertices */ - painter.setPen( Qt::red ); - painter.setBrush( Qt::red ); - for ( QPolygonF::Iterator p2 = bezier.begin(); p2 != bezier.end(); ++p2 ) - painter.drawEllipse( p2->x()-1, p2->y()-1, 3, 3 ); -} - -void tst_QWidget::fontPropagation() -{ - QFont font = testWidget->font(); - QWidget* childWidget = new QWidget( testWidget ); - childWidget->show(); - QCOMPARE( font, childWidget->font() ); - - font.setBold( TRUE ); - testWidget->setFont( font ); - QCOMPARE( font, testWidget->font() ); - QCOMPARE( font, childWidget->font() ); - - QFont newFont = font; - newFont.setItalic( TRUE ); - childWidget->setFont( newFont ); - QWidget* grandChildWidget = new QWidget( childWidget ); - QCOMPARE( font, testWidget->font() ); - QCOMPARE( newFont, grandChildWidget->font() ); - - font.setUnderline( TRUE ); - testWidget->setFont( font ); - - // the child and grand child should now have merged bold and - // underline - newFont.setUnderline( TRUE ); - - QCOMPARE( newFont, childWidget->font() ); - QCOMPARE( newFont, grandChildWidget->font() ); - - // make sure font propagation continues working after reparenting - font = testWidget->font(); - font.setPointSize(font.pointSize() + 2); - testWidget->setFont(font); - - QWidget *one = new QWidget(testWidget); - QWidget *two = new QWidget(one); - QWidget *three = new QWidget(two); - QWidget *four = new QWidget(two); - - four->setParent(three); - four->move(QPoint(0,0)); - - font.setPointSize(font.pointSize() + 2); - testWidget->setFont(font); - - QCOMPARE(testWidget->font(), one->font()); - QCOMPARE(one->font(), two->font()); - QCOMPARE(two->font(), three->font()); - QCOMPARE(three->font(), four->font()); - - QVERIFY(testWidget->testAttribute(Qt::WA_SetFont)); - QVERIFY(! one->testAttribute(Qt::WA_SetFont)); - QVERIFY(! two->testAttribute(Qt::WA_SetFont)); - QVERIFY(! three->testAttribute(Qt::WA_SetFont)); - QVERIFY(! four->testAttribute(Qt::WA_SetFont)); - - font.setPointSize(font.pointSize() + 2); - one->setFont(font); - - QCOMPARE(one->font(), two->font()); - QCOMPARE(two->font(), three->font()); - QCOMPARE(three->font(), four->font()); - - QVERIFY(one->testAttribute(Qt::WA_SetFont)); - QVERIFY(! two->testAttribute(Qt::WA_SetFont)); - QVERIFY(! three->testAttribute(Qt::WA_SetFont)); - QVERIFY(! four->testAttribute(Qt::WA_SetFont)); - - font.setPointSize(font.pointSize() + 2); - two->setFont(font); - - QCOMPARE(two->font(), three->font()); - QCOMPARE(three->font(), four->font()); - - QVERIFY(two->testAttribute(Qt::WA_SetFont)); - QVERIFY(! three->testAttribute(Qt::WA_SetFont)); - QVERIFY(! four->testAttribute(Qt::WA_SetFont)); - - font.setPointSize(font.pointSize() + 2); - three->setFont(font); - - QCOMPARE(three->font(), four->font()); - - QVERIFY(three->testAttribute(Qt::WA_SetFont)); - QVERIFY(! four->testAttribute(Qt::WA_SetFont)); - - font.setPointSize(font.pointSize() + 2); - four->setFont(font); - - QVERIFY(four->testAttribute(Qt::WA_SetFont)); -} - -class QPropagationTestWidget : public QWidget -{ - Q_OBJECT -public: - QPropagationTestWidget(QWidget *parent = 0) - : QWidget(parent) - { } -}; - -void tst_QWidget::fontPropagation2() -{ - // ! Note, the code below is executed in tst_QWidget's constructor. - // QFont font; - // font.setBold(true); - // font.setPointSize(42); - // qApp->setFont(font, "QPropagationTestWidget"); - - QWidget *root = new QWidget; - QWidget *child0 = new QWidget(root); - QWidget *child1 = new QWidget(child0); - QWidget *child2 = new QPropagationTestWidget(child1); - QWidget *child3 = new QWidget(child2); - QWidget *child4 = new QWidget(child3); - QWidget *child5 = new QWidget(child4); - root->show(); - - // Check that only the application fonts apply. - QCOMPARE(root->font(), QApplication::font()); - QCOMPARE(child0->font(), QApplication::font()); - QCOMPARE(child1->font(), QApplication::font()); - QCOMPARE(child2->font().pointSize(), 42); - QVERIFY(child2->font().bold()); - QCOMPARE(child3->font().pointSize(), 42); - QVERIFY(child3->font().bold()); - QCOMPARE(child4->font().pointSize(), 42); - QVERIFY(child4->font().bold()); - QCOMPARE(child5->font().pointSize(), 42); - QVERIFY(child5->font().bold()); - - // Set child0's font size to 15, and remove bold on child4. - QFont font; - font.setPointSize(15); - child0->setFont(font); - QFont unboldFont; - unboldFont.setBold(false); - child4->setFont(unboldFont); - - // Check that the above settings propagate correctly. - QCOMPARE(root->font(), QApplication::font()); - QCOMPARE(child0->font().pointSize(), 15); - QVERIFY(!child0->font().bold()); - QCOMPARE(child1->font().pointSize(), 15); - QVERIFY(!child1->font().bold()); - QCOMPARE(child2->font().pointSize(), 15); - QVERIFY(child2->font().bold()); - QCOMPARE(child3->font().pointSize(), 15); - QVERIFY(child3->font().bold()); - QCOMPARE(child4->font().pointSize(), 15); - QVERIFY(!child4->font().bold()); - QCOMPARE(child5->font().pointSize(), 15); - QVERIFY(!child5->font().bold()); - - // Replace the app font for child2. Italic should propagate - // but the size should still be ignored. The previous bold - // setting is gone. - QFont italicSizeFont; - italicSizeFont.setItalic(true); - italicSizeFont.setPointSize(33); - qApp->setFont(italicSizeFont, "QPropagationTestWidget"); - - // Check that this propagates correctly. - QCOMPARE(root->font(), QApplication::font()); - QCOMPARE(child0->font().pointSize(), 15); - QVERIFY(!child0->font().bold()); - QVERIFY(!child0->font().italic()); - QCOMPARE(child1->font().pointSize(), 15); - QVERIFY(!child1->font().bold()); - QVERIFY(!child1->font().italic()); - QCOMPARE(child2->font().pointSize(), 15); - QVERIFY(!child2->font().bold()); - QVERIFY(child2->font().italic()); - QCOMPARE(child3->font().pointSize(), 15); - QVERIFY(!child3->font().bold()); - QVERIFY(child3->font().italic()); - QCOMPARE(child4->font().pointSize(), 15); - QVERIFY(!child4->font().bold()); - QVERIFY(child4->font().italic()); - QCOMPARE(child5->font().pointSize(), 15); - QVERIFY(!child5->font().bold()); - QVERIFY(child5->font().italic()); -} - -void tst_QWidget::palettePropagation() -{ - QPalette palette = testWidget->palette(); - QWidget* childWidget = new QWidget( testWidget ); - childWidget->show(); - QCOMPARE( palette, childWidget->palette() ); - - palette.setColor( QPalette::Base, Qt::red ); - testWidget->setPalette( palette ); - QCOMPARE( palette, testWidget->palette() ); - QCOMPARE( palette, childWidget->palette() ); - - QPalette newPalette = palette; - newPalette.setColor( QPalette::Highlight, Qt::green ); - childWidget->setPalette( newPalette ); - QWidget* grandChildWidget = new QWidget( childWidget ); - QCOMPARE( palette, testWidget->palette() ); - QCOMPARE( newPalette, grandChildWidget->palette() ); - - palette.setColor( QPalette::Text, Qt::blue ); - testWidget->setPalette( palette ); - - // the child and grand child should now have merged green - // highlight and blue text - newPalette.setColor( QPalette::Text, Qt::blue); - - QCOMPARE( newPalette, childWidget->palette() ); - QCOMPARE( newPalette, grandChildWidget->palette() ); -} - -void tst_QWidget::palettePropagation2() -{ - // ! Note, the code below is executed in tst_QWidget's constructor. - // QPalette palette; - // font.setColor(QPalette::ToolTipBase, QColor(12, 13, 14)); - // font.setColor(QPalette::Text, QColor(21, 22, 23)); - // qApp->setPalette(palette, "QPropagationTestWidget"); - - QWidget *root = new QWidget; - QWidget *child0 = new QWidget(root); - QWidget *child1 = new QWidget(child0); - QWidget *child2 = new QPropagationTestWidget(child1); - QWidget *child3 = new QWidget(child2); - QWidget *child4 = new QWidget(child3); - QWidget *child5 = new QWidget(child4); - root->show(); - QTest::qWait(100); - - // These colors are unlikely to be imposed on the default palette of - // QWidget ;-). - QColor sysPalText(21, 22, 23); - QColor sysPalToolTipBase(12, 13, 14); - QColor overridePalText(42, 43, 44); - QColor overridePalToolTipBase(45, 46, 47); - QColor sysPalButton(99, 98, 97); - - // Check that only the application fonts apply. - QPalette appPal = QApplication::palette(); - QCOMPARE(root->palette(), appPal); - QCOMPARE(child0->palette(), appPal); - QCOMPARE(child1->palette(), appPal); - QCOMPARE(child2->palette().color(QPalette::ToolTipBase), sysPalToolTipBase); - QCOMPARE(child2->palette().color(QPalette::Text), sysPalText); - QCOMPARE(child2->palette().color(QPalette::ToolTipText), appPal.color(QPalette::ToolTipText)); - QCOMPARE(child3->palette().color(QPalette::ToolTipBase), sysPalToolTipBase); - QCOMPARE(child3->palette().color(QPalette::Text), sysPalText); - QCOMPARE(child3->palette().color(QPalette::ToolTipText), appPal.color(QPalette::ToolTipText)); - QCOMPARE(child4->palette().color(QPalette::ToolTipBase), sysPalToolTipBase); - QCOMPARE(child4->palette().color(QPalette::Text), sysPalText); - QCOMPARE(child4->palette().color(QPalette::ToolTipText), appPal.color(QPalette::ToolTipText)); - QCOMPARE(child5->palette().color(QPalette::ToolTipBase), sysPalToolTipBase); - QCOMPARE(child5->palette().color(QPalette::Text), sysPalText); - QCOMPARE(child5->palette().color(QPalette::ToolTipText), appPal.color(QPalette::ToolTipText)); - - // Set child0's Text, and set ToolTipBase on child4. - QPalette textPalette; - textPalette.setColor(QPalette::Text, overridePalText); - child0->setPalette(textPalette); - QPalette toolTipPalette; - toolTipPalette.setColor(QPalette::ToolTipBase, overridePalToolTipBase); - child4->setPalette(toolTipPalette); - - // Check that the above settings propagate correctly. - QCOMPARE(root->palette(), appPal); - QCOMPARE(child0->palette().color(QPalette::Text), overridePalText); - QCOMPARE(child0->palette().color(QPalette::ToolTipBase), appPal.color(QPalette::ToolTipBase)); - QCOMPARE(child0->palette().color(QPalette::ToolTipText), appPal.color(QPalette::ToolTipText)); - QCOMPARE(child1->palette().color(QPalette::Text), overridePalText); - QCOMPARE(child1->palette().color(QPalette::ToolTipBase), appPal.color(QPalette::ToolTipBase)); - QCOMPARE(child1->palette().color(QPalette::ToolTipText), appPal.color(QPalette::ToolTipText)); - QCOMPARE(child2->palette().color(QPalette::Text), overridePalText); - QCOMPARE(child2->palette().color(QPalette::ToolTipBase), sysPalToolTipBase); - QCOMPARE(child2->palette().color(QPalette::ToolTipText), appPal.color(QPalette::ToolTipText)); - QCOMPARE(child3->palette().color(QPalette::Text), overridePalText); - QCOMPARE(child3->palette().color(QPalette::ToolTipBase), sysPalToolTipBase); - QCOMPARE(child3->palette().color(QPalette::ToolTipText), appPal.color(QPalette::ToolTipText)); - QCOMPARE(child4->palette().color(QPalette::Text), overridePalText); - QCOMPARE(child4->palette().color(QPalette::ToolTipBase), overridePalToolTipBase); - QCOMPARE(child4->palette().color(QPalette::ToolTipText), appPal.color(QPalette::ToolTipText)); - QCOMPARE(child5->palette().color(QPalette::Text), overridePalText); - QCOMPARE(child5->palette().color(QPalette::ToolTipBase), overridePalToolTipBase); - QCOMPARE(child5->palette().color(QPalette::ToolTipText), appPal.color(QPalette::ToolTipText)); - - // Replace the app palette for child2. Button should propagate but Text - // should still be ignored. The previous ToolTipBase setting is gone. - QPalette buttonPalette; - buttonPalette.setColor(QPalette::ToolTipText, sysPalButton); - qApp->setPalette(buttonPalette, "QPropagationTestWidget"); - - // Check that the above settings propagate correctly. - QCOMPARE(root->palette(), appPal); - QCOMPARE(child0->palette().color(QPalette::Text), overridePalText); - QCOMPARE(child0->palette().color(QPalette::ToolTipBase), appPal.color(QPalette::ToolTipBase)); - QCOMPARE(child0->palette().color(QPalette::ToolTipText), appPal.color(QPalette::ToolTipText)); - QCOMPARE(child1->palette().color(QPalette::Text), overridePalText); - QCOMPARE(child1->palette().color(QPalette::ToolTipBase), appPal.color(QPalette::ToolTipBase)); - QCOMPARE(child1->palette().color(QPalette::ToolTipText), appPal.color(QPalette::ToolTipText)); - QCOMPARE(child2->palette().color(QPalette::Text), overridePalText); - QCOMPARE(child2->palette().color(QPalette::ToolTipBase), appPal.color(QPalette::ToolTipBase)); - QCOMPARE(child2->palette().color(QPalette::ToolTipText), sysPalButton); - QCOMPARE(child3->palette().color(QPalette::Text), overridePalText); - QCOMPARE(child3->palette().color(QPalette::ToolTipBase), appPal.color(QPalette::ToolTipBase)); - QCOMPARE(child3->palette().color(QPalette::ToolTipText), sysPalButton); - QCOMPARE(child4->palette().color(QPalette::Text), overridePalText); - QCOMPARE(child4->palette().color(QPalette::ToolTipBase), overridePalToolTipBase); - QCOMPARE(child4->palette().color(QPalette::ToolTipText), sysPalButton); - QCOMPARE(child5->palette().color(QPalette::Text), overridePalText); - QCOMPARE(child5->palette().color(QPalette::ToolTipBase), overridePalToolTipBase); - QCOMPARE(child5->palette().color(QPalette::ToolTipText), sysPalButton); -} - -void tst_QWidget::enabledPropagation() -{ - QWidget* childWidget = new QWidget( testWidget ); - childWidget->show(); - QVERIFY( testWidget->isEnabled() ); - QVERIFY( childWidget->isEnabled() ); - - testWidget->setEnabled( FALSE ); - QVERIFY( !testWidget->isEnabled() ); - QVERIFY( !childWidget->isEnabled() ); - - testWidget->setDisabled( FALSE ); - QVERIFY( testWidget->isEnabled() ); - QVERIFY( childWidget->isEnabled() ); - - QWidget* grandChildWidget = new QWidget( childWidget ); - QVERIFY( grandChildWidget->isEnabled() ); - - testWidget->setDisabled( TRUE ); - QVERIFY( !testWidget->isEnabled() ); - QVERIFY( !childWidget->isEnabled() ); - QVERIFY( !grandChildWidget->isEnabled() ); - - grandChildWidget->setEnabled( FALSE ); - testWidget->setEnabled( TRUE ); - QVERIFY( testWidget->isEnabled() ); - QVERIFY( childWidget->isEnabled() ); - QVERIFY( !grandChildWidget->isEnabled() ); - - grandChildWidget->setEnabled( TRUE ); - testWidget->setEnabled( FALSE ); - childWidget->setDisabled( TRUE ); - testWidget->setEnabled( TRUE ); - QVERIFY( testWidget->isEnabled() ); - QVERIFY( !childWidget->isEnabled() ); - QVERIFY( !grandChildWidget->isEnabled() ); -} - -// Drag'n drop disabled in this build. -#ifndef QT_NO_DRAGANDDROP -void tst_QWidget::acceptDropsPropagation() -{ - QWidget *childWidget = new QWidget(testWidget); - childWidget->show(); - QVERIFY(!testWidget->acceptDrops()); - QVERIFY(!childWidget->acceptDrops()); - - testWidget->setAcceptDrops(true); - QVERIFY(testWidget->acceptDrops()); - QVERIFY(!childWidget->acceptDrops()); - QVERIFY(childWidget->testAttribute(Qt::WA_DropSiteRegistered)); - - testWidget->setAcceptDrops(false); - QVERIFY(!testWidget->acceptDrops()); - QVERIFY(!childWidget->acceptDrops()); - QVERIFY(!childWidget->testAttribute(Qt::WA_DropSiteRegistered)); - - QWidget *grandChildWidget = new QWidget(childWidget); - QVERIFY(!grandChildWidget->acceptDrops()); - QVERIFY(!grandChildWidget->testAttribute(Qt::WA_DropSiteRegistered)); - - testWidget->setAcceptDrops(true); - QVERIFY(testWidget->acceptDrops()); - QVERIFY(!childWidget->acceptDrops()); - QVERIFY(childWidget->testAttribute(Qt::WA_DropSiteRegistered)); - QVERIFY(!grandChildWidget->acceptDrops()); - QVERIFY(grandChildWidget->testAttribute(Qt::WA_DropSiteRegistered)); - - grandChildWidget->setAcceptDrops(true); - testWidget->setAcceptDrops(false); - QVERIFY(!testWidget->acceptDrops()); - QVERIFY(!childWidget->acceptDrops()); - QVERIFY(grandChildWidget->acceptDrops()); - QVERIFY(grandChildWidget->testAttribute(Qt::WA_DropSiteRegistered)); - - grandChildWidget->setAcceptDrops(false); - QVERIFY(!grandChildWidget->testAttribute(Qt::WA_DropSiteRegistered)); - testWidget->setAcceptDrops(true); - childWidget->setAcceptDrops(true); - testWidget->setAcceptDrops(false); - QVERIFY(!testWidget->acceptDrops()); - QVERIFY(childWidget->acceptDrops()); - QVERIFY(!grandChildWidget->acceptDrops()); - QVERIFY(grandChildWidget->testAttribute(Qt::WA_DropSiteRegistered)); -} -#endif - -void tst_QWidget::isEnabledTo() -{ - QWidget* childWidget = new QWidget( testWidget ); - QWidget* grandChildWidget = new QWidget( childWidget ); - - QVERIFY( childWidget->isEnabledTo( testWidget ) ); - QVERIFY( grandChildWidget->isEnabledTo( testWidget ) ); - - childWidget->setEnabled( FALSE ); - QVERIFY( !childWidget->isEnabledTo( testWidget ) ); - QVERIFY( grandChildWidget->isEnabledTo( childWidget ) ); - QVERIFY( !grandChildWidget->isEnabledTo( testWidget ) ); -} - -void tst_QWidget::visible() -{ - // Ensure that the testWidget is hidden for this test at the - // start - - testWidget->hide(); - QVERIFY( !testWidget->isVisible() ); - QWidget* childWidget = new QWidget( testWidget ); - QVERIFY( !childWidget->isVisible() ); - - testWidget->show(); - QVERIFY( testWidget->isVisible() ); - QVERIFY( childWidget->isVisible() ); - - QWidget* grandChildWidget = new QWidget( childWidget ); - QVERIFY( !grandChildWidget->isVisible() ); - grandChildWidget->show(); - QVERIFY( grandChildWidget->isVisible() ); - - grandChildWidget->hide(); - testWidget->hide(); - testWidget->show(); - QVERIFY( !grandChildWidget->isVisible() ); - QVERIFY( testWidget->isVisible() ); - QVERIFY( childWidget->isVisible() ); - - grandChildWidget->show(); - childWidget->hide(); - testWidget->hide(); - testWidget->show(); - QVERIFY( testWidget->isVisible() ); - QVERIFY( !childWidget->isVisible() ); - QVERIFY( !grandChildWidget->isVisible() ); - - grandChildWidget->show(); - QVERIFY( !grandChildWidget->isVisible() ); -} - -void tst_QWidget::setLocale() -{ - QWidget w; - QCOMPARE(w.locale(), QLocale()); - - w.setLocale(QLocale::Italian); - QCOMPARE(w.locale(), QLocale(QLocale::Italian)); - - QWidget child1(&w); - QCOMPARE(child1.locale(), QLocale(QLocale::Italian)); - - w.unsetLocale(); - QCOMPARE(w.locale(), QLocale()); - QCOMPARE(child1.locale(), QLocale()); - - w.setLocale(QLocale::French); - QCOMPARE(w.locale(), QLocale(QLocale::French)); - QCOMPARE(child1.locale(), QLocale(QLocale::French)); - - child1.setLocale(QLocale::Italian); - QCOMPARE(w.locale(), QLocale(QLocale::French)); - QCOMPARE(child1.locale(), QLocale(QLocale::Italian)); - - child1.unsetLocale(); - QCOMPARE(w.locale(), QLocale(QLocale::French)); - QCOMPARE(child1.locale(), QLocale(QLocale::French)); - - QWidget child2; - QCOMPARE(child2.locale(), QLocale()); - child2.setParent(&w); - QCOMPARE(child2.locale(), QLocale(QLocale::French)); -} - -void tst_QWidget::visible_setWindowOpacity() -{ - testWidget->hide(); - QVERIFY( !testWidget->isVisible() ); - testWidget->setWindowOpacity(0.5); -#ifdef Q_OS_WIN - QVERIFY(::IsWindowVisible(winHandleOf(testWidget)) == FALSE); -#endif - testWidget->setWindowOpacity(1.0); -} - -void tst_QWidget::isVisibleTo() -{ - // Ensure that the testWidget is hidden for this test at the - // start - - testWidget->hide(); - QWidget* childWidget = new QWidget( testWidget ); - QVERIFY( childWidget->isVisibleTo( testWidget ) ); - childWidget->hide(); - QVERIFY( !childWidget->isVisibleTo( testWidget ) ); - - QWidget* grandChildWidget = new QWidget( childWidget ); - QVERIFY( !grandChildWidget->isVisibleTo( testWidget ) ); - QVERIFY( grandChildWidget->isVisibleTo( childWidget ) ); - - testWidget->show(); - childWidget->show(); - - QVERIFY( childWidget->isVisibleTo( testWidget ) ); - grandChildWidget->hide(); - QVERIFY( !grandChildWidget->isVisibleTo( childWidget ) ); - QVERIFY( !grandChildWidget->isVisibleTo( testWidget ) ); - -} - -void tst_QWidget::isHidden() -{ - // Ensure that the testWidget is hidden for this test at the - // start - - testWidget->hide(); - QVERIFY( testWidget->isHidden() ); - QWidget* childWidget = new QWidget( testWidget ); - QVERIFY( !childWidget->isHidden() ); - - testWidget->show(); - QVERIFY( !testWidget->isHidden() ); - QVERIFY( !childWidget->isHidden() ); - - QWidget* grandChildWidget = new QWidget( childWidget ); - QVERIFY( grandChildWidget->isHidden() ); - grandChildWidget->show(); - QVERIFY( !grandChildWidget->isHidden() ); - - grandChildWidget->hide(); - testWidget->hide(); - testWidget->show(); - QVERIFY( grandChildWidget->isHidden() ); - QVERIFY( !testWidget->isHidden() ); - QVERIFY( !childWidget->isHidden() ); - - grandChildWidget->show(); - childWidget->hide(); - testWidget->hide(); - testWidget->show(); - QVERIFY( !testWidget->isHidden() ); - QVERIFY( childWidget->isHidden() ); - QVERIFY( !grandChildWidget->isHidden() ); - - grandChildWidget->show(); - QVERIFY( !grandChildWidget->isHidden() ); -} - -void tst_QWidget::fonts() -{ - // Tests setFont(), ownFont() and unsetFont() - QWidget* cleanTestWidget = new QWidget( testWidget ); - QFont originalFont = cleanTestWidget->font(); - - QVERIFY( !cleanTestWidget->testAttribute(Qt::WA_SetFont) ); - cleanTestWidget->setFont(QFont()); - QVERIFY( !cleanTestWidget->testAttribute(Qt::WA_SetFont) ); - - QFont newFont( "times", 18 ); - cleanTestWidget->setFont( newFont ); - newFont = newFont.resolve( testWidget->font() ); - - QVERIFY( cleanTestWidget->testAttribute(Qt::WA_SetFont) ); - QVERIFY( cleanTestWidget->font() == newFont ); - - cleanTestWidget->setFont(QFont()); - QVERIFY( !cleanTestWidget->testAttribute(Qt::WA_SetFont) ); - QVERIFY( cleanTestWidget->font() == originalFont ); -} - -void tst_QWidget::mapFromAndTo_data() -{ - QTest::addColumn<bool>("windowHidden"); - QTest::addColumn<bool>("subWindow1Hidden"); - QTest::addColumn<bool>("subWindow2Hidden"); - QTest::addColumn<bool>("subSubWindowHidden"); - QTest::addColumn<bool>("windowMinimized"); - QTest::addColumn<bool>("subWindow1Minimized"); - - QTest::newRow("window 1 sub1 1 sub2 1 subsub 1") << false << false << false << false << false << false; - QTest::newRow("window 0 sub1 1 sub2 1 subsub 1") << true << false << false << false << false << false; - QTest::newRow("window 1 sub1 0 sub2 1 subsub 1") << false << true << false << false << false << false; - QTest::newRow("window 0 sub1 0 sub2 1 subsub 1") << true << true << false << false << false << false; - QTest::newRow("window 1 sub1 1 sub2 0 subsub 1") << false << false << true << false << false << false; - QTest::newRow("window 0 sub1 1 sub2 0 subsub 1") << true << false << true << false << false << false; - QTest::newRow("window 1 sub1 0 sub2 0 subsub 1") << false << true << true << false << false << false; - QTest::newRow("window 0 sub1 0 sub2 0 subsub 1") << true << true << true << false << false << false; - QTest::newRow("window 1 sub1 1 sub2 1 subsub 0") << false << false << false << true << false << false; - QTest::newRow("window 0 sub1 1 sub2 1 subsub 0") << true << false << false << true << false << false; - QTest::newRow("window 1 sub1 0 sub2 1 subsub 0") << false << true << false << true << false << false; - QTest::newRow("window 0 sub1 0 sub2 1 subsub 0") << true << true << false << true << false << false; - QTest::newRow("window 1 sub1 1 sub2 0 subsub 0") << false << false << true << true << false << false; - QTest::newRow("window 0 sub1 1 sub2 0 subsub 0") << true << false << true << true << false << false; - QTest::newRow("window 1 sub1 0 sub2 0 subsub 0") << false << true << true << true << false << false; - QTest::newRow("window 0 sub1 0 sub2 0 subsub 0") << true << true << true << true << false << false; - QTest::newRow("window 1 sub1 1 sub2 1 subsub 1 windowMinimized") << false << false << false << false << true << false; - QTest::newRow("window 0 sub1 1 sub2 1 subsub 1 windowMinimized") << true << false << false << false << true << false; - QTest::newRow("window 1 sub1 0 sub2 1 subsub 1 windowMinimized") << false << true << false << false << true << false; - QTest::newRow("window 0 sub1 0 sub2 1 subsub 1 windowMinimized") << true << true << false << false << true << false; - QTest::newRow("window 1 sub1 1 sub2 0 subsub 1 windowMinimized") << false << false << true << false << true << false; - QTest::newRow("window 0 sub1 1 sub2 0 subsub 1 windowMinimized") << true << false << true << false << true << false; - QTest::newRow("window 1 sub1 0 sub2 0 subsub 1 windowMinimized") << false << true << true << false << true << false; - QTest::newRow("window 0 sub1 0 sub2 0 subsub 1 windowMinimized") << true << true << true << false << true << false; - QTest::newRow("window 1 sub1 1 sub2 1 subsub 0 windowMinimized") << false << false << false << true << true << false; - QTest::newRow("window 0 sub1 1 sub2 1 subsub 0 windowMinimized") << true << false << false << true << true << false; - QTest::newRow("window 1 sub1 0 sub2 1 subsub 0 windowMinimized") << false << true << false << true << true << false; - QTest::newRow("window 0 sub1 0 sub2 1 subsub 0 windowMinimized") << true << true << false << true << true << false; - QTest::newRow("window 1 sub1 1 sub2 0 subsub 0 windowMinimized") << false << false << true << true << true << false; - QTest::newRow("window 0 sub1 1 sub2 0 subsub 0 windowMinimized") << true << false << true << true << true << false; - QTest::newRow("window 1 sub1 0 sub2 0 subsub 0 windowMinimized") << false << true << true << true << true << false; - QTest::newRow("window 0 sub1 0 sub2 0 subsub 0 windowMinimized") << true << true << true << true << true << false; - QTest::newRow("window 1 sub1 1 sub2 1 subsub 1 subWindow1Minimized") << false << false << false << false << false << true; - QTest::newRow("window 0 sub1 1 sub2 1 subsub 1 subWindow1Minimized") << true << false << false << false << false << true; - QTest::newRow("window 1 sub1 0 sub2 1 subsub 1 subWindow1Minimized") << false << true << false << false << false << true; - QTest::newRow("window 0 sub1 0 sub2 1 subsub 1 subWindow1Minimized") << true << true << false << false << false << true; - QTest::newRow("window 1 sub1 1 sub2 0 subsub 1 subWindow1Minimized") << false << false << true << false << false << true; - QTest::newRow("window 0 sub1 1 sub2 0 subsub 1 subWindow1Minimized") << true << false << true << false << false << true; - QTest::newRow("window 1 sub1 0 sub2 0 subsub 1 subWindow1Minimized") << false << true << true << false << false << true; - QTest::newRow("window 0 sub1 0 sub2 0 subsub 1 subWindow1Minimized") << true << true << true << false << false << true; - QTest::newRow("window 1 sub1 1 sub2 1 subsub 0 subWindow1Minimized") << false << false << false << true << false << true; - QTest::newRow("window 0 sub1 1 sub2 1 subsub 0 subWindow1Minimized") << true << false << false << true << false << true; - QTest::newRow("window 1 sub1 0 sub2 1 subsub 0 subWindow1Minimized") << false << true << false << true << false << true; - QTest::newRow("window 0 sub1 0 sub2 1 subsub 0 subWindow1Minimized") << true << true << false << true << false << true; - QTest::newRow("window 1 sub1 1 sub2 0 subsub 0 subWindow1Minimized") << false << false << true << true << false << true; - QTest::newRow("window 0 sub1 1 sub2 0 subsub 0 subWindow1Minimized") << true << false << true << true << false << true; - QTest::newRow("window 1 sub1 0 sub2 0 subsub 0 subWindow1Minimized") << false << true << true << true << false << true; - QTest::newRow("window 0 sub1 0 sub2 0 subsub 0 subWindow1Minimized") << true << true << true << true << false << true; - - -} - -void tst_QWidget::mapFromAndTo() -{ - QFETCH(bool, windowHidden); - QFETCH(bool, subWindow1Hidden); - QFETCH(bool, subWindow2Hidden); - QFETCH(bool, subSubWindowHidden); - QFETCH(bool, windowMinimized); - QFETCH(bool, subWindow1Minimized); - - // create a toplevel and two overlapping siblings - QWidget window; - window.setWindowFlags(window.windowFlags() | Qt::X11BypassWindowManagerHint); - QWidget *subWindow1 = new QWidget(&window); - QWidget *subWindow2 = new QWidget(&window); - QWidget *subSubWindow = new QWidget(subWindow1); - - // set their geometries - window.setGeometry(100, 100, 100, 100); - subWindow1->setGeometry(50, 50, 100, 100); - subWindow2->setGeometry(75, 75, 100, 100); - subSubWindow->setGeometry(10, 10, 10, 10); - -#if !defined (Q_OS_WINCE) //still no proper minimizing - //update visibility - if (windowMinimized) { - if (!windowHidden) { - window.showMinimized(); - QVERIFY(window.isMinimized()); - } - } else { - window.setVisible(!windowHidden); - } - if (subWindow1Minimized) { - subWindow1->hide(); - subWindow1->showMinimized(); - QVERIFY(subWindow1->isMinimized()); - } else { - subWindow1->setVisible(!subWindow1Hidden); - } -#else - Q_UNUSED(windowHidden); - Q_UNUSED(subWindow1Hidden); - Q_UNUSED(windowMinimized); - Q_UNUSED(subWindow1Minimized); -#endif - - subWindow2->setVisible(!subWindow2Hidden); - subSubWindow->setVisible(!subSubWindowHidden); - - // window - QCOMPARE(window.mapToGlobal(QPoint(0, 0)), QPoint(100, 100)); - QCOMPARE(window.mapToGlobal(QPoint(10, 0)), QPoint(110, 100)); - QCOMPARE(window.mapToGlobal(QPoint(0, 10)), QPoint(100, 110)); - QCOMPARE(window.mapToGlobal(QPoint(-10, 0)), QPoint(90, 100)); - QCOMPARE(window.mapToGlobal(QPoint(0, -10)), QPoint(100, 90)); - QCOMPARE(window.mapToGlobal(QPoint(100, 100)), QPoint(200, 200)); - QCOMPARE(window.mapToGlobal(QPoint(110, 100)), QPoint(210, 200)); - QCOMPARE(window.mapToGlobal(QPoint(100, 110)), QPoint(200, 210)); - QCOMPARE(window.mapFromGlobal(QPoint(100, 100)), QPoint(0, 0)); - QCOMPARE(window.mapFromGlobal(QPoint(110, 100)), QPoint(10, 0)); - QCOMPARE(window.mapFromGlobal(QPoint(100, 110)), QPoint(0, 10)); - QCOMPARE(window.mapFromGlobal(QPoint(90, 100)), QPoint(-10, 0)); - QCOMPARE(window.mapFromGlobal(QPoint(100, 90)), QPoint(0, -10)); - QCOMPARE(window.mapFromGlobal(QPoint(200, 200)), QPoint(100, 100)); - QCOMPARE(window.mapFromGlobal(QPoint(210, 200)), QPoint(110, 100)); - QCOMPARE(window.mapFromGlobal(QPoint(200, 210)), QPoint(100, 110)); - QCOMPARE(window.mapToParent(QPoint(0, 0)), QPoint(100, 100)); - QCOMPARE(window.mapToParent(QPoint(10, 0)), QPoint(110, 100)); - QCOMPARE(window.mapToParent(QPoint(0, 10)), QPoint(100, 110)); - QCOMPARE(window.mapToParent(QPoint(-10, 0)), QPoint(90, 100)); - QCOMPARE(window.mapToParent(QPoint(0, -10)), QPoint(100, 90)); - QCOMPARE(window.mapToParent(QPoint(100, 100)), QPoint(200, 200)); - QCOMPARE(window.mapToParent(QPoint(110, 100)), QPoint(210, 200)); - QCOMPARE(window.mapToParent(QPoint(100, 110)), QPoint(200, 210)); - QCOMPARE(window.mapFromParent(QPoint(100, 100)), QPoint(0, 0)); - QCOMPARE(window.mapFromParent(QPoint(110, 100)), QPoint(10, 0)); - QCOMPARE(window.mapFromParent(QPoint(100, 110)), QPoint(0, 10)); - QCOMPARE(window.mapFromParent(QPoint(90, 100)), QPoint(-10, 0)); - QCOMPARE(window.mapFromParent(QPoint(100, 90)), QPoint(0, -10)); - QCOMPARE(window.mapFromParent(QPoint(200, 200)), QPoint(100, 100)); - QCOMPARE(window.mapFromParent(QPoint(210, 200)), QPoint(110, 100)); - QCOMPARE(window.mapFromParent(QPoint(200, 210)), QPoint(100, 110)); - - // first subwindow - QCOMPARE(subWindow1->mapToGlobal(QPoint(0, 0)), QPoint(150, 150)); - QCOMPARE(subWindow1->mapToGlobal(QPoint(10, 0)), QPoint(160, 150)); - QCOMPARE(subWindow1->mapToGlobal(QPoint(0, 10)), QPoint(150, 160)); - QCOMPARE(subWindow1->mapToGlobal(QPoint(-10, 0)), QPoint(140, 150)); - QCOMPARE(subWindow1->mapToGlobal(QPoint(0, -10)), QPoint(150, 140)); - QCOMPARE(subWindow1->mapToGlobal(QPoint(100, 100)), QPoint(250, 250)); - QCOMPARE(subWindow1->mapToGlobal(QPoint(110, 100)), QPoint(260, 250)); - QCOMPARE(subWindow1->mapToGlobal(QPoint(100, 110)), QPoint(250, 260)); - QCOMPARE(subWindow1->mapFromGlobal(QPoint(150, 150)), QPoint(0, 0)); - QCOMPARE(subWindow1->mapFromGlobal(QPoint(160, 150)), QPoint(10, 0)); - QCOMPARE(subWindow1->mapFromGlobal(QPoint(150, 160)), QPoint(0, 10)); - QCOMPARE(subWindow1->mapFromGlobal(QPoint(140, 150)), QPoint(-10, 0)); - QCOMPARE(subWindow1->mapFromGlobal(QPoint(150, 140)), QPoint(0, -10)); - QCOMPARE(subWindow1->mapFromGlobal(QPoint(250, 250)), QPoint(100, 100)); - QCOMPARE(subWindow1->mapFromGlobal(QPoint(260, 250)), QPoint(110, 100)); - QCOMPARE(subWindow1->mapFromGlobal(QPoint(250, 260)), QPoint(100, 110)); - QCOMPARE(subWindow1->mapToParent(QPoint(0, 0)), QPoint(50, 50)); - QCOMPARE(subWindow1->mapToParent(QPoint(10, 0)), QPoint(60, 50)); - QCOMPARE(subWindow1->mapToParent(QPoint(0, 10)), QPoint(50, 60)); - QCOMPARE(subWindow1->mapToParent(QPoint(-10, 0)), QPoint(40, 50)); - QCOMPARE(subWindow1->mapToParent(QPoint(0, -10)), QPoint(50, 40)); - QCOMPARE(subWindow1->mapToParent(QPoint(100, 100)), QPoint(150, 150)); - QCOMPARE(subWindow1->mapToParent(QPoint(110, 100)), QPoint(160, 150)); - QCOMPARE(subWindow1->mapToParent(QPoint(100, 110)), QPoint(150, 160)); - QCOMPARE(subWindow1->mapFromParent(QPoint(50, 50)), QPoint(0, 0)); - QCOMPARE(subWindow1->mapFromParent(QPoint(60, 50)), QPoint(10, 0)); - QCOMPARE(subWindow1->mapFromParent(QPoint(50, 60)), QPoint(0, 10)); - QCOMPARE(subWindow1->mapFromParent(QPoint(40, 50)), QPoint(-10, 0)); - QCOMPARE(subWindow1->mapFromParent(QPoint(50, 40)), QPoint(0, -10)); - QCOMPARE(subWindow1->mapFromParent(QPoint(150, 150)), QPoint(100, 100)); - QCOMPARE(subWindow1->mapFromParent(QPoint(160, 150)), QPoint(110, 100)); - QCOMPARE(subWindow1->mapFromParent(QPoint(150, 160)), QPoint(100, 110)); - - // subsubwindow - QCOMPARE(subSubWindow->mapToGlobal(QPoint(0, 0)), QPoint(160, 160)); - QCOMPARE(subSubWindow->mapToGlobal(QPoint(10, 0)), QPoint(170, 160)); - QCOMPARE(subSubWindow->mapToGlobal(QPoint(0, 10)), QPoint(160, 170)); - QCOMPARE(subSubWindow->mapToGlobal(QPoint(-10, 0)), QPoint(150, 160)); - QCOMPARE(subSubWindow->mapToGlobal(QPoint(0, -10)), QPoint(160, 150)); - QCOMPARE(subSubWindow->mapToGlobal(QPoint(100, 100)), QPoint(260, 260)); - QCOMPARE(subSubWindow->mapToGlobal(QPoint(110, 100)), QPoint(270, 260)); - QCOMPARE(subSubWindow->mapToGlobal(QPoint(100, 110)), QPoint(260, 270)); - QCOMPARE(subSubWindow->mapFromGlobal(QPoint(160, 160)), QPoint(0, 0)); - QCOMPARE(subSubWindow->mapFromGlobal(QPoint(170, 160)), QPoint(10, 0)); - QCOMPARE(subSubWindow->mapFromGlobal(QPoint(160, 170)), QPoint(0, 10)); - QCOMPARE(subSubWindow->mapFromGlobal(QPoint(150, 160)), QPoint(-10, 0)); - QCOMPARE(subSubWindow->mapFromGlobal(QPoint(160, 150)), QPoint(0, -10)); - QCOMPARE(subSubWindow->mapFromGlobal(QPoint(260, 260)), QPoint(100, 100)); - QCOMPARE(subSubWindow->mapFromGlobal(QPoint(270, 260)), QPoint(110, 100)); - QCOMPARE(subSubWindow->mapFromGlobal(QPoint(260, 270)), QPoint(100, 110)); - QCOMPARE(subSubWindow->mapToParent(QPoint(0, 0)), QPoint(10, 10)); - QCOMPARE(subSubWindow->mapToParent(QPoint(10, 0)), QPoint(20, 10)); - QCOMPARE(subSubWindow->mapToParent(QPoint(0, 10)), QPoint(10, 20)); - QCOMPARE(subSubWindow->mapToParent(QPoint(-10, 0)), QPoint(0, 10)); - QCOMPARE(subSubWindow->mapToParent(QPoint(0, -10)), QPoint(10, 0)); - QCOMPARE(subSubWindow->mapToParent(QPoint(100, 100)), QPoint(110, 110)); - QCOMPARE(subSubWindow->mapToParent(QPoint(110, 100)), QPoint(120, 110)); - QCOMPARE(subSubWindow->mapToParent(QPoint(100, 110)), QPoint(110, 120)); - QCOMPARE(subSubWindow->mapFromParent(QPoint(10, 10)), QPoint(0, 0)); - QCOMPARE(subSubWindow->mapFromParent(QPoint(20, 10)), QPoint(10, 0)); - QCOMPARE(subSubWindow->mapFromParent(QPoint(10, 20)), QPoint(0, 10)); - QCOMPARE(subSubWindow->mapFromParent(QPoint(0, 10)), QPoint(-10, 0)); - QCOMPARE(subSubWindow->mapFromParent(QPoint(10, 0)), QPoint(0, -10)); - QCOMPARE(subSubWindow->mapFromParent(QPoint(110, 110)), QPoint(100, 100)); - QCOMPARE(subSubWindow->mapFromParent(QPoint(120, 110)), QPoint(110, 100)); - QCOMPARE(subSubWindow->mapFromParent(QPoint(110, 120)), QPoint(100, 110)); -} - -void tst_QWidget::focusChainOnReparent() -{ - QWidget window; - QWidget *child1 = new QWidget(&window); - QWidget *child2 = new QWidget(&window); - QWidget *child3 = new QWidget(&window); - QWidget *child21 = new QWidget(child2); - QWidget *child22 = new QWidget(child2); - QWidget *child4 = new QWidget(&window); - - QWidget *expectedOriginalChain[8] = {&window, child1, child2, child3, child21, child22, child4, &window}; - QWidget *w = &window; - for (int i = 0; i <8; ++i) { - QCOMPARE(w, expectedOriginalChain[i]); - w = w->nextInFocusChain(); - } - for (int i = 7; i >= 0; --i) { - w = w->previousInFocusChain(); - QCOMPARE(w, expectedOriginalChain[i]); - } - - QWidget window2; - child2->setParent(&window2); - - QWidget *expectedNewChain[5] = {&window2, child2, child21, child22, &window2}; - w = &window2; - for (int i = 0; i <5; ++i) { - QCOMPARE(w, expectedNewChain[i]); - w = w->nextInFocusChain(); - } - for (int i = 4; i >= 0; --i) { - w = w->previousInFocusChain(); - QCOMPARE(w, expectedNewChain[i]); - } - - QWidget *expectedOldChain[5] = {&window, child1, child3, child4, &window}; - w = &window; - for (int i = 0; i <5; ++i) { - QCOMPARE(w, expectedOldChain[i]); - w = w->nextInFocusChain(); - } - for (int i = 4; i >= 0; --i) { - w = w->previousInFocusChain(); - QCOMPARE(w, expectedOldChain[i]); - } -} - - -void tst_QWidget::focusChainOnHide() -{ - testWidget->hide(); // We do not want to get disturbed by other widgets - // focus should move to the next widget in the focus chain when we hide it. - QWidget *parent = new QWidget(); - parent->setObjectName(QLatin1String("Parent")); - parent->setFocusPolicy(Qt::StrongFocus); - QWidget *child = new QWidget(parent); - child->setObjectName(QLatin1String("child")); - child->setFocusPolicy(Qt::StrongFocus); - QWidget::setTabOrder(child, parent); - - parent->show(); - qApp->setActiveWindow(parent->window()); - child->activateWindow(); - child->setFocus(); - qApp->processEvents(); - - QTRY_COMPARE(child->hasFocus(), true); - child->hide(); - qApp->processEvents(); - - QTRY_COMPARE(parent->hasFocus(), true); - QCOMPARE(parent, qApp->focusWidget()); - - delete parent; - testWidget->show(); //don't disturb later tests -} - -class Container : public QWidget -{ -public: - QVBoxLayout* box; - - Container() - { - box = new QVBoxLayout(this); - //(new QVBoxLayout(this))->setAutoAdd(true); - } - - void tab() - { - focusNextPrevChild(TRUE); - } - - void backTab() - { - focusNextPrevChild(FALSE); - } -}; - -class Composite : public QFrame -{ -public: - Composite(QWidget* parent = 0, const char* name = 0) - : QFrame(parent) - { - setObjectName(name); - //QHBoxLayout* hbox = new QHBoxLayout(this, 2, 0); - //hbox->setAutoAdd(true); - QHBoxLayout* hbox = new QHBoxLayout(this); - - lineEdit = new QLineEdit(this); - hbox->addWidget(lineEdit); - - button = new QPushButton(this); - hbox->addWidget(button); - button->setFocusPolicy( Qt::NoFocus ); - - setFocusProxy( lineEdit ); - setFocusPolicy( Qt::StrongFocus ); - - setTabOrder(lineEdit, button); - } - -private: - QLineEdit* lineEdit; - QPushButton* button; -}; - -#define NUM_WIDGETS 4 - -void tst_QWidget::setTabOrder() -{ - QTest::qWait(100); - - Container container; - - Composite* comp[NUM_WIDGETS]; - - QLineEdit *firstEdit = new QLineEdit(&container); - container.box->addWidget(firstEdit); - - int i = 0; - for(i = 0; i < NUM_WIDGETS; i++) { - comp[i] = new Composite(&container); - container.box->addWidget(comp[i]); - } - - QLineEdit *lastEdit = new QLineEdit(&container); - container.box->addWidget(lastEdit); - - container.setTabOrder(lastEdit, comp[NUM_WIDGETS-1]); - for(i = NUM_WIDGETS-1; i > 0; i--) { - container.setTabOrder(comp[i], comp[i-1]); - } - container.setTabOrder(comp[0], firstEdit); - - int current = NUM_WIDGETS-1; - lastEdit->setFocus(); - - container.show(); - container.activateWindow(); - qApp->setActiveWindow(&container); -#ifdef Q_WS_X11 - QTest::qWaitForWindowShown(&container); - QTest::qWait(50); -#endif - - QTest::qWait(100); - - QTRY_VERIFY(lastEdit->hasFocus()); - container.tab(); - do { - QVERIFY(comp[current]->focusProxy()->hasFocus()); - container.tab(); - current--; - } while (current >= 0); - - QVERIFY(firstEdit->hasFocus()); -} - -#ifdef Q_WS_WIN -void tst_QWidget::activation() -{ - Q_CHECK_PAINTEVENTS - -#if defined(Q_OS_WINCE) - int waitTime = 1000; -#else - int waitTime = 100; -#endif - -#ifdef Q_OS_WINCE - qApp->processEvents(); -#endif - QWidget widget1; - widget1.setWindowTitle("Widget1"); - - QWidget widget2; - widget2.setWindowTitle("Widget2"); - - widget1.show(); - widget2.show(); - - QTest::qWait(waitTime); - QVERIFY(qApp->activeWindow() == &widget2); - widget2.showMinimized(); - QTest::qWait(waitTime); - - QVERIFY(qApp->activeWindow() == &widget1); - widget2.showMaximized(); - QTest::qWait(waitTime); - QVERIFY(qApp->activeWindow() == &widget2); - widget2.showMinimized(); - QTest::qWait(waitTime); - QVERIFY(qApp->activeWindow() == &widget1); - widget2.showNormal(); - QTest::qWait(waitTime); -#if defined(Q_WS_WIN) && !defined(Q_OS_WINCE) - if (QSysInfo::WindowsVersion >= QSysInfo::WV_VISTA) - QEXPECT_FAIL("", "MS introduced new behavior after XP", Continue); -#endif - QTest::qWait(waitTime); - QVERIFY(qApp->activeWindow() == &widget2); - widget2.hide(); - QTest::qWait(waitTime); - QVERIFY(qApp->activeWindow() == &widget1); -} -#endif - -// Many window managers do not support window state properly, which causes this test to fail. -#ifndef Q_WS_X11 -void tst_QWidget::windowState() -{ -#ifdef Q_OS_WINCE_WM - QPoint pos(500, 500); - QSize size(200, 200); - if (qt_wince_is_smartphone()) { //small screen - pos = QPoint(10,10); - size = QSize(100,100); - } -#else - const QPoint pos(500, 500); - const QSize size(200, 200); -#endif - - QWidget widget1; - widget1.move(pos); - widget1.resize(size); - QCOMPARE(widget1.pos(), pos); - QCOMPARE(widget1.size(), size); - QTest::qWait(100); - widget1.setWindowTitle("Widget1"); - QCOMPARE(widget1.pos(), pos); - QCOMPARE(widget1.size(), size); - -#define VERIFY_STATE(s) QCOMPARE(int(widget1.windowState() & stateMask), int(s)) - - const int stateMask = Qt::WindowMaximized|Qt::WindowMinimized|Qt::WindowFullScreen; - - widget1.setWindowState(Qt::WindowMaximized); - QTest::qWait(100); - VERIFY_STATE(Qt::WindowMaximized); - QCOMPARE(widget1.windowHandle()->windowState(), Qt::WindowMaximized); - - widget1.show(); - QTest::qWait(100); - VERIFY_STATE(Qt::WindowMaximized); - QCOMPARE(widget1.windowHandle()->windowState(), Qt::WindowMaximized); - - widget1.setWindowState(widget1.windowState() ^ Qt::WindowMaximized); - QTest::qWait(100); - QVERIFY(!(widget1.windowState() & Qt::WindowMaximized)); - QTRY_COMPARE(widget1.pos(), pos); - QCOMPARE(widget1.windowHandle()->windowState(), Qt::WindowNoState); - - widget1.setWindowState(Qt::WindowMinimized); - QTest::qWait(100); - VERIFY_STATE(Qt::WindowMinimized); - QCOMPARE(widget1.windowHandle()->windowState(), Qt::WindowMinimized); - - widget1.setWindowState(widget1.windowState() | Qt::WindowMaximized); - QTest::qWait(100); - VERIFY_STATE((Qt::WindowMinimized|Qt::WindowMaximized)); - QCOMPARE(widget1.windowHandle()->windowState(), Qt::WindowMinimized); - - widget1.setWindowState(widget1.windowState() ^ Qt::WindowMinimized); - QTest::qWait(100); - VERIFY_STATE(Qt::WindowMaximized); - QCOMPARE(widget1.windowHandle()->windowState(), Qt::WindowMaximized); - - widget1.setWindowState(widget1.windowState() ^ Qt::WindowMaximized); - QTest::qWait(100); - QVERIFY(!(widget1.windowState() & (Qt::WindowMinimized|Qt::WindowMaximized))); - QTRY_COMPARE(widget1.pos(), pos); - QCOMPARE(widget1.windowHandle()->windowState(), Qt::WindowNoState); - - widget1.setWindowState(Qt::WindowFullScreen); - QTest::qWait(100); - VERIFY_STATE(Qt::WindowFullScreen); - QCOMPARE(widget1.windowHandle()->windowState(), Qt::WindowFullScreen); - - widget1.setWindowState(widget1.windowState() ^ Qt::WindowMinimized); - QTest::qWait(100); - VERIFY_STATE((Qt::WindowFullScreen|Qt::WindowMinimized)); - QCOMPARE(widget1.windowHandle()->windowState(), Qt::WindowMinimized); - - widget1.setWindowState(widget1.windowState() ^ Qt::WindowMinimized); - QTest::qWait(100); - VERIFY_STATE(Qt::WindowFullScreen); - QCOMPARE(widget1.windowHandle()->windowState(), Qt::WindowFullScreen); - - widget1.setWindowState(Qt::WindowNoState); - QTest::qWait(100); - VERIFY_STATE(Qt::WindowNoState); - QTRY_COMPARE(widget1.pos(), pos); - QCOMPARE(widget1.windowHandle()->windowState(), Qt::WindowNoState); - - widget1.setWindowState(Qt::WindowFullScreen); - QTest::qWait(100); - VERIFY_STATE(Qt::WindowFullScreen); - QCOMPARE(widget1.windowHandle()->windowState(), Qt::WindowFullScreen); - - widget1.setWindowState(widget1.windowState() ^ Qt::WindowMaximized); - QTest::qWait(100); - VERIFY_STATE((Qt::WindowFullScreen|Qt::WindowMaximized)); - QCOMPARE(widget1.windowHandle()->windowState(), Qt::WindowFullScreen); - - widget1.setWindowState(widget1.windowState() ^ Qt::WindowMinimized); - QTest::qWait(100); - VERIFY_STATE((Qt::WindowFullScreen|Qt::WindowMaximized|Qt::WindowMinimized)); - QCOMPARE(widget1.windowHandle()->windowState(), Qt::WindowMinimized); - - widget1.setWindowState(widget1.windowState() ^ Qt::WindowMinimized); - QTest::qWait(100); - VERIFY_STATE((Qt::WindowFullScreen|Qt::WindowMaximized)); - QCOMPARE(widget1.windowHandle()->windowState(), Qt::WindowFullScreen); - - widget1.setWindowState(widget1.windowState() ^ Qt::WindowFullScreen); - QTest::qWait(100); - VERIFY_STATE(Qt::WindowMaximized); - QCOMPARE(widget1.windowHandle()->windowState(), Qt::WindowMaximized); - - widget1.setWindowState(widget1.windowState() ^ Qt::WindowMaximized); - QTest::qWait(100); - QVERIFY(!(widget1.windowState() & stateMask)); - QCOMPARE(widget1.windowHandle()->windowState(), Qt::WindowNoState); - - QTRY_COMPARE(widget1.pos(), pos); - QTRY_COMPARE(widget1.size(), size); -} -#endif - -void tst_QWidget::showMaximized() -{ - QWidget plain; - QHBoxLayout *layout; - layout = new QHBoxLayout; - QWidget layouted; - QLineEdit le; - QLineEdit le2; - QLineEdit le3; - - layout->addWidget(&le); - layout->addWidget(&le2); - layout->addWidget(&le3); - - layouted.setLayout(layout); - - plain.showMaximized(); - QVERIFY(plain.windowState() & Qt::WindowMaximized); - - plain.showNormal(); - QVERIFY(!(plain.windowState() & Qt::WindowMaximized)); - - layouted.showMaximized(); - QVERIFY(layouted.windowState() & Qt::WindowMaximized); - - layouted.showNormal(); - QVERIFY(!(layouted.windowState() & Qt::WindowMaximized)); - -#if !defined(Q_WS_QWS) && !defined(Q_OS_WINCE) && !defined(Q_WS_QPA) -//embedded may choose a different size to fit on the screen. - QCOMPARE(layouted.size(), layouted.sizeHint()); -#endif - layouted.showMaximized(); - QVERIFY(layouted.isMaximized()); - QVERIFY(layouted.isVisible()); - - layouted.hide(); - QVERIFY(layouted.isMaximized()); - QVERIFY(!layouted.isVisible()); - - layouted.showMaximized(); - QVERIFY(layouted.isMaximized()); - QVERIFY(layouted.isVisible()); - - layouted.showMinimized(); - QVERIFY(layouted.isMinimized()); - QVERIFY(layouted.isMaximized()); - - layouted.showMaximized(); - QVERIFY(!layouted.isMinimized()); - QVERIFY(layouted.isMaximized()); - QVERIFY(layouted.isVisible()); - - layouted.showMinimized(); - QVERIFY(layouted.isMinimized()); - QVERIFY(layouted.isMaximized()); - - layouted.showMaximized(); - QVERIFY(!layouted.isMinimized()); - QVERIFY(layouted.isMaximized()); - QVERIFY(layouted.isVisible()); - - { - QWidget frame; - QWidget widget(&frame); - widget.showMaximized(); - QVERIFY(widget.isMaximized()); - } - - { - QWidget widget; - widget.setGeometry(0, 0, 10, 10); - widget.showMaximized(); - QTRY_VERIFY(widget.size().width() > 20 && widget.size().height() > 20); - } -} - -void tst_QWidget::showFullScreen() -{ - QWidget plain; - QHBoxLayout *layout; - QWidget layouted; - QLineEdit le; - QLineEdit le2; - QLineEdit le3; - layout = new QHBoxLayout; - - layout->addWidget(&le); - layout->addWidget(&le2); - layout->addWidget(&le3); - - layouted.setLayout(layout); - - plain.showFullScreen(); - QVERIFY(plain.windowState() & Qt::WindowFullScreen); - - plain.showNormal(); - QVERIFY(!(plain.windowState() & Qt::WindowFullScreen)); - - layouted.showFullScreen(); - QVERIFY(layouted.windowState() & Qt::WindowFullScreen); - - layouted.showNormal(); - QVERIFY(!(layouted.windowState() & Qt::WindowFullScreen)); - -#if !defined(Q_WS_QWS) && !defined(Q_OS_WINCE) && !defined(Q_WS_QPA) -//embedded may choose a different size to fit on the screen. - QCOMPARE(layouted.size(), layouted.sizeHint()); -#endif - - layouted.showFullScreen(); - QVERIFY(layouted.isFullScreen()); - QVERIFY(layouted.isVisible()); - - layouted.hide(); - QVERIFY(layouted.isFullScreen()); - QVERIFY(!layouted.isVisible()); - - layouted.showFullScreen(); - QVERIFY(layouted.isFullScreen()); - QVERIFY(layouted.isVisible()); - - layouted.showMinimized(); - QVERIFY(layouted.isMinimized()); - QVERIFY(layouted.isFullScreen()); - - layouted.showFullScreen(); - QVERIFY(!layouted.isMinimized()); - QVERIFY(layouted.isFullScreen()); - QVERIFY(layouted.isVisible()); - - layouted.showMinimized(); - QVERIFY(layouted.isMinimized()); - QVERIFY(layouted.isFullScreen()); - - layouted.showFullScreen(); - QVERIFY(!layouted.isMinimized()); - QVERIFY(layouted.isFullScreen()); - QVERIFY(layouted.isVisible()); - - { - QWidget frame; - QWidget widget(&frame); - widget.showFullScreen(); - QVERIFY(widget.isFullScreen()); - } -} - -class ResizeWidget : public QWidget { -public: - ResizeWidget(QWidget *p = 0) : QWidget(p) - { - m_resizeEventCount = 0; - } -protected: - void resizeEvent(QResizeEvent *e){ - QCOMPARE(size(), e->size()); - ++m_resizeEventCount; - } - -public: - int m_resizeEventCount; -}; - -void tst_QWidget::resizeEvent() -{ - { - QWidget wParent; - ResizeWidget wChild(&wParent); - wParent.show(); - QCOMPARE (wChild.m_resizeEventCount, 1); // initial resize event before paint - wParent.hide(); - QSize safeSize(640,480); - if (wChild.size() == safeSize) - safeSize.setWidth(639); - wChild.resize(safeSize); - QCOMPARE (wChild.m_resizeEventCount, 1); - wParent.show(); - QCOMPARE (wChild.m_resizeEventCount, 2); - } - - { - ResizeWidget wTopLevel; - wTopLevel.show(); - QCOMPARE (wTopLevel.m_resizeEventCount, 1); // initial resize event before paint for toplevels - wTopLevel.hide(); - QSize safeSize(640,480); - if (wTopLevel.size() == safeSize) - safeSize.setWidth(639); - wTopLevel.resize(safeSize); - QCOMPARE (wTopLevel.m_resizeEventCount, 1); - wTopLevel.show(); - QCOMPARE (wTopLevel.m_resizeEventCount, 2); - } -} - -void tst_QWidget::showMinimized() -{ - QWidget plain; - plain.move(100, 100); - plain.resize(200, 200); - QPoint pos = plain.pos(); - - plain.showMinimized(); - QVERIFY(plain.isMinimized()); - QVERIFY(plain.isVisible()); - QCOMPARE(plain.pos(), pos); - - plain.showNormal(); - QVERIFY(!plain.isMinimized()); - QVERIFY(plain.isVisible()); - QCOMPARE(plain.pos(), pos); - - plain.showMinimized(); - QVERIFY(plain.isMinimized()); - QVERIFY(plain.isVisible()); - QCOMPARE(plain.pos(), pos); - - plain.hide(); - QVERIFY(plain.isMinimized()); - QVERIFY(!plain.isVisible()); - - plain.showMinimized(); - QVERIFY(plain.isMinimized()); - QVERIFY(plain.isVisible()); - - plain.setGeometry(200, 200, 300, 300); - plain.showNormal(); - QCOMPARE(plain.geometry(), QRect(200, 200, 300, 300)); - - { - QWidget frame; - QWidget widget(&frame); - widget.showMinimized(); - QVERIFY(widget.isMinimized()); - } -} - -void tst_QWidget::showMinimizedKeepsFocus() -{ - //here we test that minimizing a widget and restoring it doesn't change the focus inside of it - { - QWidget window; - QWidget child1(&window), child2(&window); - child1.setFocusPolicy(Qt::StrongFocus); - child2.setFocusPolicy(Qt::StrongFocus); - window.show(); - qApp->setActiveWindow(&window); - QTest::qWaitForWindowShown(&window); - child2.setFocus(); - QTest::qWait(50); - - QTRY_COMPARE(window.focusWidget(), &child2); - QTRY_COMPARE(qApp->focusWidget(), &child2); - - window.showMinimized(); - QTest::qWait(10); - QTRY_VERIFY(window.isMinimized()); - QTRY_COMPARE(window.focusWidget(), &child2); - - window.showNormal(); - QTest::qWait(10); - QTRY_COMPARE(window.focusWidget(), &child2); - } - - //testing deletion of the focusWidget - { - QWidget window; - QWidget *child = new QWidget(&window); - child->setFocusPolicy(Qt::StrongFocus); - window.show(); - qApp->setActiveWindow(&window); - QTest::qWaitForWindowShown(&window); - child->setFocus(); - QTest::qWait(50); - QTRY_COMPARE(window.focusWidget(), child); - QTRY_COMPARE(qApp->focusWidget(), child); - - delete child; - QCOMPARE(window.focusWidget(), static_cast<QWidget*>(0)); - QCOMPARE(qApp->focusWidget(), static_cast<QWidget*>(0)); - } - - //testing reparenting the focus widget - { - QWidget window; - QWidget *child = new QWidget(&window); - child->setFocusPolicy(Qt::StrongFocus); - window.show(); - qApp->setActiveWindow(&window); - QTest::qWaitForWindowShown(&window); - child->setFocus(); - QTest::qWait(50); - QTRY_COMPARE(window.focusWidget(), child); - QTRY_COMPARE(qApp->focusWidget(), child); - - child->setParent(0); - QCOMPARE(window.focusWidget(), static_cast<QWidget*>(0)); - QCOMPARE(qApp->focusWidget(), static_cast<QWidget*>(0)); - } - - //testing setEnabled(false) - { - QWidget window; - QWidget *child = new QWidget(&window); - child->setFocusPolicy(Qt::StrongFocus); - window.show(); - qApp->setActiveWindow(&window); - QTest::qWaitForWindowShown(&window); - child->setFocus(); - QTest::qWait(10); - QTRY_COMPARE(window.focusWidget(), child); - QTRY_COMPARE(qApp->focusWidget(), child); - - child->setEnabled(false); - QCOMPARE(window.focusWidget(), static_cast<QWidget*>(0)); - QCOMPARE(qApp->focusWidget(), static_cast<QWidget*>(0)); - } - - //testing clearFocus - { - QWidget window; - QWidget *firstchild = new QWidget(&window); - firstchild->setFocusPolicy(Qt::StrongFocus); - QWidget *child = new QWidget(&window); - child->setFocusPolicy(Qt::StrongFocus); - window.show(); - qApp->setActiveWindow(&window); - QTest::qWaitForWindowShown(&window); - child->setFocus(); - QTest::qWait(10); - QTRY_COMPARE(window.focusWidget(), child); - QTRY_COMPARE(qApp->focusWidget(), child); - - child->clearFocus(); - QCOMPARE(window.focusWidget(), static_cast<QWidget*>(0)); - QCOMPARE(qApp->focusWidget(), static_cast<QWidget*>(0)); - - window.showMinimized(); - QTest::qWait(30); - QTRY_VERIFY(window.isMinimized()); -#ifdef Q_WS_QWS - QEXPECT_FAIL("", "QWS does not implement showMinimized()", Continue); -#endif - QCOMPARE(window.focusWidget(), static_cast<QWidget*>(0)); -#ifdef Q_WS_QWS - QEXPECT_FAIL("", "QWS does not implement showMinimized()", Continue); -#endif - QTRY_COMPARE(qApp->focusWidget(), static_cast<QWidget*>(0)); - - window.showNormal(); - qApp->setActiveWindow(&window); - QTest::qWaitForWindowShown(&window); - QTest::qWait(30); -#ifdef Q_WS_MAC - if (!macHasAccessToWindowsServer()) - QEXPECT_FAIL("", "When not having WindowServer access, we lose focus.", Continue); -#endif - QTRY_COMPARE(window.focusWidget(), firstchild); -#ifdef Q_WS_MAC - if (!macHasAccessToWindowsServer()) - QEXPECT_FAIL("", "When not having WindowServer access, we lose focus.", Continue); -#endif - QTRY_COMPARE(qApp->focusWidget(), firstchild); - } -} - - -void tst_QWidget::reparent() -{ - QWidget parent; - parent.setWindowTitle("Toplevel"); - parent.setGeometry(300, 300, 200, 150); - - QWidget child(0); - child.setObjectName("child"); - child.setGeometry(10, 10, 180, 130); - QPalette pal1; - pal1.setColor(child.backgroundRole(), Qt::white); - child.setPalette(pal1); - - QWidget childTLW(&child, Qt::Window); - childTLW.setObjectName("childTLW"); - childTLW.setGeometry(100, 100, 50, 50); - QPalette pal2; - pal2.setColor(childTLW.backgroundRole(), Qt::yellow); - childTLW.setPalette(pal2); - - parent.show(); - childTLW.show(); - QTest::qWaitForWindowShown(&parent); - -#ifdef Q_OS_WINCE - parent.move(50, 50); -#else - parent.move(300, 300); -#endif - - QPoint childPos = parent.mapToGlobal(child.pos()); - QPoint tlwPos = childTLW.pos(); - - child.setParent(0, child.windowFlags() & ~Qt::WindowType_Mask); - child.setGeometry(childPos.x(), childPos.y(), child.width(), child.height()); - child.show(); - -#ifdef Q_WS_X11 - // On X11, the window manager will apply NorthWestGravity rules to 'child', which - // means the top-left corner of the window frame will be placed at 'childPos', - // causing this test to fail -#else - QCOMPARE(child.geometry().topLeft(), childPos); -#endif - QTRY_COMPARE(childTLW.pos(), tlwPos); - - // This following part of the test only makes sense on Windows. -#ifdef Q_WS_WIN - QWidget childTLWChild(&childTLW); - childTLWChild.setObjectName("childTLWChild"); - - QWidget grandChild(&child); - grandChild.setObjectName("grandChild"); - grandChild.setGeometry(10, 10, 160, 110); - QPalette pal3; - pal3.setColor(grandChild.backgroundRole(), Qt::red); - grandChild.setPalette(pal3); - //grandChild.setPaletteBackgroundColor(Qt::red); - - QWidget grandChildTLW(&grandChild, Qt::Window); - grandChildTLW.setObjectName("grandChildTLW"); - grandChildTLW.setGeometry(200, 200, 50, 50); - QPalette pal4; - pal4.setColor(grandChildTLW.backgroundRole(), Qt::yellow); - grandChildTLW.setPalette(pal4); - //grandChildTLW.setPaletteBackgroundColor(Qt::yellow); - - QWidget grandChildTLWChild(&grandChildTLW); - grandChildTLWChild.setObjectName("grandChildTLWChild"); - - QVERIFY(IsWindow(childTLW.winId())); - QVERIFY(IsWindow(childTLWChild.winId())); - QVERIFY(IsWindow(grandChildTLW.winId())); - QVERIFY(IsWindow(grandChildTLWChild.winId())); - - parent.show(); - - QVERIFY(IsWindow(childTLW.winId())); - QVERIFY(IsWindow(childTLWChild.winId())); - QVERIFY(IsWindow(grandChildTLW.winId())); - QVERIFY(IsWindow(grandChildTLWChild.winId())); - - child.setParent(&parent); - child.move(10,10); - child.show(); - - // this appears to stabelize results - qApp->processEvents(); - - QVERIFY(IsWindow(childTLW.winId())); - QVERIFY(IsWindow(childTLWChild.winId())); - - QVERIFY(IsWindow(grandChildTLW.winId())); - QVERIFY(IsWindow(grandChildTLWChild.winId())); -#endif -} - -// Qt/Embedded does it differently. -#ifndef Q_WS_QWS -void tst_QWidget::icon() -{ - QPixmap p(20,20); - p.fill(Qt::red); - testWidget->setWindowIcon(p); - - QVERIFY(!testWidget->windowIcon().isNull()); - testWidget->show(); - QVERIFY(!testWidget->windowIcon().isNull()); - testWidget->showFullScreen(); - QVERIFY(!testWidget->windowIcon().isNull()); - testWidget->showNormal(); - QVERIFY(!testWidget->windowIcon().isNull()); -} -#endif - -void tst_QWidget::hideWhenFocusWidgetIsChild() -{ - testWidget->activateWindow(); - QWidget *parentWidget = new QWidget(testWidget); - parentWidget->setObjectName("parentWidget"); - parentWidget->setGeometry(0, 0, 100, 100); - QLineEdit *edit = new QLineEdit(parentWidget); - edit->setObjectName("edit1"); - QLineEdit *edit3 = new QLineEdit(parentWidget); - edit3->setObjectName("edit3"); - edit3->move(0,50); - parentWidget->show(); - QLineEdit *edit2 = new QLineEdit(testWidget); - edit2->setObjectName("edit2"); - edit2->show(); - edit2->move(110, 100); - edit->setFocus(); - qApp->processEvents(); - QString actualFocusWidget, expectedFocusWidget; -#ifdef Q_WS_X11 - if (!qApp->focusWidget()) - QSKIP("Your window manager is too broken for this test", SkipAll); -#endif - QVERIFY(qApp->focusWidget()); - actualFocusWidget.sprintf("%p %s %s", qApp->focusWidget(), qApp->focusWidget()->objectName().toLatin1().constData(), qApp->focusWidget()->metaObject()->className()); - expectedFocusWidget.sprintf("%p %s %s", edit, edit->objectName().toLatin1().constData(), edit->metaObject()->className()); - QCOMPARE(actualFocusWidget, expectedFocusWidget); - - parentWidget->hide(); - qApp->processEvents(); - actualFocusWidget.sprintf("%p %s %s", qApp->focusWidget(), qApp->focusWidget()->objectName().toLatin1().constData(), qApp->focusWidget()->metaObject()->className()); - expectedFocusWidget.sprintf("%p %s %s", edit2, edit2->objectName().toLatin1().constData(), edit2->metaObject()->className()); - QCOMPARE(actualFocusWidget, expectedFocusWidget); - - delete edit2; - delete parentWidget; -} - -// 4DWM issues on IRIX makes this test fail. -#ifndef Q_OS_IRIX -void tst_QWidget::normalGeometry() -{ - QWidget parent; - parent.setWindowTitle("NormalGeometry parent"); - QWidget *child = new QWidget(&parent); - - QCOMPARE(parent.normalGeometry(), parent.geometry()); - QCOMPARE(child->normalGeometry(), QRect()); - - parent.setGeometry(100, 100, 200, 200); - parent.show(); - QTest::qWaitForWindowShown(&parent); - QApplication::processEvents(); - - QRect geom = parent.geometry(); - // ### the window manager places the top-left corner at - // ### 100,100... making geom something like 102,124 (offset by - // ### the frame/frame)... this indicates a rather large different - // ### between how X11 and Windows works - // QCOMPARE(geom, QRect(100, 100, 200, 200)); - QCOMPARE(parent.normalGeometry(), geom); - - parent.setWindowState(parent.windowState() ^ Qt::WindowMaximized); - QTest::qWait(10); - QTRY_VERIFY(parent.windowState() & Qt::WindowMaximized); - QTRY_VERIFY(parent.geometry() != geom); - QTRY_COMPARE(parent.normalGeometry(), geom); - - parent.setWindowState(parent.windowState() ^ Qt::WindowMaximized); - QTest::qWait(10); - QTRY_VERIFY(!(parent.windowState() & Qt::WindowMaximized)); - QTRY_COMPARE(parent.geometry(), geom); - QTRY_COMPARE(parent.normalGeometry(), geom); - - parent.showMaximized(); - QTest::qWait(10); - QTRY_VERIFY(parent.windowState() & Qt::WindowMaximized); - QTRY_VERIFY(parent.geometry() != geom); - QCOMPARE(parent.normalGeometry(), geom); - - parent.showNormal(); - QTest::qWait(10); - QTRY_VERIFY(!(parent.windowState() & Qt::WindowMaximized)); - QTRY_COMPARE(parent.geometry(), geom); - QCOMPARE(parent.normalGeometry(), geom); - - parent.setWindowState(parent.windowState() ^ Qt::WindowMinimized); - QTest::qWait(10); - parent.setWindowState(parent.windowState() ^ Qt::WindowMaximized); - QTest::qWait(10); - QTRY_VERIFY(parent.windowState() & (Qt::WindowMinimized|Qt::WindowMaximized)); - // ### when minimized and maximized at the same time, the geometry - // ### does *NOT* have to be the normal geometry, it could be the - // ### maximized geometry. - // QCOMPARE(parent.geometry(), geom); - QTRY_COMPARE(parent.normalGeometry(), geom); - - parent.setWindowState(parent.windowState() ^ Qt::WindowMinimized); - QTest::qWait(10); - QTRY_VERIFY(!(parent.windowState() & Qt::WindowMinimized)); - QTRY_VERIFY(parent.windowState() & Qt::WindowMaximized); - QTRY_VERIFY(parent.geometry() != geom); - QTRY_COMPARE(parent.normalGeometry(), geom); - - parent.setWindowState(parent.windowState() ^ Qt::WindowMaximized); - QTest::qWait(10); - QTRY_VERIFY(!(parent.windowState() & Qt::WindowMaximized)); - QTRY_COMPARE(parent.geometry(), geom); - QTRY_COMPARE(parent.normalGeometry(), geom); - - parent.setWindowState(parent.windowState() ^ Qt::WindowFullScreen); - QTest::qWait(10); - QTRY_VERIFY(parent.windowState() & Qt::WindowFullScreen); - QTRY_VERIFY(parent.geometry() != geom); - QTRY_COMPARE(parent.normalGeometry(), geom); - - parent.setWindowState(parent.windowState() ^ Qt::WindowFullScreen); - QTest::qWait(10); - QVERIFY(!(parent.windowState() & Qt::WindowFullScreen)); - QTRY_COMPARE(parent.geometry(), geom); - QTRY_COMPARE(parent.normalGeometry(), geom); - - parent.showFullScreen(); - QTest::qWait(10); - QTRY_VERIFY(parent.windowState() & Qt::WindowFullScreen); - QTRY_VERIFY(parent.geometry() != geom); - QTRY_COMPARE(parent.normalGeometry(), geom); - - parent.showNormal(); - QTest::qWait(10); - QTRY_VERIFY(!(parent.windowState() & Qt::WindowFullScreen)); - QTRY_COMPARE(parent.geometry(), geom); - QTRY_COMPARE(parent.normalGeometry(), geom); - - parent.showNormal(); - parent.setWindowState(Qt:: WindowFullScreen | Qt::WindowMaximized); - parent.setWindowState(Qt::WindowMinimized | Qt:: WindowFullScreen | Qt::WindowMaximized); - parent.setWindowState(Qt:: WindowFullScreen | Qt::WindowMaximized); - QTest::qWait(10); - QTRY_COMPARE(parent.normalGeometry(), geom); -} -#endif - -void tst_QWidget::setGeometry() -{ - QWidget tlw; - QWidget child(&tlw); - - QRect tr(100,100,200,200); - QRect cr(50,50,50,50); - tlw.setGeometry(tr); - child.setGeometry(cr); - tlw.show(); - QTest::qWait(50); - QCOMPARE(tlw.geometry().size(), tr.size()); - QCOMPARE(child.geometry(), cr); - - tlw.setParent(0, Qt::Window|Qt::FramelessWindowHint); - tr = QRect(0,0,100,100); - tr.moveTopLeft(QApplication::desktop()->availableGeometry().topLeft()); - tlw.setGeometry(tr); - QCOMPARE(tlw.geometry(), tr); - tlw.show(); - QTest::qWait(50); - if (tlw.frameGeometry() != tlw.geometry()) - QSKIP("Your window manager is too broken for this test", SkipAll); - QCOMPARE(tlw.geometry(), tr); - -} - -// Windows CE does not support windowOpacity. -#ifndef Q_OS_WINCE -void tst_QWidget::windowOpacity() -{ - QWidget widget; - QWidget child(&widget); - - // Initial value should be 1.0 - QCOMPARE(widget.windowOpacity(), 1.0); - // children should always return 1.0 - QCOMPARE(child.windowOpacity(), 1.0); - - widget.setWindowOpacity(0.0); - QCOMPARE(widget.windowOpacity(), 0.0); - child.setWindowOpacity(0.0); - QCOMPARE(child.windowOpacity(), 1.0); - - widget.setWindowOpacity(1.0); - QCOMPARE(widget.windowOpacity(), 1.0); - child.setWindowOpacity(1.0); - QCOMPARE(child.windowOpacity(), 1.0); - - widget.setWindowOpacity(2.0); - QCOMPARE(widget.windowOpacity(), 1.0); - child.setWindowOpacity(2.0); - QCOMPARE(child.windowOpacity(), 1.0); - - widget.setWindowOpacity(-1.0); - QCOMPARE(widget.windowOpacity(), 0.0); - child.setWindowOpacity(-1.0); - QCOMPARE(child.windowOpacity(), 1.0); -} -#endif - -class UpdateWidget : public QWidget -{ -public: - UpdateWidget(QWidget *parent = 0) : QWidget(parent) { - reset(); - } - - void paintEvent(QPaintEvent *e) { - paintedRegion += e->region(); - ++numPaintEvents; - if (resizeInPaintEvent) { - resizeInPaintEvent = false; - resize(size() + QSize(2, 2)); - } - } - - bool event(QEvent *event) - { - switch (event->type()) { - case QEvent::ZOrderChange: - ++numZOrderChangeEvents; - break; - case QEvent::UpdateRequest: - ++numUpdateRequestEvents; - break; - case QEvent::ActivationChange: - case QEvent::FocusIn: - case QEvent::FocusOut: - case QEvent::WindowActivate: - case QEvent::WindowDeactivate: - if (!updateOnActivationChangeAndFocusIn) - return true; // Filter out to avoid update() calls in QWidget. - break; - default: - break; - } - return QWidget::event(event); - } - - void reset() { - numPaintEvents = 0; - numZOrderChangeEvents = 0; - numUpdateRequestEvents = 0; - updateOnActivationChangeAndFocusIn = false; - resizeInPaintEvent = false; - paintedRegion = QRegion(); - } - - int numPaintEvents; - int numZOrderChangeEvents; - int numUpdateRequestEvents; - bool updateOnActivationChangeAndFocusIn; - bool resizeInPaintEvent; - QRegion paintedRegion; -}; - -void tst_QWidget::lostUpdatesOnHide() -{ -#ifndef Q_WS_MAC - UpdateWidget widget; - widget.setAttribute(Qt::WA_DontShowOnScreen); - widget.show(); - widget.hide(); - QTest::qWait(50); - widget.show(); - QTest::qWait(50); - - QCOMPARE(widget.numPaintEvents, 1); -#endif -} - -void tst_QWidget::raise() -{ - QTest::qWait(10); - QWidget *parent = new QWidget(0); - QList<UpdateWidget *> allChildren; - - UpdateWidget *child1 = new UpdateWidget(parent); - child1->setAutoFillBackground(true); - allChildren.append(child1); - - UpdateWidget *child2 = new UpdateWidget(parent); - child2->setAutoFillBackground(true); - allChildren.append(child2); - - UpdateWidget *child3 = new UpdateWidget(parent); - child3->setAutoFillBackground(true); - allChildren.append(child3); - - UpdateWidget *child4 = new UpdateWidget(parent); - child4->setAutoFillBackground(true); - allChildren.append(child4); - - parent->show(); - QTest::qWaitForWindowShown(parent); - QTest::qWait(10); - -#ifdef Q_OS_MAC - if (child1->internalWinId()) { - QSKIP("Cocoa has no Z-Order for views, we hack it, but it results in paint events.", SkipAll); - } -#endif - - QList<QObject *> list1; - list1 << child1 << child2 << child3 << child4; - QVERIFY(parent->children() == list1); - QCOMPARE(allChildren.count(), list1.count()); - - foreach (UpdateWidget *child, allChildren) { - int expectedPaintEvents = child == child4 ? 1 : 0; - if (expectedPaintEvents == 0) { - QVERIFY(child->numPaintEvents == 0); - } else { - // show() issues multiple paint events on some window managers - QTRY_VERIFY(child->numPaintEvents >= expectedPaintEvents); - } - QCOMPARE(child->numZOrderChangeEvents, 0); - child->reset(); - } - - for (int i = 0; i < 5; ++i) - child2->raise(); - QTest::qWait(50); - - foreach (UpdateWidget *child, allChildren) { - int expectedPaintEvents = child == child2 ? 1 : 0; - int expectedZOrderChangeEvents = child == child2 ? 1 : 0; -#ifdef Q_OS_MAC - QSKIP("Not yet sure why this fails.", SkipSingle); -#endif - QTRY_COMPARE(child->numPaintEvents, expectedPaintEvents); - QCOMPARE(child->numZOrderChangeEvents, expectedZOrderChangeEvents); - child->reset(); - } - - QList<QObject *> list2; - list2 << child1 << child3 << child4 << child2; - QVERIFY(parent->children() == list2); - - // Creates a widget on top of all the children and checks that raising one of - // the children underneath doesn't trigger a repaint on the covering widget. - QWidget topLevel; - parent->setParent(&topLevel); - topLevel.show(); - QTest::qWaitForWindowShown(&topLevel); - QTest::qWait(50); - - UpdateWidget *onTop = new UpdateWidget(&topLevel); - onTop->reset(); - onTop->resize(topLevel.size()); - onTop->setAutoFillBackground(true); - onTop->show(); - QTest::qWait(50); - QTRY_VERIFY(onTop->numPaintEvents > 0); - onTop->reset(); - - // Reset all the children. - foreach (UpdateWidget *child, allChildren) - child->reset(); - - for (int i = 0; i < 5; ++i) - child3->raise(); - QTest::qWait(50); - - QCOMPARE(onTop->numPaintEvents, 0); - QCOMPARE(onTop->numZOrderChangeEvents, 0); - - QList<QObject *> list3; - list3 << child1 << child4 << child2 << child3; - QVERIFY(parent->children() == list3); - - foreach (UpdateWidget *child, allChildren) { - int expectedPaintEvents = 0; - int expectedZOrderChangeEvents = child == child3 ? 1 : 0; - QTRY_COMPARE(child->numPaintEvents, expectedPaintEvents); - QCOMPARE(child->numZOrderChangeEvents, expectedZOrderChangeEvents); - child->reset(); - } -} - -// Cocoa has no Z-Order for views, we hack it, but it results in paint events. -#ifndef QT_OS_MAC -void tst_QWidget::lower() -{ - QWidget *parent = new QWidget(0); - QList<UpdateWidget *> allChildren; - - UpdateWidget *child1 = new UpdateWidget(parent); - child1->setAutoFillBackground(true); - allChildren.append(child1); - - UpdateWidget *child2 = new UpdateWidget(parent); - child2->setAutoFillBackground(true); - allChildren.append(child2); - - UpdateWidget *child3 = new UpdateWidget(parent); - child3->setAutoFillBackground(true); - allChildren.append(child3); - - UpdateWidget *child4 = new UpdateWidget(parent); - child4->setAutoFillBackground(true); - allChildren.append(child4); - - parent->show(); - QTest::qWaitForWindowShown(parent); - QTest::qWait(100); - - QList<QObject *> list1; - list1 << child1 << child2 << child3 << child4; - QVERIFY(parent->children() == list1); - QCOMPARE(allChildren.count(), list1.count()); - - foreach (UpdateWidget *child, allChildren) { - int expectedPaintEvents = child == child4 ? 1 : 0; - if (expectedPaintEvents == 0) { - QVERIFY(child->numPaintEvents == 0); - } else { - // show() issues multiple paint events on some window managers - QTRY_VERIFY(child->numPaintEvents >= expectedPaintEvents); - } - QCOMPARE(child->numZOrderChangeEvents, 0); - child->reset(); - } - - for (int i = 0; i < 5; ++i) - child4->lower(); - - QTest::qWait(100); - - foreach (UpdateWidget *child, allChildren) { - int expectedPaintEvents = child == child3 ? 1 : 0; - int expectedZOrderChangeEvents = child == child4 ? 1 : 0; - QTRY_COMPARE(child->numZOrderChangeEvents, expectedZOrderChangeEvents); - QTRY_COMPARE(child->numPaintEvents, expectedPaintEvents); - child->reset(); - } - - QList<QObject *> list2; - list2 << child4 << child1 << child2 << child3; - QVERIFY(parent->children() == list2); - - delete parent; -} -#endif - -// Cocoa has no Z-Order for views, we hack it, but it results in paint events. -#ifndef QT_OS_MAC -void tst_QWidget::stackUnder() -{ - QTest::qWait(10); - QWidget *parent = new QWidget(0); - QList<UpdateWidget *> allChildren; - - UpdateWidget *child1 = new UpdateWidget(parent); - child1->setAutoFillBackground(true); - allChildren.append(child1); - - UpdateWidget *child2 = new UpdateWidget(parent); - child2->setAutoFillBackground(true); - allChildren.append(child2); - - UpdateWidget *child3 = new UpdateWidget(parent); - child3->setAutoFillBackground(true); - allChildren.append(child3); - - UpdateWidget *child4 = new UpdateWidget(parent); - child4->setAutoFillBackground(true); - allChildren.append(child4); - - parent->show(); - QTest::qWaitForWindowShown(parent); - QTest::qWait(10); -#ifdef Q_WS_QWS - QApplication::sendPostedEvents(); //glib workaround -#endif - - QList<QObject *> list1; - list1 << child1 << child2 << child3 << child4; - QVERIFY(parent->children() == list1); - - foreach (UpdateWidget *child, allChildren) { - int expectedPaintEvents = child == child4 ? 1 : 0; -#if defined(Q_WS_WIN) || defined(Q_WS_MAC) - if (expectedPaintEvents == 1 && child->numPaintEvents == 2) - QEXPECT_FAIL(0, "Mac and Windows issues double repaints for Z-Order change", Continue); -#endif - QTRY_COMPARE(child->numPaintEvents, expectedPaintEvents); - QCOMPARE(child->numZOrderChangeEvents, 0); - child->reset(); - } - - for (int i = 0; i < 5; ++i) - child4->stackUnder(child2); - QTest::qWait(10); - - QList<QObject *> list2; - list2 << child1 << child4 << child2 << child3; - QVERIFY(parent->children() == list2); - - foreach (UpdateWidget *child, allChildren) { - int expectedPaintEvents = child == child3 ? 1 : 0; - int expectedZOrderChangeEvents = child == child4 ? 1 : 0; - QTRY_COMPARE(child->numPaintEvents, expectedPaintEvents); - QTRY_COMPARE(child->numZOrderChangeEvents, expectedZOrderChangeEvents); - child->reset(); - } - - for (int i = 0; i < 5; ++i) - child1->stackUnder(child3); - QTest::qWait(10); - - QList<QObject *> list3; - list3 << child4 << child2 << child1 << child3; - QVERIFY(parent->children() == list3); - - foreach (UpdateWidget *child, allChildren) { - int expectedZOrderChangeEvents = child == child1 ? 1 : 0; - if (child == child3) { -#ifdef Q_OS_WINCE - qApp->processEvents(); -#endif -#ifndef Q_WS_MAC - QEXPECT_FAIL(0, "See QTBUG-493", Continue); -#endif - QCOMPARE(child->numPaintEvents, 0); - } else { - QCOMPARE(child->numPaintEvents, 0); - } - QTRY_COMPARE(child->numZOrderChangeEvents, expectedZOrderChangeEvents); - child->reset(); - } - - delete parent; -} -#endif - -void drawPolygon(QPaintDevice *dev, int w, int h) -{ - QPainter p(dev); - p.fillRect(0, 0, w, h, Qt::white); - - QPolygon a; - a << QPoint(0, 0) << QPoint(w/2, h/2) << QPoint(w, 0) - << QPoint(w/2, h) << QPoint(0, 0); - - p.setPen(QPen(Qt::black, 1)); - p.setBrush(Qt::DiagCrossPattern); - p.drawPolygon(a); -} - -class ContentsPropagationWidget : public QWidget -{ - Q_OBJECT -public: - ContentsPropagationWidget(QWidget *parent = 0) : QWidget(parent) - { - QWidget *child = this; - for (int i=0; i<32; ++i) { - child = new QWidget(child); - child->setGeometry(i, i, 400 - i*2, 400 - i*2); - } - } - - void setContentsPropagation(bool enable) { - foreach (QObject *child, children()) - qobject_cast<QWidget *>(child)->setAutoFillBackground(!enable); - } - -protected: - void paintEvent(QPaintEvent *) - { - int w = width(), h = height(); - drawPolygon(this, w, h); - } - - QSize sizeHint() const { return QSize(500, 500); } -}; - -void tst_QWidget::testContentsPropagation() -{ - ContentsPropagationWidget widget; -#ifdef Q_WS_QWS - widget.resize(500,500); -#else - widget.setFixedSize(500, 500); -#endif - widget.setContentsPropagation(false); - QPixmap widgetSnapshot = QPixmap::grabWidget(&widget); - - QPixmap correct(500, 500); - drawPolygon(&correct, 500, 500); - //correct.save("correct.png", "PNG"); - - //widgetSnapshot.save("snap1.png", "PNG"); - QVERIFY(widgetSnapshot.toImage() != correct.toImage()); - - widget.setContentsPropagation(true); - widgetSnapshot = QPixmap::grabWidget(&widget); - //widgetSnapshot.save("snap2.png", "PNG"); - - QCOMPARE(widgetSnapshot, correct); -} - -/* - Test that saving and restoring window geometry with - saveGeometry() and restoreGeometry() works. -*/ -// 4DWM issues on IRIX makes this test fail. -#ifndef Q_OS_IRIX -void tst_QWidget::saveRestoreGeometry() -{ - const QPoint position(100, 100); - const QSize size(200, 200); - - QByteArray savedGeometry; - - { - QWidget widget; - widget.move(position); - widget.resize(size); - widget.show(); - QTest::qWaitForWindowShown(&widget); - QApplication::processEvents(); - - QTRY_COMPARE(widget.pos(), position); - QCOMPARE(widget.size(), size); - savedGeometry = widget.saveGeometry(); - } - - { - QWidget widget; - - const QByteArray empty; - const QByteArray one("a"); - const QByteArray two("ab"); - const QByteArray three("abc"); - const QByteArray four("abca"); - const QByteArray garbage("abcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabc"); - - QVERIFY(widget.restoreGeometry(empty) == false); - QVERIFY(widget.restoreGeometry(one) == false); - QVERIFY(widget.restoreGeometry(two) == false); - QVERIFY(widget.restoreGeometry(three) == false); - QVERIFY(widget.restoreGeometry(four) == false); - QVERIFY(widget.restoreGeometry(garbage) == false); - - QVERIFY(widget.restoreGeometry(savedGeometry)); - widget.show(); - QTest::qWaitForWindowShown(&widget); - QApplication::processEvents(); - - QTRY_COMPARE(widget.pos(), position); - QCOMPARE(widget.size(), size); - widget.show(); - QCOMPARE(widget.pos(), position); - QCOMPARE(widget.size(), size); - } - - { - QWidget widget; - widget.move(position); - widget.resize(size); - widget.show(); - QTest::qWaitForWindowShown(&widget); - QTest::qWait(500); - QTRY_COMPARE(widget.geometry().size(), size); - - QRect geom; - - //Restore from Full screen - savedGeometry = widget.saveGeometry(); - geom = widget.geometry(); - widget.setWindowState(widget.windowState() | Qt::WindowFullScreen); - QTRY_VERIFY((widget.windowState() & Qt::WindowFullScreen)); - QTest::qWait(500); - QVERIFY(widget.restoreGeometry(savedGeometry)); - QTest::qWait(120); - QTRY_VERIFY(!(widget.windowState() & Qt::WindowFullScreen)); - QTRY_COMPARE(widget.geometry(), geom); - - //Restore to full screen - widget.setWindowState(widget.windowState() | Qt::WindowFullScreen); - QTest::qWait(120); - QTRY_VERIFY((widget.windowState() & Qt::WindowFullScreen)); - QTest::qWait(500); - savedGeometry = widget.saveGeometry(); - geom = widget.geometry(); - widget.setWindowState(widget.windowState() ^ Qt::WindowFullScreen); - QTest::qWait(120); - QTRY_VERIFY(!(widget.windowState() & Qt::WindowFullScreen)); - QTest::qWait(400); - QVERIFY(widget.restoreGeometry(savedGeometry)); - QTest::qWait(120); - QTRY_VERIFY((widget.windowState() & Qt::WindowFullScreen)); - QTRY_COMPARE(widget.geometry(), geom); - QVERIFY((widget.windowState() & Qt::WindowFullScreen)); - widget.setWindowState(widget.windowState() ^ Qt::WindowFullScreen); - QTest::qWait(120); - QTRY_VERIFY(!(widget.windowState() & Qt::WindowFullScreen)); - QTest::qWait(120); - - //Restore from Maximised - widget.move(position); - widget.resize(size); - QTest::qWait(10); - QTRY_COMPARE(widget.size(), size); - QTest::qWait(500); - savedGeometry = widget.saveGeometry(); - geom = widget.geometry(); - widget.setWindowState(widget.windowState() | Qt::WindowMaximized); - QTest::qWait(120); - QTRY_VERIFY((widget.windowState() & Qt::WindowMaximized)); - QTRY_VERIFY(widget.geometry() != geom); - QTest::qWait(500); - QVERIFY(widget.restoreGeometry(savedGeometry)); - QTest::qWait(120); - QTRY_COMPARE(widget.geometry(), geom); - - QVERIFY(!(widget.windowState() & Qt::WindowMaximized)); - - //Restore to maximised - widget.setWindowState(widget.windowState() | Qt::WindowMaximized); - QTest::qWait(120); - QTRY_VERIFY((widget.windowState() & Qt::WindowMaximized)); - QTest::qWait(500); - geom = widget.geometry(); - savedGeometry = widget.saveGeometry(); - widget.setWindowState(widget.windowState() ^ Qt::WindowMaximized); - QTest::qWait(120); - QTRY_VERIFY(!(widget.windowState() & Qt::WindowMaximized)); - QTest::qWait(500); - QVERIFY(widget.restoreGeometry(savedGeometry)); - QTest::qWait(120); - QTRY_VERIFY((widget.windowState() & Qt::WindowMaximized)); - QTRY_COMPARE(widget.geometry(), geom); - } -} -#endif - -// 4DWM issues on IRIX makes this test fail. -#ifndef Q_OS_IRIX -void tst_QWidget::restoreVersion1Geometry_data() -{ - QTest::addColumn<QString>("fileName"); - QTest::addColumn<uint>("expectedWindowState"); - QTest::addColumn<QPoint>("expectedPosition"); - QTest::addColumn<QSize>("expectedSize"); - QTest::addColumn<QRect>("expectedNormalGeometry"); - const QPoint position(100, 100); - const QSize size(200, 200); - const QRect normalGeometry(102, 124, 200, 200); - - QTest::newRow("geometry.dat") << ":geometry.dat" << uint(Qt::WindowNoState) << position << size << normalGeometry; - QTest::newRow("geometry-maximized.dat") << ":geometry-maximized.dat" << uint(Qt::WindowMaximized) << position << size << normalGeometry; - QTest::newRow("geometry-fullscreen.dat") << ":geometry-fullscreen.dat" << uint(Qt::WindowFullScreen) << position << size << normalGeometry; -} - -/* - Test that the current version of restoreGeometry() can restore geometry - saved width saveGeometry() version 1.0. -*/ -void tst_QWidget::restoreVersion1Geometry() -{ - QFETCH(QString, fileName); - QFETCH(uint, expectedWindowState); - QFETCH(QPoint, expectedPosition); - QFETCH(QSize, expectedSize); - QFETCH(QRect, expectedNormalGeometry); - - // WindowActive is uninteresting for this test - const uint WindowStateMask = Qt::WindowFullScreen | Qt::WindowMaximized | Qt::WindowMinimized; - - QFile f(fileName); - QVERIFY(f.exists()); - f.open(QIODevice::ReadOnly); - const QByteArray savedGeometry = f.readAll(); - QCOMPARE(savedGeometry.count(), 46); - f.close(); - - QWidget widget; - - QVERIFY(widget.restoreGeometry(savedGeometry)); - - QCOMPARE(uint(widget.windowState() & WindowStateMask), expectedWindowState); - if (expectedWindowState == Qt::WindowNoState) { - QCOMPARE(widget.pos(), expectedPosition); - QCOMPARE(widget.size(), expectedSize); - } - widget.show(); - QTest::qWaitForWindowShown(&widget); - QTest::qWait(100); - - if (expectedWindowState == Qt::WindowNoState) { - QTRY_COMPARE(widget.pos(), expectedPosition); - QTRY_COMPARE(widget.size(), expectedSize); - } - - widget.showNormal(); - QTest::qWait(10); - - if (expectedWindowState != Qt::WindowNoState) { - // restoring from maximized or fullscreen, we can only restore to the normal geometry - QTRY_COMPARE(widget.geometry(), expectedNormalGeometry); - } else { - QTRY_COMPARE(widget.pos(), expectedPosition); - QTRY_COMPARE(widget.size(), expectedSize); - } - -#if 0 - // Code for saving a new geometry*.dat files - { - QWidget widgetToSave; - widgetToSave.move(expectedPosition); - widgetToSave.resize(expectedSize); - widgetToSave.show(); -#ifdef Q_WS_X11 - qt_x11_wait_for_window_manager(&widget); -#endif - QTest::qWait(500); // stabilize - widgetToSave.setWindowState(Qt::WindowStates(expectedWindowState)); - QTest::qWait(500); // stabilize - - QByteArray geometryToSave = widgetToSave.saveGeometry(); - - // Code for saving a new geometry.dat file. - f.setFileName(fileName.mid(1)); - QVERIFY(f.open(QIODevice::WriteOnly)); // did you forget to 'p4 edit *.dat'? :) - f.write(geometryToSave); - f.close(); - } -#endif -} -#endif - -void tst_QWidget::widgetAt() -{ - Q_CHECK_PAINTEVENTS - - QWidget *w1 = new QWidget(0, Qt::X11BypassWindowManagerHint); - w1->setGeometry(0,0,150,150); - w1->setObjectName("w1"); - - QWidget *w2 = new QWidget(0, Qt::X11BypassWindowManagerHint | Qt::FramelessWindowHint); - w2->setGeometry(50,50,100,100); - w2->setObjectName("w2"); - w1->show(); - QTest::qWaitForWindowShown(w1); - qApp->processEvents(); - QWidget *wr; - QTRY_VERIFY((wr = QApplication::widgetAt(100, 100))); - QCOMPARE(wr->objectName(), QString("w1")); - - w2->show(); - QTest::qWaitForWindowShown(w2); - qApp->processEvents(); - qApp->processEvents(); - qApp->processEvents(); - QTRY_VERIFY((wr = QApplication::widgetAt(100, 100))); - QCOMPARE(wr->objectName(), QString("w2")); - - w2->lower(); - qApp->processEvents(); - QTRY_VERIFY((wr = QApplication::widgetAt(100, 100)) && wr->objectName() == QString("w1")); - w2->raise(); - - qApp->processEvents(); - QTRY_VERIFY((wr = QApplication::widgetAt(100, 100)) && wr->objectName() == QString("w2")); - - QWidget *w3 = new QWidget(w2); - w3->setGeometry(10,10,50,50); - w3->setObjectName("w3"); - w3->show(); - qApp->processEvents(); - QTRY_VERIFY((wr = QApplication::widgetAt(100,100)) && wr->objectName() == QString("w3")); - - w3->setAttribute(Qt::WA_TransparentForMouseEvents); - qApp->processEvents(); - QTRY_VERIFY((wr = QApplication::widgetAt(100, 100)) && wr->objectName() == QString("w2")); - - QRegion rgn = QRect(QPoint(0,0), w2->size()); - QPoint point = w2->mapFromGlobal(QPoint(100,100)); - rgn -= QRect(point, QSize(1,1)); - w2->setMask(rgn); - qApp->processEvents(); - QTest::qWait(10); -#if defined(Q_OS_WINCE) - QEXPECT_FAIL("", "Windows CE does only support rectangular regions", Continue); //See also task 147191 -#endif -#if defined(Q_WS_QPA) - QEXPECT_FAIL("", "Window mask not implemented on Lighthouse", Continue); -#endif - - QTRY_COMPARE(QApplication::widgetAt(100,100)->objectName(), w1->objectName()); - QTRY_COMPARE(QApplication::widgetAt(101,101)->objectName(), w2->objectName()); - - QBitmap bitmap(w2->size()); - QPainter p(&bitmap); - p.fillRect(bitmap.rect(), Qt::color1); - p.setPen(Qt::color0); - p.drawPoint(w2->mapFromGlobal(QPoint(100,100))); - p.end(); - w2->setMask(bitmap); - qApp->processEvents(); - QTest::qWait(10); -#if defined(Q_OS_WINCE) - QEXPECT_FAIL("", "Windows CE does only support rectangular regions", Continue); //See also task 147191 -#endif -#if defined(Q_WS_QPA) - QEXPECT_FAIL("", "Window mask not implemented on Lighthouse", Continue); -#endif - QTRY_VERIFY(QApplication::widgetAt(100,100) == w1); - QTRY_VERIFY(QApplication::widgetAt(101,101) == w2); - - delete w2; - delete w1; -} - -#if defined(Q_WS_X11) -bool getProperty(Display *display, Window target, Atom type, Atom property, - unsigned char** data, unsigned long* count) -{ - Atom atom_return; - int size; - unsigned long nitems, bytes_left; - - int ret = XGetWindowProperty(display, target, property, - 0l, 1l, false, - type, &atom_return, &size, - &nitems, &bytes_left, data); - if (ret != Success || nitems < 1) - return false; - - if (bytes_left != 0) { - XFree(*data); - unsigned long remain = ((size / 8) * nitems) + bytes_left; - ret = XGetWindowProperty(display, target, - property, 0l, remain, false, - type, &atom_return, &size, - &nitems, &bytes_left, data); - if (ret != Success) - return false; - } - - *count = nitems; - return true; -} - -QString textPropertyToString(Display *display, XTextProperty& text_prop) -{ - QString ret; - if (text_prop.value && text_prop.nitems > 0) { - if (text_prop.encoding == XA_STRING) { - ret = reinterpret_cast<char *>(text_prop.value); - } else { - text_prop.nitems = strlen(reinterpret_cast<char *>(text_prop.value)); - char **list; - int num; - if (XmbTextPropertyToTextList(display, &text_prop, &list, &num) == Success - && num > 0 && *list) { - ret = QString::fromLocal8Bit(*list); - XFreeStringList(list); - } - } - } - return ret; -} -#endif - -void tst_QWidget::task110173() -{ - QWidget w; - - QPushButton *pb1 = new QPushButton("click", &w); - pb1->setFocusPolicy(Qt::ClickFocus); - pb1->move(100, 100); - - QPushButton *pb2 = new QPushButton("push", &w); - pb2->setFocusPolicy(Qt::ClickFocus); - pb2->move(300, 300); - - QTest::keyClick( &w, Qt::Key_Tab ); - w.show(); - QTest::qWaitForWindowShown(&w); - QTest::qWait(200); -} - -class Widget : public QWidget -{ -public: - Widget() : deleteThis(false) { setFocusPolicy(Qt::StrongFocus); } - void actionEvent(QActionEvent *) { if (deleteThis) delete this; } - void changeEvent(QEvent *) { if (deleteThis) delete this; } - void closeEvent(QCloseEvent *) { if (deleteThis) delete this; } - void hideEvent(QHideEvent *) { if (deleteThis) delete this; } - void focusOutEvent(QFocusEvent *) { if (deleteThis) delete this; } - void keyPressEvent(QKeyEvent *) { if (deleteThis) delete this; } - void keyReleaseEvent(QKeyEvent *) { if (deleteThis) delete this; } - void mouseDoubleClickEvent(QMouseEvent *) { if (deleteThis) delete this; } - void mousePressEvent(QMouseEvent *) { if (deleteThis) delete this; } - void mouseReleaseEvent(QMouseEvent *) { if (deleteThis) delete this; } - void mouseMoveEvent(QMouseEvent *) { if (deleteThis) delete this; } - - bool deleteThis; -}; - -void tst_QWidget::testDeletionInEventHandlers() -{ - // closeEvent - QPointer<Widget> w = new Widget; - w->deleteThis = true; - w->close(); - QVERIFY(w == 0); - delete w; - - // focusOut (crashes) - //w = new Widget; - //w->show(); - //w->setFocus(); - //QVERIFY(qApp->focusWidget() == w); - //w->deleteThis = true; - //w->clearFocus(); - //QVERIFY(w == 0); - - // key press - w = new Widget; - w->show(); - w->deleteThis = true; - QTest::keyPress(w, Qt::Key_A); - QVERIFY(w == 0); - delete w; - - // key release - w = new Widget; - w->show(); - w->deleteThis = true; - QTest::keyRelease(w, Qt::Key_A); - QVERIFY(w == 0); - delete w; - - // mouse press - w = new Widget; - w->show(); - w->deleteThis = true; - QTest::mousePress(w, Qt::LeftButton); - QVERIFY(w == 0); - delete w; - - // mouse release - w = new Widget; - w->show(); - w->deleteThis = true; - QTest::mouseRelease(w, Qt::LeftButton); - QVERIFY(w == 0); - delete w; - - // mouse double click - w = new Widget; - w->show(); - w->deleteThis = true; - QTest::mouseDClick(w, Qt::LeftButton); - QVERIFY(w == 0); - delete w; - - // hide event (crashes) - //w = new Widget; - //w->show(); - //w->deleteThis = true; - //w->hide(); - //QVERIFY(w == 0); - - // action event - w = new Widget; - w->deleteThis = true; - w->addAction(new QAction(w)); - QVERIFY(w == 0); - delete w; - - // change event - w = new Widget; - w->show(); - w->deleteThis = true; - w->setMouseTracking(true); - QVERIFY(w == 0); - delete w; - - w = new Widget; - w->setMouseTracking(true); - w->show(); - w->deleteThis = true; - QMouseEvent me(QEvent::MouseMove, QPoint(0, 0), Qt::NoButton, Qt::NoButton, Qt::NoModifier); - QApplication::sendEvent(w, &me); - QVERIFY(w == 0); - delete w; -} - -#ifdef Q_WS_MAC - -/* - Test that retaining and releasing the HIView returned by QWidget::winId() - works even if the widget itself is deleted. -*/ -void tst_QWidget::retainHIView() -{ - // Single window - { - const WidgetViewPair window = createAndRetain(); - delete window.first; - QVERIFY(testAndRelease(window.second)); - } - - // Child widget - { - const WidgetViewPair parent = createAndRetain(); - const WidgetViewPair child = createAndRetain(parent.first); - - delete parent.first; - QVERIFY(testAndRelease(parent.second)); - QVERIFY(testAndRelease(child.second)); - } - - // Multiple children - { - const WidgetViewPair parent = createAndRetain(); - const WidgetViewPair child1 = createAndRetain(parent.first); - const WidgetViewPair child2 = createAndRetain(parent.first); - - delete parent.first; - QVERIFY(testAndRelease(parent.second)); - QVERIFY(testAndRelease(child1.second)); - QVERIFY(testAndRelease(child2.second)); - } - - // Grandchild widget - { - const WidgetViewPair parent = createAndRetain(); - const WidgetViewPair child = createAndRetain(parent.first); - const WidgetViewPair grandchild = createAndRetain(child.first); - - delete parent.first; - QVERIFY(testAndRelease(parent.second)); - QVERIFY(testAndRelease(child.second)); - QVERIFY(testAndRelease(grandchild.second)); - } - - // Reparent child widget - { - const WidgetViewPair parent1 = createAndRetain(); - const WidgetViewPair parent2 = createAndRetain(); - const WidgetViewPair child = createAndRetain(parent1.first); - - child.first->setParent(parent2.first); - - delete parent1.first; - QVERIFY(testAndRelease(parent1.second)); - delete parent2.first; - QVERIFY(testAndRelease(parent2.second)); - QVERIFY(testAndRelease(child.second)); - } - - // Reparent window - { - const WidgetViewPair window1 = createAndRetain(); - const WidgetViewPair window2 = createAndRetain(); - const WidgetViewPair child1 = createAndRetain(window1.first); - const WidgetViewPair child2 = createAndRetain(window2.first); - - window2.first->setParent(window1.first); - - delete window2.first; - QVERIFY(testAndRelease(window2.second)); - QVERIFY(testAndRelease(child2.second)); - delete window1.first; - QVERIFY(testAndRelease(window1.second)); - QVERIFY(testAndRelease(child1.second)); - } - - // Delete child widget - { - const WidgetViewPair parent = createAndRetain(); - const WidgetViewPair child = createAndRetain(parent.first); - - delete child.first; - QVERIFY(testAndRelease(child.second)); - delete parent.first; - QVERIFY(testAndRelease(parent.second)); - } -} - -void tst_QWidget::sheetOpacity() -{ - QWidget tmpWindow; - QWidget sheet(&tmpWindow, Qt::Sheet); - tmpWindow.show(); - sheet.show(); - QCOMPARE(int(sheet.windowOpacity() * 255), 242); // 95% - sheet.setParent(0, Qt::Dialog); - QCOMPARE(int(sheet.windowOpacity() * 255), 255); -} - -class MaskedPainter : public QWidget -{ -public: - QRect mask; - - MaskedPainter() - : mask(20, 20, 50, 50) - { - setMask(mask); - } - - void paintEvent(QPaintEvent *) - { - QPainter p(this); - p.fillRect(mask, QColor(Qt::red)); - } -}; - -/* - Verifies that the entire area inside the mask is painted red. -*/ -bool verifyWidgetMask(QWidget *widget, QRect mask) -{ - const QImage image = QPixmap::grabWindow(widget->winId()).toImage(); - - const QImage masked = image.copy(mask); - QImage red(masked); - red.fill(QColor(Qt::red).rgb()); - - return (masked == red); -} - -void tst_QWidget::setMask() -{ - testWidget->hide(); // get this out of the way. - - { - MaskedPainter w; - w.resize(200, 200); - w.show(); - QTest::qWait(100); - QVERIFY(verifyWidgetMask(&w, w.mask)); - } - { - MaskedPainter w; - w.resize(200, 200); - w.setWindowFlags(w.windowFlags() | Qt::FramelessWindowHint); - w.show(); - QTest::qWait(100); - QRect mask = w.mask; - - QVERIFY(verifyWidgetMask(&w, mask)); - } -} -#endif - -class StaticWidget : public QWidget -{ -Q_OBJECT -public: - bool partial; - bool gotPaintEvent; - QRegion paintedRegion; - - StaticWidget(QWidget *parent = 0) - :QWidget(parent) - { - setAttribute(Qt::WA_StaticContents); - setAttribute(Qt::WA_OpaquePaintEvent); - setPalette(Qt::red); // Make sure we have an opaque palette. - setAutoFillBackground(true); - gotPaintEvent = false; - } - - void paintEvent(QPaintEvent *e) - { - paintedRegion += e->region(); - gotPaintEvent = true; -// qDebug() << "paint" << e->region(); - // Look for a full update, set partial to false if found. - foreach(QRect r, e->region().rects()) { - partial = (r != rect()); - if (partial == false) - break; - } - } -}; - -/* - Test that widget resizes and moves can be done with minimal repaints when WA_StaticContents - and WA_OpaquePaintEvent is set. Test is mac-only for now. -*/ -void tst_QWidget::optimizedResizeMove() -{ - QWidget parent; - parent.resize(400, 400); - - StaticWidget staticWidget(&parent); - staticWidget.gotPaintEvent = false; - staticWidget.move(150, 150); - staticWidget.resize(150, 150); - parent.show(); - QTest::qWaitForWindowShown(&parent); - QTest::qWait(20); - QTRY_COMPARE(staticWidget.gotPaintEvent, true); - - staticWidget.gotPaintEvent = false; - staticWidget.move(staticWidget.pos() + QPoint(10, 10)); - QTest::qWait(20); - QCOMPARE(staticWidget.gotPaintEvent, false); - - staticWidget.gotPaintEvent = false; - staticWidget.move(staticWidget.pos() + QPoint(-10, -10)); - QTest::qWait(20); - QCOMPARE(staticWidget.gotPaintEvent, false); - - staticWidget.gotPaintEvent = false; - staticWidget.move(staticWidget.pos() + QPoint(-10, 10)); - QTest::qWait(20); - QCOMPARE(staticWidget.gotPaintEvent, false); - - staticWidget.gotPaintEvent = false; - staticWidget.resize(staticWidget.size() + QSize(10, 10)); - QTest::qWait(20); - QCOMPARE(staticWidget.gotPaintEvent, true); - QCOMPARE(staticWidget.partial, true); - - staticWidget.gotPaintEvent = false; - staticWidget.resize(staticWidget.size() + QSize(-10, -10)); - QTest::qWait(20); - QCOMPARE(staticWidget.gotPaintEvent, false); - - staticWidget.gotPaintEvent = false; - staticWidget.resize(staticWidget.size() + QSize(10, -10)); - QTest::qWait(20); - QCOMPARE(staticWidget.gotPaintEvent, true); - QCOMPARE(staticWidget.partial, true); - - staticWidget.gotPaintEvent = false; - staticWidget.move(staticWidget.pos() + QPoint(10, 10)); - staticWidget.resize(staticWidget.size() + QSize(-10, -10)); - QTest::qWait(20); - QCOMPARE(staticWidget.gotPaintEvent, false); - - staticWidget.gotPaintEvent = false; - staticWidget.move(staticWidget.pos() + QPoint(10, 10)); - staticWidget.resize(staticWidget.size() + QSize(10, 10)); - QTest::qWait(20); - QCOMPARE(staticWidget.gotPaintEvent, true); - QCOMPARE(staticWidget.partial, true); - - staticWidget.gotPaintEvent = false; - staticWidget.move(staticWidget.pos() + QPoint(-10, -10)); - staticWidget.resize(staticWidget.size() + QSize(-10, -10)); - QTest::qWait(20); - QCOMPARE(staticWidget.gotPaintEvent, false); - - staticWidget.setAttribute(Qt::WA_StaticContents, false); - staticWidget.gotPaintEvent = false; - staticWidget.move(staticWidget.pos() + QPoint(-10, -10)); - staticWidget.resize(staticWidget.size() + QSize(-10, -10)); - QTest::qWait(20); - QCOMPARE(staticWidget.gotPaintEvent, true); - QCOMPARE(staticWidget.partial, false); - staticWidget.setAttribute(Qt::WA_StaticContents, true); - - staticWidget.setAttribute(Qt::WA_StaticContents, false); - staticWidget.gotPaintEvent = false; - staticWidget.move(staticWidget.pos() + QPoint(10, 10)); - QTest::qWait(20); - QCOMPARE(staticWidget.gotPaintEvent, false); - staticWidget.setAttribute(Qt::WA_StaticContents, true); -} - -void tst_QWidget::optimizedResize_topLevel() -{ -#if defined(Q_WS_MAC) || defined(Q_WS_QWS) - QSKIP("We do not yet have static contents support for *top-levels* on this platform", SkipAll); -#endif - - StaticWidget topLevel; - topLevel.gotPaintEvent = false; - topLevel.show(); - QTest::qWaitForWindowShown(&topLevel); - QTest::qWait(10); - QTRY_COMPARE(topLevel.gotPaintEvent, true); - - topLevel.gotPaintEvent = false; - topLevel.partial = false; - topLevel.paintedRegion = QRegion(); - -#ifndef Q_WS_WIN - topLevel.resize(topLevel.size() + QSize(10, 10)); -#else - // Static contents does not work when programmatically resizing - // top-levels with QWidget::resize. We do some funky stuff in - // setGeometry_sys. However, resizing it with the mouse or with - // a native function call works (it basically has to go through - // WM_RESIZE in QApplication). This is a corner case, though. - // See task 243708 - const QRect frame = topLevel.frameGeometry(); - MoveWindow(topLevel.winId(), frame.x(), frame.y(), - frame.width() + 10, frame.height() + 10, - true); -#endif - - QTest::qWait(100); - - // Expected update region: New rect - old rect. - QRegion expectedUpdateRegion(topLevel.rect()); - expectedUpdateRegion -= QRect(QPoint(), topLevel.size() - QSize(10, 10)); - - QTRY_COMPARE(topLevel.gotPaintEvent, true); - QCOMPARE(topLevel.partial, true); - QCOMPARE(topLevel.paintedRegion, expectedUpdateRegion); -} - -class SiblingDeleter : public QWidget -{ -public: - inline SiblingDeleter(QWidget *sibling, QWidget *parent) - : QWidget(parent), sibling(sibling) {} - inline virtual ~SiblingDeleter() { delete sibling; } - -private: - QPointer<QWidget> sibling; -}; - - -void tst_QWidget::childDeletesItsSibling() -{ - QWidget *commonParent = new QWidget(0); - QPointer<QWidget> child = new QWidget(0); - QPointer<QWidget> siblingDeleter = new SiblingDeleter(child, commonParent); - child->setParent(commonParent); - delete commonParent; // don't crash - QVERIFY(!child); - QVERIFY(!siblingDeleter); - -} - -#ifdef Q_WS_QWS -# define SET_SAFE_SIZE(w) \ - do { \ - QSize safeSize(qt_screen->width() - 250, qt_screen->height() - 250); \ - if (!safeSize.isValid()) \ - QSKIP("Screen size too small", SkipAll); \ - if (defaultSize.width() > safeSize.width() || defaultSize.height() > safeSize.height()) { \ - defaultSize = safeSize; \ - w.resize(defaultSize); \ - w.setAttribute(Qt::WA_Resized, false); \ - } \ - } while (false) -#else -# define SET_SAFE_SIZE(w) -#endif - - -void tst_QWidget::setMinimumSize() -{ - QWidget w; - QSize defaultSize = w.size(); - SET_SAFE_SIZE(w); - - w.setMinimumSize(defaultSize + QSize(100, 100)); - QCOMPARE(w.size(), defaultSize + QSize(100, 100)); - QVERIFY(!w.testAttribute(Qt::WA_Resized)); - - w.setMinimumSize(defaultSize + QSize(50, 50)); - QCOMPARE(w.size(), defaultSize + QSize(100, 100)); - QVERIFY(!w.testAttribute(Qt::WA_Resized)); - - w.setMinimumSize(defaultSize + QSize(200, 200)); - QCOMPARE(w.size(), defaultSize + QSize(200, 200)); - QVERIFY(!w.testAttribute(Qt::WA_Resized)); - - // Setting a minimum size larger than the desktop does not work on WinCE, - // so skip this part of the test. -#ifndef Q_OS_WINCE - QSize nonDefaultSize = defaultSize + QSize(5,5); - w.setMinimumSize(nonDefaultSize); - w.show(); - QTest::qWait(50); - QVERIFY(w.height() >= nonDefaultSize.height()); - QVERIFY(w.width() >= nonDefaultSize.width()); -#endif -} - -void tst_QWidget::setMaximumSize() -{ - QWidget w; - QSize defaultSize = w.size(); - SET_SAFE_SIZE(w); - - w.setMinimumSize(defaultSize + QSize(100, 100)); - QCOMPARE(w.size(), defaultSize + QSize(100, 100)); - QVERIFY(!w.testAttribute(Qt::WA_Resized)); - w.setMinimumSize(defaultSize); - - w.setMaximumSize(defaultSize + QSize(200, 200)); - QCOMPARE(w.size(), defaultSize + QSize(100, 100)); - QVERIFY(!w.testAttribute(Qt::WA_Resized)); - - w.setMaximumSize(defaultSize + QSize(50, 50)); - QCOMPARE(w.size(), defaultSize + QSize(50, 50)); - QVERIFY(!w.testAttribute(Qt::WA_Resized)); - -#if 0 - //we don't enforce maximum size on show, apparently - QSize nonDefaultSize = defaultSize - QSize(5,5); - w.setMaximumSize(nonDefaultSize); - w.show(); - QTest::qWait(50); - qDebug() << nonDefaultSize << w.size(); - QVERIFY(w.height() <= nonDefaultSize.height()); - QVERIFY(w.width() <= nonDefaultSize.width()); -#endif -} - -void tst_QWidget::setFixedSize() -{ - QWidget w; - QSize defaultSize = w.size(); - SET_SAFE_SIZE(w); - - w.setFixedSize(defaultSize + QSize(100, 100)); - QCOMPARE(w.size(), defaultSize + QSize(100, 100)); - QVERIFY(w.testAttribute(Qt::WA_Resized)); - - w.setFixedSize(defaultSize + QSize(200, 200)); - - QCOMPARE(w.minimumSize(), defaultSize + QSize(200,200)); - QCOMPARE(w.maximumSize(), defaultSize + QSize(200,200)); - QCOMPARE(w.size(), defaultSize + QSize(200, 200)); - QVERIFY(w.testAttribute(Qt::WA_Resized)); - - w.setFixedSize(defaultSize + QSize(50, 50)); - QCOMPARE(w.size(), defaultSize + QSize(50, 50)); - QVERIFY(w.testAttribute(Qt::WA_Resized)); - - w.setAttribute(Qt::WA_Resized, false); - w.setFixedSize(defaultSize + QSize(50, 50)); - QVERIFY(!w.testAttribute(Qt::WA_Resized)); - - w.setFixedSize(defaultSize + QSize(150, 150)); - w.show(); - QTest::qWait(50); - QVERIFY(w.size() == defaultSize + QSize(150,150)); -} - -void tst_QWidget::ensureCreated() -{ - { - QWidget widget; - WId widgetWinId = widget.winId(); - Q_UNUSED(widgetWinId); - QVERIFY(widget.testAttribute(Qt::WA_WState_Created)); - } - - { - QWidget window; - - QDialog dialog(&window); - dialog.setWindowModality(Qt::NonModal); - - WId dialogWinId = dialog.winId(); - Q_UNUSED(dialogWinId); - QVERIFY(dialog.testAttribute(Qt::WA_WState_Created)); - QVERIFY(window.testAttribute(Qt::WA_WState_Created)); - } - - { - QWidget window; - - QDialog dialog(&window); - dialog.setWindowModality(Qt::WindowModal); - - WId dialogWinId = dialog.winId(); - Q_UNUSED(dialogWinId); - QVERIFY(dialog.testAttribute(Qt::WA_WState_Created)); - QVERIFY(window.testAttribute(Qt::WA_WState_Created)); - } - - { - QWidget window; - - QDialog dialog(&window); - dialog.setWindowModality(Qt::ApplicationModal); - - WId dialogWinId = dialog.winId(); - Q_UNUSED(dialogWinId); - QVERIFY(dialog.testAttribute(Qt::WA_WState_Created)); - QVERIFY(window.testAttribute(Qt::WA_WState_Created)); - } -} - -class WinIdChangeWidget : public QWidget { -public: - WinIdChangeWidget(QWidget *p = 0) - : QWidget(p) - { - - } -protected: - bool event(QEvent *e) - { - if (e->type() == QEvent::WinIdChange) { - m_winIdList.append(internalWinId()); - return true; - } - return QWidget::event(e); - } -public: - QList<WId> m_winIdList; - int winIdChangeEventCount() const { return m_winIdList.count(); } -}; - -void tst_QWidget::winIdChangeEvent() -{ - { - // Transforming an alien widget into a native widget - WinIdChangeWidget widget; - const WId winIdBefore = widget.internalWinId(); - const WId winIdAfter = widget.winId(); - QVERIFY(winIdBefore != winIdAfter); - QCOMPARE(widget.winIdChangeEventCount(), 1); - } - - { - // Changing parent of a native widget - // Should cause winId of child to change, on all platforms - QWidget parent1, parent2; - WinIdChangeWidget child(&parent1); - const WId winIdBefore = child.winId(); - QCOMPARE(child.winIdChangeEventCount(), 1); - child.setParent(&parent2); - const WId winIdAfter = child.internalWinId(); - QVERIFY(winIdBefore != winIdAfter); - QCOMPARE(child.winIdChangeEventCount(), 3); - // winId is set to zero during reparenting - QVERIFY(0 == child.m_winIdList[1]); - } - - { - // Changing grandparent of a native widget - QWidget grandparent1, grandparent2; - QWidget parent(&grandparent1); - WinIdChangeWidget child(&parent); - const WId winIdBefore = child.winId(); - QCOMPARE(child.winIdChangeEventCount(), 1); - parent.setParent(&grandparent2); - const WId winIdAfter = child.internalWinId(); - QCOMPARE(winIdBefore, winIdAfter); - QCOMPARE(child.winIdChangeEventCount(), 1); - } - - { - // Changing parent of an alien widget - QWidget parent1, parent2; - WinIdChangeWidget child(&parent1); - const WId winIdBefore = child.internalWinId(); - child.setParent(&parent2); - const WId winIdAfter = child.internalWinId(); - QCOMPARE(winIdBefore, winIdAfter); - QCOMPARE(child.winIdChangeEventCount(), 0); - } - - { - // Making native child widget into a top-level window - QWidget parent; - WinIdChangeWidget child(&parent); - child.winId(); - const WId winIdBefore = child.internalWinId(); - QCOMPARE(child.winIdChangeEventCount(), 1); - const Qt::WindowFlags flags = child.windowFlags(); - child.setWindowFlags(flags | Qt::Window); - const WId winIdAfter = child.internalWinId(); - QVERIFY(winIdBefore != winIdAfter); - QCOMPARE(child.winIdChangeEventCount(), 3); - // winId is set to zero during reparenting - QVERIFY(0 == child.m_winIdList[1]); - } -} - -void tst_QWidget::persistentWinId() -{ - QWidget *parent = new QWidget; - QWidget *w1 = new QWidget; - QWidget *w2 = new QWidget; - QWidget *w3 = new QWidget; - w1->setParent(parent); - w2->setParent(w1); - w3->setParent(w2); - - WId winId1 = w1->winId(); - WId winId2 = w2->winId(); - WId winId3 = w3->winId(); - - // reparenting should change the winId of the widget being reparented, but not of its children - w1->setParent(0); - QVERIFY(w1->winId() != winId1); - winId1 = w1->winId(); - QCOMPARE(w2->winId(), winId2); - QCOMPARE(w3->winId(), winId3); - - w1->setParent(parent); - QVERIFY(w1->winId() != winId1); - winId1 = w1->winId(); - QCOMPARE(w2->winId(), winId2); - QCOMPARE(w3->winId(), winId3); - - w2->setParent(0); - QVERIFY(w2->winId() != winId2); - winId2 = w2->winId(); - QCOMPARE(w3->winId(), winId3); - - w2->setParent(parent); - QVERIFY(w2->winId() != winId2); - winId2 = w2->winId(); - QCOMPARE(w3->winId(), winId3); - - w2->setParent(w1); - QVERIFY(w2->winId() != winId2); - winId2 = w2->winId(); - QCOMPARE(w3->winId(), winId3); - - w3->setParent(0); - QVERIFY(w3->winId() != winId3); - winId3 = w3->winId(); - - w3->setParent(w1); - QVERIFY(w3->winId() != winId3); - winId3 = w3->winId(); - - w3->setParent(w2); - QVERIFY(w3->winId() != winId3); - winId3 = w3->winId(); - - delete parent; -} - -void tst_QWidget::showNativeChild() -{ - QWidget topLevel; - topLevel.setGeometry(0, 0, 100, 100); - QWidget child(&topLevel); - child.winId(); - topLevel.show(); - QTest::qWaitForWindowShown(&topLevel); -} - -class ShowHideEventWidget : public QWidget -{ -public: - int numberOfShowEvents, numberOfHideEvents; - - ShowHideEventWidget(QWidget *parent = 0) - : QWidget(parent), numberOfShowEvents(0), numberOfHideEvents(0) - { } - - void create() - { QWidget::create(); } - - void showEvent(QShowEvent *) - { ++numberOfShowEvents; } - - void hideEvent(QHideEvent *) - { ++numberOfHideEvents; } -}; - -void tst_QWidget::showHideEvent_data() -{ - QTest::addColumn<bool>("show"); - QTest::addColumn<bool>("hide"); - QTest::addColumn<bool>("create"); - QTest::addColumn<int>("expectedShowEvents"); - QTest::addColumn<int>("expectedHideEvents"); - - QTest::newRow("window: only show") - << true - << false - << false - << 1 - << 0; - QTest::newRow("window: show/hide") - << true - << true - << false - << 1 - << 1; - QTest::newRow("window: show/hide/create") - << true - << true - << true - << 1 - << 1; - QTest::newRow("window: hide/create") - << false - << true - << true - << 0 - << 0; - QTest::newRow("window: only hide") - << false - << true - << false - << 0 - << 0; - QTest::newRow("window: nothing") - << false - << false - << false - << 0 - << 0; -} - -void tst_QWidget::showHideEvent() -{ - QFETCH(bool, show); - QFETCH(bool, hide); - QFETCH(bool, create); - QFETCH(int, expectedShowEvents); - QFETCH(int, expectedHideEvents); - - ShowHideEventWidget widget; - if (show) - widget.show(); - if (hide) - widget.hide(); - if (create && !widget.testAttribute(Qt::WA_WState_Created)) - widget.create(); - - QCOMPARE(widget.numberOfShowEvents, expectedShowEvents); - QCOMPARE(widget.numberOfHideEvents, expectedHideEvents); -} - -void tst_QWidget::update() -{ - QTest::qWait(10); // Wait for the initStuff to do it's stuff. - Q_CHECK_PAINTEVENTS - - UpdateWidget w; - w.setGeometry(50, 50, 100, 100); - w.show(); - QTest::qWaitForWindowShown(&w); - - QApplication::processEvents(); - QApplication::processEvents(); - -#ifdef Q_OS_MAC - QEXPECT_FAIL(0, "Cocoa compositor says to paint this twice.", Continue); -#endif - QTRY_COMPARE(w.numPaintEvents, 1); - - QCOMPARE(w.visibleRegion(), QRegion(w.rect())); - QCOMPARE(w.paintedRegion, w.visibleRegion()); - w.reset(); - - UpdateWidget child(&w); - child.setGeometry(10, 10, 80, 80); - child.show(); - - QPoint childOffset = child.mapToParent(QPoint()); - - // widgets are transparent by default, so both should get repaints - { - QApplication::processEvents(); - QApplication::processEvents(); - QCOMPARE(child.numPaintEvents, 1); - QCOMPARE(child.visibleRegion(), QRegion(child.rect())); - QCOMPARE(child.paintedRegion, child.visibleRegion()); - QCOMPARE(w.numPaintEvents, 1); - QCOMPARE(w.visibleRegion(), QRegion(w.rect())); - QCOMPARE(w.paintedRegion, child.visibleRegion().translated(childOffset)); - - w.reset(); - child.reset(); - - w.update(); - QApplication::processEvents(); - QApplication::processEvents(); - QCOMPARE(child.numPaintEvents, 1); - QCOMPARE(child.visibleRegion(), QRegion(child.rect())); - QCOMPARE(child.paintedRegion, child.visibleRegion()); - QCOMPARE(w.numPaintEvents, 1); - QCOMPARE(w.visibleRegion(), QRegion(w.rect())); - QCOMPARE(w.paintedRegion, w.visibleRegion()); - } - - QPalette opaquePalette = child.palette(); - opaquePalette.setColor(child.backgroundRole(), QColor(Qt::red)); - - // setting an opaque background on the child should prevent paint-events - // for the parent in the child area - { - child.setPalette(opaquePalette); - child.setAutoFillBackground(true); - QApplication::processEvents(); - - w.reset(); - child.reset(); - - w.update(); - QApplication::processEvents(); - QApplication::processEvents(); - - QCOMPARE(w.numPaintEvents, 1); - QRegion expectedVisible = QRegion(w.rect()) - - child.visibleRegion().translated(childOffset); - QCOMPARE(w.visibleRegion(), expectedVisible); - QCOMPARE(w.paintedRegion, expectedVisible); - QCOMPARE(child.numPaintEvents, 0); - - w.reset(); - child.reset(); - - child.update(); - QApplication::processEvents(); - QApplication::processEvents(); - - QCOMPARE(w.numPaintEvents, 0); - QCOMPARE(child.numPaintEvents, 1); - QCOMPARE(child.paintedRegion, child.visibleRegion()); - - w.reset(); - child.reset(); - } - - // overlapping sibling - UpdateWidget sibling(&w); - child.setGeometry(10, 10, 20, 20); - sibling.setGeometry(15, 15, 20, 20); - sibling.show(); - - QApplication::processEvents(); - w.reset(); - child.reset(); - sibling.reset(); - - const QPoint siblingOffset = sibling.mapToParent(QPoint()); - - sibling.update(); - QApplication::processEvents(); - QApplication::processEvents(); - - // child is opaque, sibling transparent - { - QCOMPARE(sibling.numPaintEvents, 1); - QCOMPARE(sibling.paintedRegion, sibling.visibleRegion()); - - QCOMPARE(child.numPaintEvents, 1); - QCOMPARE(child.paintedRegion.translated(childOffset), - child.visibleRegion().translated(childOffset) - & sibling.visibleRegion().translated(siblingOffset)); - - QCOMPARE(w.numPaintEvents, 1); - QCOMPARE(w.paintedRegion, - w.visibleRegion() & sibling.visibleRegion().translated(siblingOffset)); - QCOMPARE(w.paintedRegion, - (w.visibleRegion() - child.visibleRegion().translated(childOffset)) - & sibling.visibleRegion().translated(siblingOffset)); - - } - w.reset(); - child.reset(); - sibling.reset(); - - sibling.setPalette(opaquePalette); - sibling.setAutoFillBackground(true); - - sibling.update(); - QApplication::processEvents(); - QApplication::processEvents(); - - // child opaque, sibling opaque - { - QCOMPARE(sibling.numPaintEvents, 1); - QCOMPARE(sibling.paintedRegion, sibling.visibleRegion()); - -#ifdef Q_OS_MAC - if (child.internalWinId()) // child is native - QEXPECT_FAIL(0, "Cocoa compositor paints child and sibling", Continue); -#endif - QCOMPARE(child.numPaintEvents, 0); - QCOMPARE(child.visibleRegion(), - QRegion(child.rect()) - - sibling.visibleRegion().translated(siblingOffset - childOffset)); - - QCOMPARE(w.numPaintEvents, 0); - QCOMPARE(w.visibleRegion(), - QRegion(w.rect()) - - child.visibleRegion().translated(childOffset) - - sibling.visibleRegion().translated(siblingOffset)); - } -} - -static inline bool isOpaque(QWidget *widget) -{ - if (!widget) - return false; - return qt_widget_private(widget)->isOpaque; -} - -void tst_QWidget::isOpaque() -{ -#ifndef Q_WS_MAC - QWidget w; - QVERIFY(::isOpaque(&w)); - - QWidget child(&w); - QVERIFY(!::isOpaque(&child)); - - child.setAutoFillBackground(true); - QVERIFY(::isOpaque(&child)); - - QPalette palette; - - // background color - - palette = child.palette(); - palette.setColor(child.backgroundRole(), QColor(255, 0, 0, 127)); - child.setPalette(palette); - QVERIFY(!::isOpaque(&child)); - - palette.setColor(child.backgroundRole(), QColor(255, 0, 0, 255)); - child.setPalette(palette); - QVERIFY(::isOpaque(&child)); - - palette.setColor(QPalette::Window, QColor(0, 0, 255, 127)); - w.setPalette(palette); - - QVERIFY(!::isOpaque(&w)); - - child.setAutoFillBackground(false); - QVERIFY(!::isOpaque(&child)); - - // Qt::WA_OpaquePaintEvent - - child.setAttribute(Qt::WA_OpaquePaintEvent); - QVERIFY(::isOpaque(&child)); - - child.setAttribute(Qt::WA_OpaquePaintEvent, false); - QVERIFY(!::isOpaque(&child)); - - // Qt::WA_NoSystemBackground - - child.setAttribute(Qt::WA_NoSystemBackground); - QVERIFY(!::isOpaque(&child)); - - child.setAttribute(Qt::WA_NoSystemBackground, false); - QVERIFY(!::isOpaque(&child)); - - palette.setColor(QPalette::Window, QColor(0, 0, 255, 255)); - w.setPalette(palette); - QVERIFY(::isOpaque(&w)); - - w.setAttribute(Qt::WA_NoSystemBackground); - QVERIFY(!::isOpaque(&w)); - - w.setAttribute(Qt::WA_NoSystemBackground, false); - QVERIFY(::isOpaque(&w)); - - { - QPalette palette = QApplication::palette(); - QPalette old = palette; - palette.setColor(QPalette::Window, Qt::transparent); - QApplication::setPalette(palette); - - QWidget widget; - QVERIFY(!::isOpaque(&widget)); - - QApplication::setPalette(old); - QCOMPARE(::isOpaque(&widget), old.color(QPalette::Window).alpha() == 255); - } -#endif -} - -#ifndef Q_WS_MAC -/* - Test that scrolling of a widget invalidates the correct regions -*/ -void tst_QWidget::scroll() -{ - UpdateWidget updateWidget; - updateWidget.resize(500, 500); - updateWidget.reset(); - updateWidget.show(); - QTest::qWaitForWindowShown(&updateWidget); - QTest::qWait(50); - qApp->processEvents(); - QTRY_VERIFY(updateWidget.numPaintEvents > 0); - - { - updateWidget.reset(); - updateWidget.scroll(10, 10); - qApp->processEvents(); - QRegion dirty(QRect(0, 0, 500, 10)); - dirty += QRegion(QRect(0, 10, 10, 490)); - QCOMPARE(updateWidget.paintedRegion, dirty); - } - - { - updateWidget.reset(); - updateWidget.update(0, 0, 10, 10); - updateWidget.scroll(0, 10); - qApp->processEvents(); - QRegion dirty(QRect(0, 0, 500, 10)); - dirty += QRegion(QRect(0, 10, 10, 10)); - QCOMPARE(updateWidget.paintedRegion, dirty); - } - - { - updateWidget.reset(); - updateWidget.update(0, 0, 100, 100); - updateWidget.scroll(10, 10, QRect(50, 50, 100, 100)); - qApp->processEvents(); - QRegion dirty(QRect(0, 0, 100, 50)); - dirty += QRegion(QRect(0, 50, 150, 10)); - dirty += QRegion(QRect(0, 60, 110, 40)); - dirty += QRegion(QRect(50, 100, 60, 10)); - dirty += QRegion(QRect(50, 110, 10, 40)); - QCOMPARE(updateWidget.paintedRegion, dirty); - } - - { - updateWidget.reset(); - updateWidget.update(0, 0, 100, 100); - updateWidget.scroll(10, 10, QRect(100, 100, 100, 100)); - qApp->processEvents(); - QRegion dirty(QRect(0, 0, 100, 100)); - dirty += QRegion(QRect(100, 100, 100, 10)); - dirty += QRegion(QRect(100, 110, 10, 90)); - QCOMPARE(updateWidget.paintedRegion, dirty); - } -} -#endif - -class DestroyedSlotChecker : public QObject -{ - Q_OBJECT - -public: - bool wasQWidget; - - DestroyedSlotChecker() - : wasQWidget(false) - { - } - -public slots: - void destroyedSlot(QObject *object) - { - wasQWidget = (qobject_cast<QWidget *>(object) != 0 || object->isWidgetType()); - } -}; - -/* - Test that qobject_cast<QWidget*> returns 0 in a slot - connected to QObject::destroyed. -*/ -void tst_QWidget::qobject_castInDestroyedSlot() -{ - DestroyedSlotChecker checker; - QWidget *widget = new QWidget(); - - QObject::connect(widget, SIGNAL(destroyed(QObject *)), &checker, SLOT(destroyedSlot(QObject *))); - delete widget; - - QVERIFY(checker.wasQWidget == true); -} - -Q_DECLARE_METATYPE(QList<QRect>) - -// Since X11 WindowManager operations are all async, and we have no way to know if the window -// manager has finished playing with the window geometry, this test can't be reliable on X11. -#ifndef Q_WS_X11 -void tst_QWidget::setWindowGeometry_data() -{ - QTest::addColumn<QList<QRect> >("rects"); - QTest::addColumn<int>("windowFlags"); - - QList<QList<QRect> > rects; - rects << (QList<QRect>() - << QRect(100, 100, 200, 200) - << QApplication::desktop()->availableGeometry().adjusted(100, 100, -100, -100) - << QRect(130, 100, 0, 200) - << QRect(100, 50, 200, 0) - << QRect(130, 50, 0, 0)) - << (QList<QRect>() - << QApplication::desktop()->availableGeometry().adjusted(100, 100, -100, -100) - << QRect(130, 100, 0, 200) - << QRect(100, 50, 200, 0) - << QRect(130, 50, 0, 0) - << QRect(100, 100, 200, 200)) - << (QList<QRect>() - << QRect(130, 100, 0, 200) - << QRect(100, 50, 200, 0) - << QRect(130, 50, 0, 0) - << QRect(100, 100, 200, 200) - << QApplication::desktop()->availableGeometry().adjusted(100, 100, -100, -100)) - << (QList<QRect>() - << QRect(100, 50, 200, 0) - << QRect(130, 50, 0, 0) - << QRect(100, 100, 200, 200) - << QApplication::desktop()->availableGeometry().adjusted(100, 100, -100, -100) - << QRect(130, 100, 0, 200)) - << (QList<QRect>() - << QRect(130, 50, 0, 0) - << QRect(100, 100, 200, 200) - << QApplication::desktop()->availableGeometry().adjusted(100, 100, -100, -100) - << QRect(130, 100, 0, 200) - << QRect(100, 50, 200, 0)); - - QList<int> windowFlags; - windowFlags << 0 << Qt::FramelessWindowHint; - - foreach (QList<QRect> l, rects) { - QRect rect = l.first(); - foreach (int windowFlag, windowFlags) { - QTest::newRow(QString("%1,%2 %3x%4, flags %5") - .arg(rect.x()) - .arg(rect.y()) - .arg(rect.width()) - .arg(rect.height()) - .arg(windowFlag, 0, 16).toAscii()) - << l - << windowFlag; - } - } -} - -void tst_QWidget::setWindowGeometry() -{ - QFETCH(QList<QRect>, rects); - QFETCH(int, windowFlags); - QRect rect = rects.takeFirst(); - - { - // test setGeometry() without actually showing the window - QWidget widget; - if (windowFlags != 0) - widget.setWindowFlags(Qt::WindowFlags(windowFlags)); - - widget.setGeometry(rect); - QTest::qWait(100); - QCOMPARE(widget.geometry(), rect); - - // setGeometry() without showing - foreach (QRect r, rects) { - widget.setGeometry(r); - QTest::qWait(100); - QCOMPARE(widget.geometry(), r); - } - } - - { - // setGeometry() first, then show() - QWidget widget; - if (windowFlags != 0) - widget.setWindowFlags(Qt::WindowFlags(windowFlags)); - - widget.setGeometry(rect); - widget.show(); - QTest::qWaitForWindowShown(&widget); - QTest::qWait(20); - QTRY_COMPARE(widget.geometry(), rect); - - // setGeometry() while shown - foreach (QRect r, rects) { - widget.setGeometry(r); - QTest::qWait(10); - QTRY_COMPARE(widget.geometry(), r); - } - widget.setGeometry(rect); - QTest::qWait(20); - QTRY_COMPARE(widget.geometry(), rect); - - // now hide - widget.hide(); - QTest::qWait(20); - QTRY_COMPARE(widget.geometry(), rect); - - // setGeometry() after hide() - foreach (QRect r, rects) { - widget.setGeometry(r); - QTest::qWait(10); - QTRY_COMPARE(widget.geometry(), r); - } - widget.setGeometry(rect); - QTest::qWait(10); - QTRY_COMPARE(widget.geometry(), rect); - - // show() again, geometry() should still be the same - widget.show(); - QTest::qWaitForWindowShown(&widget); - QTest::qWait(10); - QTRY_COMPARE(widget.geometry(), rect); - - // final hide(), again geometry() should be unchanged - widget.hide(); - QTest::qWait(10); - QTRY_COMPARE(widget.geometry(), rect); - } - - { - // show() first, then setGeometry() - QWidget widget; - if (windowFlags != 0) - widget.setWindowFlags(Qt::WindowFlags(windowFlags)); - - widget.show(); - QTest::qWaitForWindowShown(&widget); - widget.setGeometry(rect); - QTest::qWait(10); - QTRY_COMPARE(widget.geometry(), rect); - - // setGeometry() while shown - foreach (QRect r, rects) { - widget.setGeometry(r); - QTest::qWait(10); - QTRY_COMPARE(widget.geometry(), r); - } - widget.setGeometry(rect); - QTest::qWait(10); - QTRY_COMPARE(widget.geometry(), rect); - - // now hide - widget.hide(); - QTest::qWait(10); - QTRY_COMPARE(widget.geometry(), rect); - - // setGeometry() after hide() - foreach (QRect r, rects) { - widget.setGeometry(r); - QTest::qWait(10); - QTRY_COMPARE(widget.geometry(), r); - } - widget.setGeometry(rect); - QTest::qWait(10); - QTRY_COMPARE(widget.geometry(), rect); - - // show() again, geometry() should still be the same - widget.show(); - QTest::qWaitForWindowShown(&widget); - QTest::qWait(10); - QTRY_COMPARE(widget.geometry(), rect); - - // final hide(), again geometry() should be unchanged - widget.hide(); - QTest::qWait(10); - QTRY_COMPARE(widget.geometry(), rect); - } -} -#endif - -#if defined (Q_WS_WIN) && !defined(Q_OS_WINCE) -void tst_QWidget::setGeometry_win() -{ - QWidget widget; - widget.setGeometry(0, 600, 100,100); - widget.show(); - widget.setWindowState(widget.windowState() | Qt::WindowMaximized); - QRect geom = widget.normalGeometry(); - widget.close(); - widget.setGeometry(geom); - widget.setWindowState(widget.windowState() | Qt::WindowMaximized); - widget.show(); - RECT rt; - ::GetWindowRect(widget.internalWinId(), &rt); - QVERIFY(rt.left <= 0); - QVERIFY(rt.top <= 0); -} -#endif - -// Since X11 WindowManager operation are all async, and we have no way to know if the window -// manager has finished playing with the window geometry, this test can't be reliable on X11. -// 4DWM issues on IRIX also makes this test fail. -#if !defined(Q_WS_X11) && !defined(Q_OS_IRIX) -void tst_QWidget::windowMoveResize_data() -{ - setWindowGeometry_data(); -} - -void tst_QWidget::windowMoveResize() -{ - QFETCH(QList<QRect>, rects); - QFETCH(int, windowFlags); - - QRect rect = rects.takeFirst(); - - { - // test setGeometry() without actually showing the window - QWidget widget; - if (windowFlags != 0) - widget.setWindowFlags(Qt::WindowFlags(windowFlags)); - - widget.move(rect.topLeft()); - widget.resize(rect.size()); - QTest::qWait(10); - QTRY_COMPARE(widget.pos(), rect.topLeft()); - QTRY_COMPARE(widget.size(), rect.size()); - - // move() without showing - foreach (QRect r, rects) { - widget.move(r.topLeft()); - widget.resize(r.size()); - QApplication::processEvents(); - QTRY_COMPARE(widget.pos(), r.topLeft()); - QTRY_COMPARE(widget.size(), r.size()); - } - } - - { - // move() first, then show() - QWidget widget; - if (windowFlags != 0) - widget.setWindowFlags(Qt::WindowFlags(windowFlags)); - - widget.move(rect.topLeft()); - widget.resize(rect.size()); - widget.show(); - - QTest::qWait(10); - QTRY_COMPARE(widget.pos(), rect.topLeft()); - QTRY_COMPARE(widget.size(), rect.size()); - - // move() while shown - foreach (QRect r, rects) { -#ifdef Q_WS_X11 - if ((widget.width() == 0 || widget.height() == 0) && r.width() != 0 && r.height() != 0) { - QEXPECT_FAIL("130,100 0x200, flags 0", - "First resize after show of zero-sized gets wrong win_gravity.", - Continue); - QEXPECT_FAIL("100,50 200x0, flags 0", - "First resize after show of zero-sized gets wrong win_gravity.", - Continue); - QEXPECT_FAIL("130,50 0x0, flags 0", - "First resize after show of zero-sized gets wrong win_gravity.", - Continue); - } -#endif - widget.move(r.topLeft()); - widget.resize(r.size()); - QApplication::processEvents(); - QTRY_COMPARE(widget.pos(), r.topLeft()); - QTRY_COMPARE(widget.size(), r.size()); - } - widget.move(rect.topLeft()); - widget.resize(rect.size()); - QApplication::processEvents(); - QTRY_COMPARE(widget.pos(), rect.topLeft()); - QTRY_COMPARE(widget.size(), rect.size()); - - // now hide - widget.hide(); - QTest::qWait(10); - QTRY_COMPARE(widget.pos(), rect.topLeft()); - QTRY_COMPARE(widget.size(), rect.size()); - - // move() after hide() - foreach (QRect r, rects) { - widget.move(r.topLeft()); - widget.resize(r.size()); - QApplication::processEvents(); -#if defined(Q_WS_MAC) - if (r.width() == 0 && r.height() > 0) { - widget.move(r.topLeft()); - widget.resize(r.size()); - } -#endif - QTRY_COMPARE(widget.pos(), r.topLeft()); - QTRY_COMPARE(widget.size(), r.size()); - } - widget.move(rect.topLeft()); - widget.resize(rect.size()); - QTest::qWait(10); - QTRY_COMPARE(widget.pos(), rect.topLeft()); - QTRY_COMPARE(widget.size(), rect.size()); - - // show() again, pos() should be the same - widget.show(); - QTest::qWaitForWindowShown(&widget); - QApplication::processEvents(); - QTRY_COMPARE(widget.pos(), rect.topLeft()); - QTRY_COMPARE(widget.size(), rect.size()); - - // final hide(), again pos() should be unchanged - widget.hide(); - QApplication::processEvents(); - QTRY_COMPARE(widget.pos(), rect.topLeft()); - QTRY_COMPARE(widget.size(), rect.size()); - } - - { - // show() first, then move() - QWidget widget; - if (windowFlags != 0) - widget.setWindowFlags(Qt::WindowFlags(windowFlags)); - - widget.show(); - QTest::qWaitForWindowShown(&widget); - QApplication::processEvents(); - widget.move(rect.topLeft()); - widget.resize(rect.size()); - QApplication::processEvents(); - QTRY_COMPARE(widget.pos(), rect.topLeft()); - QTRY_COMPARE(widget.size(), rect.size()); - - // move() while shown - foreach (QRect r, rects) { - widget.move(r.topLeft()); - widget.resize(r.size()); - QApplication::processEvents(); - QTRY_COMPARE(widget.pos(), r.topLeft()); - QTRY_COMPARE(widget.size(), r.size()); - } - widget.move(rect.topLeft()); - widget.resize(rect.size()); - QApplication::processEvents(); - QTRY_COMPARE(widget.pos(), rect.topLeft()); - QTRY_COMPARE(widget.size(), rect.size()); - - // now hide - widget.hide(); - QApplication::processEvents(); - QTRY_COMPARE(widget.pos(), rect.topLeft()); - QTRY_COMPARE(widget.size(), rect.size()); - - // move() after hide() - foreach (QRect r, rects) { - widget.move(r.topLeft()); - widget.resize(r.size()); - QApplication::processEvents(); -#if defined(Q_WS_MAC) - if (r.width() == 0 && r.height() > 0) { - widget.move(r.topLeft()); - widget.resize(r.size()); - } -#endif - QTRY_COMPARE(widget.pos(), r.topLeft()); - QTRY_COMPARE(widget.size(), r.size()); - } - widget.move(rect.topLeft()); - widget.resize(rect.size()); - QApplication::processEvents(); - QTRY_COMPARE(widget.pos(), rect.topLeft()); - QTRY_COMPARE(widget.size(), rect.size()); - - // show() again, pos() should be the same - widget.show(); - QTest::qWaitForWindowShown(&widget); - QTest::qWait(10); - QTRY_COMPARE(widget.pos(), rect.topLeft()); - QTRY_COMPARE(widget.size(), rect.size()); - - // final hide(), again pos() should be unchanged - widget.hide(); - QTest::qWait(10); - QTRY_COMPARE(widget.pos(), rect.topLeft()); - QTRY_COMPARE(widget.size(), rect.size()); - } -} -#endif - -class ColorWidget : public QWidget -{ -public: - ColorWidget(QWidget *parent = 0, const QColor &c = QColor(Qt::red)) - : QWidget(parent, Qt::FramelessWindowHint), color(c) - { - QPalette opaquePalette = palette(); - opaquePalette.setColor(backgroundRole(), color); - setPalette(opaquePalette); - setAutoFillBackground(true); - } - - void paintEvent(QPaintEvent *e) { - r += e->region(); - } - - void reset() { - r = QRegion(); - } - - QColor color; - QRegion r; -}; - -#define VERIFY_COLOR(region, color) { \ - const QRegion r = QRegion(region); \ - for (int i = 0; i < r.rects().size(); ++i) { \ - const QRect rect = r.rects().at(i); \ - for (int t = 0; t < 5; t++) { \ - const QPixmap pixmap = QPixmap::grabWindow(QDesktopWidget().winId(), \ - rect.left(), rect.top(), \ - rect.width(), rect.height()); \ - QCOMPARE(pixmap.size(), rect.size()); \ - QPixmap expectedPixmap(pixmap); /* ensure equal formats */ \ - expectedPixmap.detach(); \ - expectedPixmap.fill(color); \ - QImage image = pixmap.toImage(); \ - uint alphaCorrection = image.format() == QImage::Format_RGB32 ? 0xff000000 : 0; \ - uint firstPixel = image.pixel(0,0) | alphaCorrection; \ - if ( firstPixel != QColor(color).rgb() && t < 4 ) \ - { QTest::qWait(200); continue; } \ - QCOMPARE(firstPixel, QColor(color).rgb()); \ - QCOMPARE(pixmap, expectedPixmap); \ - break; \ - } \ - } \ -} - -void tst_QWidget::moveChild_data() -{ - QTest::addColumn<QPoint>("offset"); - - QTest::newRow("right") << QPoint(20, 0); - QTest::newRow("down") << QPoint(0, 20); - QTest::newRow("left") << QPoint(-20, 0); - QTest::newRow("up") << QPoint(0, -20); -} - -void tst_QWidget::moveChild() -{ - QFETCH(QPoint, offset); - - ColorWidget parent; - // prevent custom styles - parent.setStyle(new QWindowsStyle); - ColorWidget child(&parent, Qt::blue); - -#ifndef Q_OS_WINCE - parent.setGeometry(QRect(QPoint(QApplication::desktop()->availableGeometry(&parent).topLeft()), - QSize(100, 100))); -#else - parent.setGeometry(60, 60, 150, 150); -#endif - child.setGeometry(25, 25, 50, 50); - QPoint childOffset = child.mapToGlobal(QPoint()); - - parent.show(); - QTest::qWaitForWindowShown(&parent); - QTest::qWait(30); - const QPoint tlwOffset = parent.geometry().topLeft(); - - QTRY_COMPARE(parent.r, QRegion(parent.rect()) - child.geometry()); - QTRY_COMPARE(child.r, QRegion(child.rect())); - VERIFY_COLOR(child.geometry().translated(tlwOffset), - child.color); - VERIFY_COLOR(QRegion(parent.geometry()) - child.geometry().translated(tlwOffset), - parent.color); - parent.reset(); - child.reset(); - - // move - - const QRect oldGeometry = child.geometry(); - - QPoint pos = child.pos() + offset; - child.move(pos); - QTest::qWait(100); - QTRY_COMPARE(pos, child.pos()); - - QCOMPARE(parent.r, QRegion(oldGeometry) - child.geometry()); -#if !defined(Q_WS_MAC) - // should be scrolled in backingstore - QCOMPARE(child.r, QRegion()); -#endif - VERIFY_COLOR(child.geometry().translated(tlwOffset), - child.color); - VERIFY_COLOR(QRegion(parent.geometry()) - child.geometry().translated(tlwOffset), - parent.color); -} - -void tst_QWidget::showAndMoveChild() -{ - QWidget parent(0, Qt::FramelessWindowHint); - // prevent custom styles - parent.setStyle(new QWindowsStyle); - - QDesktopWidget desktop; - QRect desktopDimensions = desktop.availableGeometry(&parent); - desktopDimensions = desktopDimensions.adjusted(64, 64, -64, -64); - - parent.setGeometry(desktopDimensions); - parent.setPalette(Qt::red); - parent.show(); - QTest::qWaitForWindowShown(&parent); - QTest::qWait(10); - - const QPoint tlwOffset = parent.geometry().topLeft(); - QWidget child(&parent); - child.resize(desktopDimensions.width()/2, desktopDimensions.height()/2); - child.setPalette(Qt::blue); - child.setAutoFillBackground(true); - - // Ensure that the child is repainted correctly when moved right after show. - // NB! Do NOT processEvents() (or qWait()) in between show() and move(). - child.show(); - child.move(desktopDimensions.width()/2, desktopDimensions.height()/2); - qApp->processEvents(); - - VERIFY_COLOR(child.geometry().translated(tlwOffset), Qt::blue); - VERIFY_COLOR(QRegion(parent.geometry()) - child.geometry().translated(tlwOffset), Qt::red); -} - -// Cocoa only has rect granularity. -#ifndef QT_OS_MAC -void tst_QWidget::subtractOpaqueSiblings() -{ - QWidget w; - w.setGeometry(50, 50, 300, 300); - - ColorWidget *large = new ColorWidget(&w, Qt::red); - large->setGeometry(50, 50, 200, 200); - - ColorWidget *medium = new ColorWidget(large, Qt::gray); - medium->setGeometry(50, 50, 100, 100); - - ColorWidget *tall = new ColorWidget(&w, Qt::blue); - tall->setGeometry(100, 30, 50, 100); - - w.show(); - QTest::qWaitForWindowShown(&w); - QTest::qWait(10); - - large->reset(); - medium->reset(); - tall->reset(); - - medium->update(); - QTest::qWait(10); - - // QWidgetPrivate::subtractOpaqueSiblings() should prevent parts of medium - // to be repainted and tall from be repainted at all. - - QTRY_COMPARE(large->r, QRegion()); - QTRY_COMPARE(tall->r, QRegion()); - QTRY_COMPARE(medium->r.translated(medium->mapTo(&w, QPoint())), - QRegion(medium->geometry().translated(large->pos())) - - tall->geometry()); -} -#endif - -void tst_QWidget::deleteStyle() -{ - QWidget widget; - widget.setStyle(new QWindowsStyle); - widget.show(); - delete widget.style(); - qApp->processEvents(); -} - -#ifdef Q_WS_WIN -void tst_QWidget::getDC() -{ - QWidget widget; - widget.setGeometry(0, 0, 2, 4); - - HDC dc = widget.getDC(); - QVERIFY(dc != 0); - - widget.releaseDC(dc); -} -#endif - -class TopLevelFocusCheck: public QWidget -{ - Q_OBJECT -public: - QLineEdit* edit; - TopLevelFocusCheck(QWidget* parent = 0) : QWidget(parent) - { - edit = new QLineEdit(this); - edit->hide(); - edit->installEventFilter(this); - } - -public slots: - void mouseDoubleClickEvent ( QMouseEvent * /*event*/ ) - { - edit->show(); - edit->setFocus(Qt::OtherFocusReason); - qApp->processEvents(); - } - bool eventFilter(QObject *obj, QEvent *event) - { - if (obj == edit && event->type()== QEvent::FocusOut) { - edit->hide(); - return true; - } - return false; - } -}; - -void tst_QWidget::multipleToplevelFocusCheck() -{ - TopLevelFocusCheck w1; - TopLevelFocusCheck w2; - - w1.resize(200, 200); - w1.show(); - QTest::qWaitForWindowShown(&w1); - w2.resize(200,200); - w2.show(); - QTest::qWaitForWindowShown(&w2); - - QTest::qWait(100); - - QApplication::setActiveWindow(&w1); - w1.activateWindow(); - QApplication::processEvents(); - QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(&w1)); - QTest::qWait(50); - QTest::mouseDClick(&w1, Qt::LeftButton); - QTRY_COMPARE(QApplication::focusWidget(), static_cast<QWidget *>(w1.edit)); - - w2.activateWindow(); - QApplication::setActiveWindow(&w2); - QApplication::processEvents(); - QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(&w2)); - QTest::mouseClick(&w2, Qt::LeftButton); -#ifdef Q_WS_QWS - QEXPECT_FAIL("", "embedded toplevels take focus anyway", Continue); -#endif - QTRY_COMPARE(QApplication::focusWidget(), (QWidget *)0); - - QTest::mouseDClick(&w2, Qt::LeftButton); - QTRY_COMPARE(QApplication::focusWidget(), static_cast<QWidget *>(w2.edit)); - - w1.activateWindow(); - QApplication::setActiveWindow(&w1); - QApplication::processEvents(); - QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(&w1)); - QTest::mouseDClick(&w1, Qt::LeftButton); - QTRY_COMPARE(QApplication::focusWidget(), static_cast<QWidget *>(w1.edit)); - - w2.activateWindow(); - QApplication::setActiveWindow(&w2); - QApplication::processEvents(); - QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(&w2)); - QTest::mouseClick(&w2, Qt::LeftButton); - QTRY_COMPARE(QApplication::focusWidget(), (QWidget *)0); -} - -void tst_QWidget::setFocus() -{ - { - // move focus to another window - testWidget->activateWindow(); - QApplication::setActiveWindow(testWidget); - if (testWidget->focusWidget()) - testWidget->focusWidget()->clearFocus(); - else - testWidget->clearFocus(); - - // window and children never shown, nobody gets focus - QWidget window; - - QWidget child1(&window); - child1.setFocusPolicy(Qt::StrongFocus); - - QWidget child2(&window); - child2.setFocusPolicy(Qt::StrongFocus); - - child1.setFocus(); - QVERIFY(!child1.hasFocus()); - QCOMPARE(window.focusWidget(), &child1); - QCOMPARE(QApplication::focusWidget(), static_cast<QWidget *>(0)); - - child2.setFocus(); - QVERIFY(!child2.hasFocus()); - QCOMPARE(window.focusWidget(), &child2); - QCOMPARE(QApplication::focusWidget(), static_cast<QWidget *>(0)); - } - - { - // window and children show, but window not active, nobody gets focus - QWidget window; - - QWidget child1(&window); - child1.setFocusPolicy(Qt::StrongFocus); - - QWidget child2(&window); - child2.setFocusPolicy(Qt::StrongFocus); - - window.show(); - - // note: window may be active, but we don't want it to be - testWidget->activateWindow(); - QApplication::setActiveWindow(testWidget); - if (testWidget->focusWidget()) - testWidget->focusWidget()->clearFocus(); - else - testWidget->clearFocus(); - - child1.setFocus(); - QVERIFY(!child1.hasFocus()); - QCOMPARE(window.focusWidget(), &child1); - QCOMPARE(QApplication::focusWidget(), static_cast<QWidget *>(0)); - - child2.setFocus(); - QVERIFY(!child2.hasFocus()); - QCOMPARE(window.focusWidget(), &child2); - QCOMPARE(QApplication::focusWidget(), static_cast<QWidget *>(0)); - } - - { - // window and children show, but window *is* active, children get focus - QWidget window; - - QWidget child1(&window); - child1.setFocusPolicy(Qt::StrongFocus); - - QWidget child2(&window); - child2.setFocusPolicy(Qt::StrongFocus); - - window.show(); -#ifdef Q_WS_X11 - QApplication::setActiveWindow(&window); - QTest::qWaitForWindowShown(&window); -#else - window.activateWindow(); - QApplication::processEvents(); -#endif - - child1.setFocus(); - QTRY_VERIFY(child1.hasFocus()); - QCOMPARE(window.focusWidget(), &child1); - QCOMPARE(QApplication::focusWidget(), &child1); - - child2.setFocus(); - QVERIFY(child2.hasFocus()); - QCOMPARE(window.focusWidget(), &child2); - QCOMPARE(QApplication::focusWidget(), &child2); - } - - { - // window shown and active, children created, don't get focus, but get focus when shown - QWidget window; - - window.show(); -#ifdef Q_WS_X11 - QApplication::setActiveWindow(&window); - QTest::qWaitForWindowShown(&window); -#else - window.activateWindow(); -#endif - - QWidget child1(&window); - child1.setFocusPolicy(Qt::StrongFocus); - - QWidget child2(&window); - child2.setFocusPolicy(Qt::StrongFocus); - - child1.setFocus(); - QVERIFY(!child1.hasFocus()); - QCOMPARE(window.focusWidget(), static_cast<QWidget *>(0)); - QCOMPARE(QApplication::focusWidget(), static_cast<QWidget *>(0)); - - child1.show(); -#ifdef Q_WS_X11 - QApplication::setActiveWindow(&child1); - child1.activateWindow(); -#endif - QApplication::processEvents(); - QTRY_VERIFY(child1.hasFocus()); - QCOMPARE(window.focusWidget(), &child1); - QCOMPARE(QApplication::focusWidget(), &child1); - - child2.setFocus(); - QVERIFY(!child2.hasFocus()); - QCOMPARE(window.focusWidget(), &child1); - QCOMPARE(QApplication::focusWidget(), &child1); - - child2.show(); - QVERIFY(child2.hasFocus()); - QCOMPARE(window.focusWidget(), &child2); - QCOMPARE(QApplication::focusWidget(), &child2); - } - - { - // window shown and active, children created, don't get focus, - // even after setFocus(), hide(), then show() - QWidget window; - - window.show(); -#ifdef Q_WS_X11 - QApplication::setActiveWindow(&window); - QTest::qWaitForWindowShown(&window); -#else - window.activateWindow(); -#endif - - QWidget child1(&window); - child1.setFocusPolicy(Qt::StrongFocus); - - QWidget child2(&window); - child2.setFocusPolicy(Qt::StrongFocus); - - child1.setFocus(); - QVERIFY(!child1.hasFocus()); - QCOMPARE(window.focusWidget(), static_cast<QWidget *>(0)); - QCOMPARE(QApplication::focusWidget(), static_cast<QWidget *>(0)); - - child1.hide(); - QVERIFY(!child1.hasFocus()); - QCOMPARE(window.focusWidget(), static_cast<QWidget *>(0)); - QCOMPARE(QApplication::focusWidget(), static_cast<QWidget *>(0)); - - child1.show(); - QVERIFY(!child1.hasFocus()); - QCOMPARE(window.focusWidget(), static_cast<QWidget *>(0)); - QCOMPARE(QApplication::focusWidget(), static_cast<QWidget *>(0)); - - child2.setFocus(); - QVERIFY(!child2.hasFocus()); - QCOMPARE(window.focusWidget(), static_cast<QWidget *>(0)); - QCOMPARE(QApplication::focusWidget(), static_cast<QWidget *>(0)); - - child2.hide(); - QVERIFY(!child2.hasFocus()); - QCOMPARE(window.focusWidget(), static_cast<QWidget *>(0)); - QCOMPARE(QApplication::focusWidget(), static_cast<QWidget *>(0)); - - child2.show(); - QVERIFY(!child2.hasFocus()); - QCOMPARE(window.focusWidget(), static_cast<QWidget *>(0)); - QCOMPARE(QApplication::focusWidget(), static_cast<QWidget *>(0)); - } -} - -class EventSpy : public QObject -{ -public: - EventSpy(QWidget *widget, QEvent::Type event) - : m_widget(widget), eventToSpy(event), m_count(0) - { - if (m_widget) - m_widget->installEventFilter(this); - } - - QWidget *widget() const { return m_widget; } - int count() const { return m_count; } - void clear() { m_count = 0; } - -protected: - bool eventFilter(QObject *object, QEvent *event) - { - if (event->type() == eventToSpy) - ++m_count; - return QObject::eventFilter(object, event); - } - -private: - QWidget *m_widget; - QEvent::Type eventToSpy; - int m_count; -}; - -void tst_QWidget::setCursor() -{ -#ifndef QT_NO_CURSOR - { - QWidget window; - QWidget child(&window); - - QVERIFY(!window.testAttribute(Qt::WA_SetCursor)); - QVERIFY(!child.testAttribute(Qt::WA_SetCursor)); - - window.setCursor(window.cursor()); - QVERIFY(window.testAttribute(Qt::WA_SetCursor)); - QVERIFY(!child.testAttribute(Qt::WA_SetCursor)); - QCOMPARE(child.cursor().shape(), window.cursor().shape()); - } - - // do it again, but with window show()n - { - QWidget window; - QWidget child(&window); - window.show(); - - QVERIFY(!window.testAttribute(Qt::WA_SetCursor)); - QVERIFY(!child.testAttribute(Qt::WA_SetCursor)); - - window.setCursor(window.cursor()); - QVERIFY(window.testAttribute(Qt::WA_SetCursor)); - QVERIFY(!child.testAttribute(Qt::WA_SetCursor)); - QCOMPARE(child.cursor().shape(), window.cursor().shape()); - } - - - { - QWidget window; - QWidget child(&window); - - window.setCursor(Qt::WaitCursor); - QVERIFY(window.testAttribute(Qt::WA_SetCursor)); - QVERIFY(!child.testAttribute(Qt::WA_SetCursor)); - QCOMPARE(child.cursor().shape(), window.cursor().shape()); - } - - // same thing again, just with window show()n - { - QWidget window; - QWidget child(&window); - - window.show(); - window.setCursor(Qt::WaitCursor); - QVERIFY(window.testAttribute(Qt::WA_SetCursor)); - QVERIFY(!child.testAttribute(Qt::WA_SetCursor)); - QCOMPARE(child.cursor().shape(), window.cursor().shape()); - } - - // reparenting child should not cause the WA_SetCursor to become set - { - QWidget window; - QWidget window2; - QWidget child(&window); - - window.setCursor(Qt::WaitCursor); - - child.setParent(0); - QVERIFY(!child.testAttribute(Qt::WA_SetCursor)); - QCOMPARE(child.cursor().shape(), QCursor().shape()); - - child.setParent(&window2); - QVERIFY(!child.testAttribute(Qt::WA_SetCursor)); - QCOMPARE(child.cursor().shape(), window2.cursor().shape()); - - window2.setCursor(Qt::WaitCursor); - QVERIFY(!child.testAttribute(Qt::WA_SetCursor)); - QCOMPARE(child.cursor().shape(), window2.cursor().shape()); - } - - // again, with windows show()n - { - QWidget window; - QWidget window2; - QWidget child(&window); - - window.setCursor(Qt::WaitCursor); - window.show(); - - child.setParent(0); - QVERIFY(!child.testAttribute(Qt::WA_SetCursor)); - QCOMPARE(child.cursor().shape(), QCursor().shape()); - - child.setParent(&window2); - QVERIFY(!child.testAttribute(Qt::WA_SetCursor)); - QCOMPARE(child.cursor().shape(), window2.cursor().shape()); - - window2.show(); - window2.setCursor(Qt::WaitCursor); - QVERIFY(!child.testAttribute(Qt::WA_SetCursor)); - QCOMPARE(child.cursor().shape(), window2.cursor().shape()); - } - - // test if CursorChange is sent - { - QWidget widget; - EventSpy spy(&widget, QEvent::CursorChange); - QCOMPARE(spy.count(), 0); - widget.setCursor(QCursor(Qt::WaitCursor)); - QCOMPARE(spy.count(), 1); - widget.unsetCursor(); - QCOMPARE(spy.count(), 2); - } -#endif -} - -void tst_QWidget::setToolTip() -{ - QWidget widget; - EventSpy spy(&widget, QEvent::ToolTipChange); - QCOMPARE(spy.count(), 0); - - QCOMPARE(widget.toolTip(), QString()); - widget.setToolTip(QString("Hello")); - QCOMPARE(widget.toolTip(), QString("Hello")); - QCOMPARE(spy.count(), 1); - widget.setToolTip(QString()); - QCOMPARE(widget.toolTip(), QString()); - QCOMPARE(spy.count(), 2); - - // Mouse over doesn't work on Windows mobile, so skip the rest of the test for that platform. -#ifndef Q_OS_WINCE_WM - for (int pass = 0; pass < 2; ++pass) { - QWidget *popup = new QWidget(0, Qt::Popup); - popup->resize(150, 50); - QFrame *frame = new QFrame(popup); - frame->setGeometry(0, 0, 50, 50); - frame->setFrameStyle(QFrame::Box | QFrame::Plain); - EventSpy spy1(frame, QEvent::ToolTip); - EventSpy spy2(popup, QEvent::ToolTip); - frame->setMouseTracking(pass == 0 ? false : true); - frame->setToolTip(QLatin1String("TOOLTIP FRAME")); - popup->setToolTip(QLatin1String("TOOLTIP POPUP")); - popup->show(); - QTest::qWaitForWindowShown(popup); - QTest::qWait(10); - QTest::mouseMove(frame); - QTest::qWait(900); // delay is 700 - - QCOMPARE(spy1.count(), 1); - QCOMPARE(spy2.count(), 0); - if (pass == 0) - QTest::qWait(2200); // delay is 2000 - QTest::mouseMove(popup); - delete popup; - } -#endif -} - -void tst_QWidget::testWindowIconChangeEventPropagation() -{ - // Create widget hierarchy. - QWidget topLevelWidget; - QWidget topLevelChild(&topLevelWidget); - - QDialog dialog(&topLevelWidget); - QWidget dialogChild(&dialog); - - QWidgetList widgets; - widgets << &topLevelWidget << &topLevelChild - << &dialog << &dialogChild; - QCOMPARE(widgets.count(), 4); - - // Create spy lists. - QList <EventSpy *> applicationEventSpies; - QList <EventSpy *> widgetEventSpies; - foreach (QWidget *widget, widgets) { - applicationEventSpies.append(new EventSpy(widget, QEvent::ApplicationWindowIconChange)); - widgetEventSpies.append(new EventSpy(widget, QEvent::WindowIconChange)); - } - - // QApplication::setWindowIcon - const QIcon windowIcon = qApp->style()->standardIcon(QStyle::SP_TitleBarMenuButton); - qApp->setWindowIcon(windowIcon); - - for (int i = 0; i < widgets.count(); ++i) { - // Check QEvent::ApplicationWindowIconChange - EventSpy *spy = applicationEventSpies.at(i); - QWidget *widget = spy->widget(); - if (widget->isWindow()) { - QCOMPARE(spy->count(), 1); - QCOMPARE(widget->windowIcon(), windowIcon); - } else { - QCOMPARE(spy->count(), 0); - } - spy->clear(); - - // Check QEvent::WindowIconChange - spy = widgetEventSpies.at(i); - QCOMPARE(spy->count(), 1); - spy->clear(); - } - - // Set icon on a top-level widget. - topLevelWidget.setWindowIcon(*new QIcon); - - for (int i = 0; i < widgets.count(); ++i) { - // Check QEvent::ApplicationWindowIconChange - EventSpy *spy = applicationEventSpies.at(i); - QCOMPARE(spy->count(), 0); - spy->clear(); - - // Check QEvent::WindowIconChange - spy = widgetEventSpies.at(i); - QWidget *widget = spy->widget(); - if (widget == &topLevelWidget) { - QCOMPARE(widget->windowIcon(), QIcon()); - QCOMPARE(spy->count(), 1); - } else if (topLevelWidget.isAncestorOf(widget)) { - QCOMPARE(spy->count(), 1); - } else { - QCOMPARE(spy->count(), 0); - } - spy->clear(); - } - - // Cleanup. - for (int i = 0; i < widgets.count(); ++i) { - delete applicationEventSpies.at(i); - delete widgetEventSpies.at(i); - } - qApp->setWindowIcon(QIcon()); -} - -#ifdef Q_WS_X11 -void tst_QWidget::minAndMaxSizeWithX11BypassWindowManagerHint() -{ - // Same size as in QWidget::create_sys(). - const QSize desktopSize = QApplication::desktop()->size(); - const QSize originalSize(desktopSize.width() / 2, desktopSize.height() * 4 / 10); - - { // Maximum size. - QWidget widget(0, Qt::X11BypassWindowManagerHint); - - const QSize newMaximumSize = widget.size().boundedTo(originalSize) - QSize(10, 10); - widget.setMaximumSize(newMaximumSize); - QCOMPARE(widget.size(), newMaximumSize); - - widget.show(); - qt_x11_wait_for_window_manager(&widget); - QCOMPARE(widget.size(), newMaximumSize); - } - - { // Minimum size. - QWidget widget(0, Qt::X11BypassWindowManagerHint); - - const QSize newMinimumSize = widget.size().expandedTo(originalSize) + QSize(10, 10); - widget.setMinimumSize(newMinimumSize); - QCOMPARE(widget.size(), newMinimumSize); - - widget.show(); - qt_x11_wait_for_window_manager(&widget); - QCOMPARE(widget.size(), newMinimumSize); - } -} - -class ShowHideShowWidget : public QWidget -{ - Q_OBJECT - - int state; -public: - bool gotExpectedMapNotify; - - ShowHideShowWidget() - : state(0), gotExpectedMapNotify(false) - { - startTimer(1000); - } - - void timerEvent(QTimerEvent *) - { - switch (state++) { - case 0: - show(); - break; - case 1: - emit done(); - break; - } - } - - bool x11Event(XEvent *event) - { - if (state == 1 && event->type == MapNotify) - gotExpectedMapNotify = true; - return false; - } - -signals: - void done(); -}; - -void tst_QWidget::showHideShow() -{ - ShowHideShowWidget w; - w.show(); - w.hide(); - - QEventLoop eventLoop; - connect(&w, SIGNAL(done()), &eventLoop, SLOT(quit())); - eventLoop.exec(); - - QVERIFY(w.gotExpectedMapNotify); -} - -void tst_QWidget::clean_qt_x11_enforce_cursor() -{ - { - QWidget window; - QWidget *w = new QWidget(&window); - QWidget *child = new QWidget(w); - child->setAttribute(Qt::WA_SetCursor, true); - - window.show(); - QApplication::setActiveWindow(&window); - QTest::qWaitForWindowShown(&window); - QTest::qWait(100); - QCursor::setPos(window.geometry().center()); - QTest::qWait(100); - - child->setFocus(); - QApplication::processEvents(); - QTest::qWait(100); - - delete w; - } - - QGraphicsScene scene; - QLineEdit *edit = new QLineEdit; - scene.addWidget(edit); - - // If the test didn't crash, then it passed. -} -#endif - -class EventRecorder : public QObject -{ - Q_OBJECT - -public: - typedef QList<QPair<QWidget *, QEvent::Type> > EventList; - - EventRecorder(QObject *parent = 0) - : QObject(parent) - { } - - EventList eventList() - { - return events; - } - - void clear() - { - events.clear(); - } - - bool eventFilter(QObject *object, QEvent *event) - { - QWidget *widget = qobject_cast<QWidget *>(object); - if (widget && !event->spontaneous()) - events.append(qMakePair(widget, event->type())); - return false; - } - -private: - EventList events; -}; - -void tst_QWidget::compatibilityChildInsertedEvents() -{ - EventRecorder::EventList expected; - bool accessibilityEnabled = false; - - // Move away the cursor; otherwise it might result in an enter event if it's - // inside the widget when the widget is shown. - QCursor::setPos(qApp->desktop()->availableGeometry().bottomRight()); - QTest::qWait(100); - - { - // no children created, not shown - QWidget widget; - EventRecorder spy; - widget.installEventFilter(&spy); - - QCoreApplication::postEvent(&widget, new QEvent(QEvent::Type(QEvent::User + 1))); - - QCoreApplication::sendPostedEvents(); - - expected = - EventRecorder::EventList() - << qMakePair(&widget, QEvent::PolishRequest) - << qMakePair(&widget, QEvent::Polish) - << qMakePair(&widget, QEvent::Type(QEvent::User + 1)); - QCOMPARE(spy.eventList(), expected); - } - - { - // no children, shown - QWidget widget; - EventRecorder spy; - widget.installEventFilter(&spy); - - QCoreApplication::postEvent(&widget, new QEvent(QEvent::Type(QEvent::User + 1))); - - widget.show(); - expected = - EventRecorder::EventList() - << qMakePair(&widget, QEvent::WinIdChange) - << qMakePair(&widget, QEvent::Polish) - << qMakePair(&widget, QEvent::Move) - << qMakePair(&widget, QEvent::Resize) - << qMakePair(&widget, QEvent::Show); - - if (accessibilityEnabled) - expected << qMakePair(&widget, QEvent::AccessibilityPrepare); - expected << qMakePair(&widget, QEvent::ShowToParent); - QCOMPARE(spy.eventList(), expected); - spy.clear(); - - QCoreApplication::sendPostedEvents(); - expected = - EventRecorder::EventList() - << qMakePair(&widget, QEvent::PolishRequest) - << qMakePair(&widget, QEvent::Type(QEvent::User + 1)); - -#ifdef Q_OS_MAC - expected << qMakePair(&widget, QEvent::UpdateLater); -#endif - expected << qMakePair(&widget, QEvent::UpdateRequest); - - QCOMPARE(spy.eventList(), expected); - } - - { - // 2 children, not shown - QWidget widget; - EventRecorder spy; - widget.installEventFilter(&spy); - - QCoreApplication::postEvent(&widget, new QEvent(QEvent::Type(QEvent::User + 1))); - - QWidget child1(&widget); - QWidget child2; - child2.setParent(&widget); - - QCoreApplication::postEvent(&widget, new QEvent(QEvent::Type(QEvent::User + 2))); - - expected = - EventRecorder::EventList() - << qMakePair(&widget, QEvent::ChildAdded) - << qMakePair(&widget, QEvent::ChildAdded); - QCOMPARE(spy.eventList(), expected); - spy.clear(); - - QCoreApplication::sendPostedEvents(); - expected = - EventRecorder::EventList() - << qMakePair(&widget, QEvent::PolishRequest) - << qMakePair(&widget, QEvent::Polish) - << qMakePair(&widget, QEvent::ChildPolished) - << qMakePair(&widget, QEvent::ChildPolished) - << qMakePair(&widget, QEvent::Type(QEvent::User + 1)) - << qMakePair(&widget, QEvent::Type(QEvent::User + 2)); - QCOMPARE(spy.eventList(), expected); - } - - { - // 2 children, widget shown - QWidget widget; - EventRecorder spy; - widget.installEventFilter(&spy); - - QCoreApplication::postEvent(&widget, new QEvent(QEvent::Type(QEvent::User + 1))); - - QWidget child1(&widget); - QWidget child2; - child2.setParent(&widget); - - QCoreApplication::postEvent(&widget, new QEvent(QEvent::Type(QEvent::User + 2))); - - expected = - EventRecorder::EventList() - << qMakePair(&widget, QEvent::ChildAdded) - << qMakePair(&widget, QEvent::ChildAdded); - QCOMPARE(spy.eventList(), expected); - spy.clear(); - - widget.show(); - expected = - EventRecorder::EventList() - << qMakePair(&widget, QEvent::WinIdChange) - << qMakePair(&widget, QEvent::Polish) - << qMakePair(&widget, QEvent::ChildPolished) - << qMakePair(&widget, QEvent::ChildPolished) - << qMakePair(&widget, QEvent::Move) - << qMakePair(&widget, QEvent::Resize) - << qMakePair(&widget, QEvent::Show); - - if (accessibilityEnabled) - expected << qMakePair(&widget, QEvent::AccessibilityPrepare); - expected << qMakePair(&widget, QEvent::ShowToParent); - QCOMPARE(spy.eventList(), expected); - spy.clear(); - - QCoreApplication::sendPostedEvents(); - expected = - EventRecorder::EventList() - << qMakePair(&widget, QEvent::PolishRequest) - << qMakePair(&widget, QEvent::Type(QEvent::User + 1)) - << qMakePair(&widget, QEvent::Type(QEvent::User + 2)); - -#ifdef Q_OS_MAC - expected << qMakePair(&widget, QEvent::UpdateLater); -#endif - expected << qMakePair(&widget, QEvent::UpdateRequest); - - QCOMPARE(spy.eventList(), expected); - } - - { - // 2 children, but one is reparented away, not shown - QWidget widget; - EventRecorder spy; - widget.installEventFilter(&spy); - - QCoreApplication::postEvent(&widget, new QEvent(QEvent::Type(QEvent::User + 1))); - - QWidget child1(&widget); - QWidget child2; - child2.setParent(&widget); - child2.setParent(0); - - QCoreApplication::postEvent(&widget, new QEvent(QEvent::Type(QEvent::User + 2))); - - expected = - EventRecorder::EventList() - << qMakePair(&widget, QEvent::ChildAdded) - << qMakePair(&widget, QEvent::ChildAdded) - << qMakePair(&widget, QEvent::ChildRemoved); - QCOMPARE(spy.eventList(), expected); - spy.clear(); - - QCoreApplication::sendPostedEvents(); - expected = - EventRecorder::EventList() - << qMakePair(&widget, QEvent::PolishRequest) - << qMakePair(&widget, QEvent::Polish) - << qMakePair(&widget, QEvent::ChildPolished) - << qMakePair(&widget, QEvent::Type(QEvent::User + 1)) - << qMakePair(&widget, QEvent::Type(QEvent::User + 2)); - QCOMPARE(spy.eventList(), expected); - } - - { - // 2 children, but one is reparented away, then widget is shown - QWidget widget; - EventRecorder spy; - widget.installEventFilter(&spy); - - QCoreApplication::postEvent(&widget, new QEvent(QEvent::Type(QEvent::User + 1))); - - QWidget child1(&widget); - QWidget child2; - child2.setParent(&widget); - child2.setParent(0); - - QCoreApplication::postEvent(&widget, new QEvent(QEvent::Type(QEvent::User + 2))); - - expected = - EventRecorder::EventList() - << qMakePair(&widget, QEvent::ChildAdded) - << qMakePair(&widget, QEvent::ChildAdded) - << qMakePair(&widget, QEvent::ChildRemoved); - QCOMPARE(spy.eventList(), expected); - spy.clear(); - - widget.show(); - expected = - EventRecorder::EventList() - << qMakePair(&widget, QEvent::WinIdChange) - << qMakePair(&widget, QEvent::Polish) - << qMakePair(&widget, QEvent::ChildPolished) - << qMakePair(&widget, QEvent::Move) - << qMakePair(&widget, QEvent::Resize) - << qMakePair(&widget, QEvent::Show); - - if (accessibilityEnabled) - expected << qMakePair(&widget, QEvent::AccessibilityPrepare); - expected << qMakePair(&widget, QEvent::ShowToParent); - QCOMPARE(spy.eventList(), expected); - spy.clear(); - - QCoreApplication::sendPostedEvents(); - expected = - EventRecorder::EventList() - << qMakePair(&widget, QEvent::PolishRequest) - << qMakePair(&widget, QEvent::Type(QEvent::User + 1)) - << qMakePair(&widget, QEvent::Type(QEvent::User + 2)); - -#ifdef Q_OS_MAC - expected << qMakePair(&widget, QEvent::UpdateLater); -#endif - expected << qMakePair(&widget, QEvent::UpdateRequest); - - QCOMPARE(spy.eventList(), expected); - } -} - -class RenderWidget : public QWidget -{ -public: - RenderWidget(QWidget *source) - : source(source), ellipse(false) {} - - void setEllipseEnabled(bool enable = true) - { - ellipse = enable; - update(); - } - -protected: - void paintEvent(QPaintEvent *) - { - if (ellipse) { - QPainter painter(this); - painter.fillRect(rect(), Qt::red); - painter.end(); - QRegion regionToRender = QRegion(0, 0, source->width(), source->height() / 2, - QRegion::Ellipse); - source->render(this, QPoint(0, 30), regionToRender); - } else { - source->render(this); - } - } - -private: - QWidget *source; - bool ellipse; -}; - -void tst_QWidget::render() -{ - return; - QCalendarWidget source; - // disable anti-aliasing to eliminate potential differences when subpixel antialiasing - // is enabled on the screen - QFont f; - f.setStyleStrategy(QFont::NoAntialias); - source.setFont(f); - source.show(); - QTest::qWaitForWindowShown(&source); - - // Render the entire source into target. - RenderWidget target(&source); - target.resize(source.size()); - target.show(); - - qApp->processEvents(); - qApp->sendPostedEvents(); - QTest::qWait(250); - - QImage sourceImage = QPixmap::grabWidget(&source).toImage(); - qApp->processEvents(); - QImage targetImage = QPixmap::grabWidget(&target).toImage(); - qApp->processEvents(); - QCOMPARE(sourceImage, targetImage); - - // Fill target.rect() will Qt::red and render - // QRegion(0, 0, source->width(), source->height() / 2, QRegion::Ellipse) - // of source into target with offset (0, 30). - target.setEllipseEnabled(); - qApp->processEvents(); - qApp->sendPostedEvents(); - - targetImage = QPixmap::grabWidget(&target).toImage(); - QVERIFY(sourceImage != targetImage); - - QCOMPARE(targetImage.pixel(target.width() / 2, 29), QColor(Qt::red).rgb()); - QCOMPARE(targetImage.pixel(target.width() / 2, 30), sourceImage.pixel(source.width() / 2, 0)); - - // Test that a child widget properly fills its background - { - QWidget window; - window.resize(100, 100); - // prevent custom styles - window.setStyle(new QWindowsStyle); - window.show(); - QTest::qWaitForWindowShown(&window); - QWidget child(&window); - child.resize(window.size()); - child.show(); - - qApp->processEvents(); - QCOMPARE(QPixmap::grabWidget(&child), QPixmap::grabWidget(&window)); - } - - { // Check that the target offset is correct. - QWidget widget; - widget.resize(200, 200); - widget.setAutoFillBackground(true); - widget.setPalette(Qt::red); - // prevent custom styles - widget.setStyle(new QWindowsStyle); - widget.show(); - QTest::qWaitForWindowShown(&widget); - QImage image(widget.size(), QImage::Format_RGB32); - image.fill(QColor(Qt::blue).rgb()); - - // Target offset (0, 0) - widget.render(&image, QPoint(), QRect(20, 20, 100, 100)); - QCOMPARE(image.pixel(0, 0), QColor(Qt::red).rgb()); - QCOMPARE(image.pixel(99, 99), QColor(Qt::red).rgb()); - QCOMPARE(image.pixel(100, 100), QColor(Qt::blue).rgb()); - - // Target offset (20, 20). - image.fill(QColor(Qt::blue).rgb()); - widget.render(&image, QPoint(20, 20), QRect(20, 20, 100, 100)); - QCOMPARE(image.pixel(0, 0), QColor(Qt::blue).rgb()); - QCOMPARE(image.pixel(19, 19), QColor(Qt::blue).rgb()); - QCOMPARE(image.pixel(20, 20), QColor(Qt::red).rgb()); - QCOMPARE(image.pixel(119, 119), QColor(Qt::red).rgb()); - QCOMPARE(image.pixel(120, 120), QColor(Qt::blue).rgb()); - } -} - -// On Windows the active palette is used instead of the inactive palette even -// though the widget is invisible. This is probably related to task 178507/168682, -// but for the renderInvisible test it doesn't matter, we're mostly interested -// in testing the geometry so just workaround the palette issue for now. -static void workaroundPaletteIssue(QWidget *widget) -{ -#ifndef Q_WS_WIN - return; -#endif - if (!widget) - return; - - QWidget *navigationBar = qFindChild<QWidget *>(widget, QLatin1String("qt_calendar_navigationbar")); - QVERIFY(navigationBar); - - QPalette palette = navigationBar->palette(); - const QColor background = palette.color(QPalette::Inactive, navigationBar->backgroundRole()); - const QColor highlightedText = palette.color(QPalette::Inactive, QPalette::HighlightedText); - palette.setColor(QPalette::Active, navigationBar->backgroundRole(), background); - palette.setColor(QPalette::Active, QPalette::HighlightedText, highlightedText); - navigationBar->setPalette(palette); -} - -//#define RENDER_DEBUG -void tst_QWidget::renderInvisible() -{ - QCalendarWidget *calendar = new QCalendarWidget; - // disable anti-aliasing to eliminate potential differences when subpixel antialiasing - // is enabled on the screen - QFont f; - f.setStyleStrategy(QFont::NoAntialias); - calendar->setFont(f); - calendar->show(); - QTest::qWaitForWindowShown(calendar); - - // Create a dummy focus widget to get rid of focus rect in reference image. - QLineEdit dummyFocusWidget; - dummyFocusWidget.show(); - QTest::qWaitForWindowShown(&dummyFocusWidget); - qApp->processEvents(); - QTest::qWait(120); - - // Create normal reference image. - const QSize calendarSize = calendar->size(); - QImage referenceImage(calendarSize, QImage::Format_ARGB32); - calendar->render(&referenceImage); -#ifdef RENDER_DEBUG - referenceImage.save("referenceImage.png"); -#endif - QVERIFY(!referenceImage.isNull()); - - // Create resized reference image. - const QSize calendarSizeResized = calendar->size() + QSize(50, 50); - calendar->resize(calendarSizeResized); - qApp->processEvents(); - QTest::qWait(30); - QImage referenceImageResized(calendarSizeResized, QImage::Format_ARGB32); - calendar->render(&referenceImageResized); -#ifdef RENDER_DEBUG - referenceImageResized.save("referenceImageResized.png"); -#endif - QVERIFY(!referenceImageResized.isNull()); - - // Explicitly hide the calendar. - calendar->hide(); - qApp->processEvents(); - QTest::qWait(30); - workaroundPaletteIssue(calendar); - - { // Make sure we get the same image when the calendar is explicitly hidden. - QImage testImage(calendarSizeResized, QImage::Format_ARGB32); - calendar->render(&testImage); -#ifdef RENDER_DEBUG - testImage.save("explicitlyHiddenCalendarResized.png"); -#endif - QCOMPARE(testImage, referenceImageResized); - } - - // Now that we have reference images we can delete the source and re-create - // the calendar and check that we get the same images from a calendar which has never - // been visible, laid out or created (Qt::WA_WState_Created). - delete calendar; - calendar = new QCalendarWidget; - calendar->setFont(f); - workaroundPaletteIssue(calendar); - - { // Never been visible, created or laid out. - QImage testImage(calendarSize, QImage::Format_ARGB32); - calendar->render(&testImage); -#ifdef RENDER_DEBUG - testImage.save("neverBeenVisibleCreatedOrLaidOut.png"); -#endif - QCOMPARE(testImage, referenceImage); - } - - calendar->hide(); - qApp->processEvents(); - QTest::qWait(30); - - { // Calendar explicitly hidden. - QImage testImage(calendarSize, QImage::Format_ARGB32); - calendar->render(&testImage); -#ifdef RENDER_DEBUG - testImage.save("explicitlyHiddenCalendar.png"); -#endif - QCOMPARE(testImage, referenceImage); - } - - // Get navigation bar and explicitly hide it. - QWidget *navigationBar = qFindChild<QWidget *>(calendar, QLatin1String("qt_calendar_navigationbar")); - QVERIFY(navigationBar); - navigationBar->hide(); - - { // Check that the navigation bar isn't drawn when rendering the entire calendar. - QImage testImage(calendarSize, QImage::Format_ARGB32); - calendar->render(&testImage); -#ifdef RENDER_DEBUG - testImage.save("calendarWithoutNavigationBar.png"); -#endif - QVERIFY(testImage != referenceImage); - } - - { // Make sure the navigation bar renders correctly even though it's hidden. - QImage testImage(navigationBar->size(), QImage::Format_ARGB32); - navigationBar->render(&testImage); -#ifdef RENDER_DEBUG - testImage.save("explicitlyHiddenNavigationBar.png"); -#endif - QCOMPARE(testImage, referenceImage.copy(navigationBar->rect())); - } - - // Get next month button. - QWidget *nextMonthButton = qFindChild<QWidget *>(navigationBar, QLatin1String("qt_calendar_nextmonth")); - QVERIFY(nextMonthButton); - - { // Render next month button. - // Fill test image with correct background color. - QImage testImage(nextMonthButton->size(), QImage::Format_ARGB32); - navigationBar->render(&testImage, QPoint(), QRegion(), QWidget::RenderFlags()); -#ifdef RENDER_DEBUG - testImage.save("nextMonthButtonBackground.png"); -#endif - - // Set the button's background color to Qt::transparent; otherwise it will fill the - // background with QPalette::Window. - const QPalette originalPalette = nextMonthButton->palette(); - QPalette palette = originalPalette; - palette.setColor(QPalette::Window, Qt::transparent); - nextMonthButton->setPalette(palette); - - // Render the button on top of the background. - nextMonthButton->render(&testImage); -#ifdef RENDER_DEBUG - testImage.save("nextMonthButton.png"); -#endif - const QRect buttonRect(nextMonthButton->mapTo(calendar, QPoint()), nextMonthButton->size()); - QCOMPARE(testImage, referenceImage.copy(buttonRect)); - - // Restore palette. - nextMonthButton->setPalette(originalPalette); - } - - // Navigation bar isn't explicitly hidden anymore. - navigationBar->show(); - qApp->processEvents(); - QTest::qWait(30); - QVERIFY(!calendar->isVisible()); - - // Now, completely mess up the layout. This will trigger an update on the layout - // when the calendar is visible or shown, but it's not. QWidget::render must therefore - // make sure the layout is activated before rendering. - QVERIFY(!calendar->isVisible()); - calendar->resize(calendarSizeResized); - qApp->processEvents(); - - { // Make sure we get an image equal to the resized reference image. - QImage testImage(calendarSizeResized, QImage::Format_ARGB32); - calendar->render(&testImage); -#ifdef RENDER_DEBUG - testImage.save("calendarResized.png"); -#endif - QCOMPARE(testImage, referenceImageResized); - } - - { // Make sure we lay out the widget correctly the first time it's rendered. - QCalendarWidget calendar; - const QSize calendarSize = calendar.sizeHint(); - - QImage image(2 * calendarSize, QImage::Format_ARGB32); - image.fill(QColor(Qt::red).rgb()); - calendar.render(&image); - - for (int i = calendarSize.height(); i < 2 * calendarSize.height(); ++i) - for (int j = calendarSize.width(); j < 2 * calendarSize.width(); ++j) - QCOMPARE(image.pixel(j, i), QColor(Qt::red).rgb()); - } - - { // Ensure that we don't call adjustSize() on invisible top-levels if render() is called - // right after widgets have been added/removed to/from its layout. - QWidget topLevel; - topLevel.setLayout(new QVBoxLayout); - - QWidget *widget = new QLineEdit; - topLevel.layout()->addWidget(widget); - - const QSize initialSize = topLevel.size(); - QPixmap pixmap(topLevel.sizeHint()); - topLevel.render(&pixmap); // triggers adjustSize() - const QSize finalSize = topLevel.size(); - QVERIFY(finalSize != initialSize); - - topLevel.layout()->removeWidget(widget); - QCOMPARE(topLevel.size(), finalSize); - topLevel.render(&pixmap); - QCOMPARE(topLevel.size(), finalSize); - - topLevel.layout()->addWidget(widget); - QCOMPARE(topLevel.size(), finalSize); - topLevel.render(&pixmap); - QCOMPARE(topLevel.size(), finalSize); - } -} - -void tst_QWidget::renderWithPainter() -{ - QWidget widget; - // prevent custom styles - widget.setStyle(new QWindowsStyle); - widget.show(); - widget.resize(70, 50); - widget.setAutoFillBackground(true); - widget.setPalette(Qt::black); - - // Render the entire widget onto the image. - QImage image(QSize(70, 50), QImage::Format_ARGB32); - image.fill(QColor(Qt::red).rgb()); - QPainter painter(&image); - widget.render(&painter); - - for (int i = 0; i < image.height(); ++i) { - for (int j = 0; j < image.width(); ++j) - QCOMPARE(image.pixel(j, i), QColor(Qt::black).rgb()); - } - - // Translate painter (10, 10). - painter.save(); - image.fill(QColor(Qt::red).rgb()); - painter.translate(10, 10); - widget.render(&painter); - painter.restore(); - - for (int i = 0; i < image.height(); ++i) { - for (int j = 0; j < image.width(); ++j) { - if (i < 10 || j < 10) - QCOMPARE(image.pixel(j, i), QColor(Qt::red).rgb()); - else - QCOMPARE(image.pixel(j, i), QColor(Qt::black).rgb()); - } - } - - // Pass target offset (10, 10) (the same as QPainter::translate). - image.fill(QColor(Qt::red).rgb()); - widget.render(&painter, QPoint(10, 10)); - - for (int i = 0; i < image.height(); ++i) { - for (int j = 0; j < image.width(); ++j) { - if (i < 10 || j < 10) - QCOMPARE(image.pixel(j, i), QColor(Qt::red).rgb()); - else - QCOMPARE(image.pixel(j, i), QColor(Qt::black).rgb()); - } - } - - // Translate (10, 10) and pass target offset (10, 10). - painter.save(); - image.fill(QColor(Qt::red).rgb()); - painter.translate(10, 10); - widget.render(&painter, QPoint(10, 10)); - painter.restore(); - - for (int i = 0; i < image.height(); ++i) { - for (int j = 0; j < image.width(); ++j) { - if (i < 20 || j < 20) - QCOMPARE(image.pixel(j, i), QColor(Qt::red).rgb()); - else - QCOMPARE(image.pixel(j, i), QColor(Qt::black).rgb()); - } - } - - // Rotate painter 90 degrees. - painter.save(); - image.fill(QColor(Qt::red).rgb()); - painter.rotate(90); - widget.render(&painter); - painter.restore(); - - for (int i = 0; i < image.height(); ++i) { - for (int j = 0; j < image.width(); ++j) - QCOMPARE(image.pixel(j, i), QColor(Qt::red).rgb()); - } - - // Translate and rotate. - image.fill(QColor(Qt::red).rgb()); - widget.resize(40, 10); - painter.translate(10, 10); - painter.rotate(90); - widget.render(&painter); - - for (int i = 0; i < image.height(); ++i) { - for (int j = 0; j < image.width(); ++j) { - if (i >= 10 && j >= 0 && j < 10) - QCOMPARE(image.pixel(j, i), QColor(Qt::black).rgb()); - else - QCOMPARE(image.pixel(j, i), QColor(Qt::red).rgb()); - } - } - - // Make sure QWidget::render does not modify the render hints set on the painter. - painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform - | QPainter::NonCosmeticDefaultPen | QPainter::TextAntialiasing); - QPainter::RenderHints oldRenderHints = painter.renderHints(); - widget.render(&painter); - QCOMPARE(painter.renderHints(), oldRenderHints); -} - -void tst_QWidget::render_task188133() -{ - QMainWindow mainWindow; - - // Make sure QWidget::render does not trigger QWidget::repaint/update - // and asserts for Qt::WA_WState_Created. - QPixmap pixmap = QPixmap::grabWidget(&mainWindow); -} - -void tst_QWidget::render_task211796() -{ - class MyWidget : public QWidget - { - void resizeEvent(QResizeEvent *) - { - QPixmap pixmap(size()); - render(&pixmap); - } - }; - - { // Please don't die in a resize recursion. - MyWidget widget; - widget.resize(200, 200); - widget.show(); - } - - { // Same check with a deeper hierarchy. - QWidget widget; - widget.show(); - QWidget child(&widget); - MyWidget grandChild; - grandChild.setParent(&child); - grandChild.resize(100, 100); - child.show(); - } -} - -void tst_QWidget::render_task217815() -{ - // Make sure we don't change the size of the widget when calling - // render() and the widget has an explicit size set. - // This was a problem on Windows because we called createWinId(), - // which in turn enforced the size to be bigger than the smallest - // possible native window size (which is (115,something) on WinXP). - QWidget widget; - const QSize explicitSize(80, 20); - widget.resize(explicitSize); - QCOMPARE(widget.size(), explicitSize); - - QPixmap pixmap(explicitSize); - widget.render(&pixmap); - - QCOMPARE(widget.size(), explicitSize); -} - -// Window Opacity is not supported on Windows CE. -#ifndef Q_OS_WINCE -void tst_QWidget::render_windowOpacity() -{ - const qreal opacity = 0.5; - - { // Check that the painter opacity effects the widget drawing. - QWidget topLevel; - QWidget child(&topLevel); - child.resize(50, 50); - child.setPalette(Qt::red); - child.setAutoFillBackground(true); - - QPixmap expected(child.size()); -#ifdef Q_WS_X11 - if (expected.depth() < 24) { - QSKIP("This test won't give correct results with dithered pixmaps", SkipAll); - } -#endif - expected.fill(Qt::green); - QPainter painter(&expected); - painter.setOpacity(opacity); - painter.fillRect(QRect(QPoint(0, 0), child.size()), Qt::red); - painter.end(); - - QPixmap result(child.size()); - result.fill(Qt::green); - painter.begin(&result); - painter.setOpacity(opacity); - child.render(&painter); - painter.end(); - QCOMPARE(result, expected); - } - - { // Combine the opacity set on the painter with the widget opacity. - class MyWidget : public QWidget - { - public: - void paintEvent(QPaintEvent *) - { - QPainter painter(this); - painter.setOpacity(opacity); - QCOMPARE(painter.opacity(), opacity); - painter.fillRect(rect(), Qt::red); - } - qreal opacity; - }; - - MyWidget widget; - widget.resize(50, 50); - widget.opacity = opacity; - widget.setPalette(Qt::blue); - widget.setAutoFillBackground(true); - - QPixmap expected(widget.size()); - expected.fill(Qt::green); - QPainter painter(&expected); - painter.setOpacity(opacity); - QPixmap pixmap(widget.size()); - pixmap.fill(Qt::blue); - QPainter pixmapPainter(&pixmap); - pixmapPainter.setOpacity(opacity); - pixmapPainter.fillRect(QRect(QPoint(), widget.size()), Qt::red); - painter.drawPixmap(QPoint(), pixmap); - painter.end(); - - QPixmap result(widget.size()); - result.fill(Qt::green); - painter.begin(&result); - painter.setOpacity(opacity); - widget.render(&painter); - painter.end(); - QCOMPARE(result, expected); - } -} -#endif - -void tst_QWidget::render_systemClip() -{ - QWidget widget; - widget.setPalette(Qt::blue); - widget.resize(100, 100); - - QImage image(widget.size(), QImage::Format_RGB32); - image.fill(QColor(Qt::red).rgb()); - - QPaintEngine *paintEngine = image.paintEngine(); - QVERIFY(paintEngine); - paintEngine->setSystemClip(QRegion(0, 0, 50, 50)); - - QPainter painter(&image); - // Make sure we're using the same paint engine and has the right clip set. - QCOMPARE(painter.paintEngine(), paintEngine); - QCOMPARE(paintEngine->systemClip(), QRegion(0, 0, 50, 50)); - - // Translate painter outside system clip. - painter.translate(50, 0); - widget.render(&painter); - -#ifdef RENDER_DEBUG - image.save("outside_systemclip.png"); -#endif - - // All pixels should be red. - for (int i = 0; i < image.height(); ++i) { - for (int j = 0; j < image.width(); ++j) - QCOMPARE(image.pixel(j, i), QColor(Qt::red).rgb()); - } - - // Restore painter and refill image with red. - image.fill(QColor(Qt::red).rgb()); - painter.translate(-50, 0); - - // Set transform on the painter. - QTransform transform; - transform.shear(0, 1); - painter.setTransform(transform); - widget.render(&painter); - -#ifdef RENDER_DEBUG - image.save("blue_triangle.png"); -#endif - - // We should now have a blue triangle starting at scan line 1, and the rest should be red. - // rrrrrrrrrr - // brrrrrrrrr - // bbrrrrrrrr - // bbbrrrrrrr - // bbbbrrrrrr - // rrrrrrrrrr - // ... - -#ifndef Q_WS_MAC - for (int i = 0; i < image.height(); ++i) { - for (int j = 0; j < image.width(); ++j) { - if (i < 50 && j < i) - QCOMPARE(image.pixel(j, i), QColor(Qt::blue).rgb()); - else - QCOMPARE(image.pixel(j, i), QColor(Qt::red).rgb()); - } - } -#else - // We don't paint directly on the image on the Mac, so we cannot do the pixel comparison - // as above due to QPainter::SmoothPixmapTransform. We therefore need to generate an - // expected image by first painting on a pixmap, and then draw the pixmap onto - // the image using QPainter::SmoothPixmapTransform. Then we can compare pixels :) - // The check is basically the same, except that it takes the smoothening into account. - QPixmap pixmap(50, 50); - const QRegion sysClip(0, 0, 50, 50); - widget.render(&pixmap, QPoint(), sysClip); - - QImage expectedImage(widget.size(), QImage::Format_RGB32); - expectedImage.fill(QColor(Qt::red).rgb()); - expectedImage.paintEngine()->setSystemClip(sysClip); - - QPainter expectedImagePainter(&expectedImage); - expectedImagePainter.setTransform(QTransform().shear(0, 1)); - // NB! This is the important part (SmoothPixmapTransform). - expectedImagePainter.setRenderHints(QPainter::SmoothPixmapTransform); - expectedImagePainter.drawPixmap(QPoint(0, 0), pixmap); - expectedImagePainter.end(); - - QCOMPARE(image, expectedImage); -#endif -} - -void tst_QWidget::render_systemClip2_data() -{ - QTest::addColumn<bool>("autoFillBackground"); - QTest::addColumn<bool>("usePaintEvent"); - QTest::addColumn<QColor>("expectedColor"); - - QTest::newRow("Only auto-fill background") << true << false << QColor(Qt::blue); - QTest::newRow("Only draw in paintEvent") << false << true << QColor(Qt::green); - QTest::newRow("Auto-fill background and draw in paintEvent") << true << true << QColor(Qt::green); -} - -void tst_QWidget::render_systemClip2() -{ - QFETCH(bool, autoFillBackground); - QFETCH(bool, usePaintEvent); - QFETCH(QColor, expectedColor); - - QVERIFY2(expectedColor != QColor(Qt::red), "Qt::red is the reference color for the image, pick another color"); - - class MyWidget : public QWidget - { - public: - bool usePaintEvent; - void paintEvent(QPaintEvent *) - { - if (usePaintEvent) - QPainter(this).fillRect(rect(), Qt::green); - } - }; - - MyWidget widget; - widget.usePaintEvent = usePaintEvent; - widget.setPalette(Qt::blue); - // NB! widget.setAutoFillBackground(autoFillBackground) won't do the - // trick here since the widget is a top-level. The background is filled - // regardless, unless Qt::WA_OpaquePaintEvent or Qt::WA_NoSystemBackground - // is set. We therefore use the opaque attribute to turn off auto-fill. - if (!autoFillBackground) - widget.setAttribute(Qt::WA_OpaquePaintEvent); - widget.resize(100, 100); - - QImage image(widget.size(), QImage::Format_RGB32); - image.fill(QColor(Qt::red).rgb()); - - QPaintEngine *paintEngine = image.paintEngine(); - QVERIFY(paintEngine); - - QRegion systemClip(QRegion(50, 0, 50, 10)); - systemClip += QRegion(90, 10, 10, 40); - paintEngine->setSystemClip(systemClip); - - // Render entire widget directly onto device. - widget.render(&image); - -#ifdef RENDER_DEBUG - image.save("systemclip_with_device.png"); -#endif - // All pixels within the system clip should now be - // the expectedColor, and the rest should be red. - for (int i = 0; i < image.height(); ++i) { - for (int j = 0; j < image.width(); ++j) { - if (systemClip.contains(QPoint(j, i))) - QCOMPARE(image.pixel(j, i), expectedColor.rgb()); - else - QCOMPARE(image.pixel(j, i), QColor(Qt::red).rgb()); - } - } - - // Refill image with red. - image.fill(QColor(Qt::red).rgb()); - paintEngine->setSystemClip(systemClip); - - // Do the same with an untransformed painter. - QPainter painter(&image); - //Make sure we're using the same paint engine and has the right clip set. - QCOMPARE(painter.paintEngine(), paintEngine); - QCOMPARE(paintEngine->systemClip(), systemClip); - - widget.render(&painter); - -#ifdef RENDER_DEBUG - image.save("systemclip_with_untransformed_painter.png"); -#endif - // All pixels within the system clip should now be - // the expectedColor, and the rest should be red. - for (int i = 0; i < image.height(); ++i) { - for (int j = 0; j < image.width(); ++j) { - if (systemClip.contains(QPoint(j, i))) - QCOMPARE(image.pixel(j, i), expectedColor.rgb()); - else - QCOMPARE(image.pixel(j, i), QColor(Qt::red).rgb()); - } - } -} - -void tst_QWidget::render_systemClip3_data() -{ - QTest::addColumn<QSize>("size"); - QTest::addColumn<bool>("useSystemClip"); - - // Reference: http://en.wikipedia.org/wiki/Flag_of_Norway - QTest::newRow("Norwegian Civil Flag") << QSize(220, 160) << false; - QTest::newRow("Norwegian War Flag") << QSize(270, 160) << true; -} - -// This test ensures that the current engine clip (systemClip + painter clip) -// is preserved after QPainter::setClipRegion(..., Qt::ReplaceClip); -void tst_QWidget::render_systemClip3() -{ - QFETCH(QSize, size); - QFETCH(bool, useSystemClip); - - // Calculate the inner/outer cross of the flag. - QRegion outerCross(0, 0, size.width(), size.height()); - outerCross -= QRect(0, 0, 60, 60); - outerCross -= QRect(100, 0, size.width() - 100, 60); - outerCross -= QRect(0, 100, 60, 60); - outerCross -= QRect(100, 100, size.width() - 100, 60); - - QRegion innerCross(0, 0, size.width(), size.height()); - innerCross -= QRect(0, 0, 70, 70); - innerCross -= QRect(90, 0, size.width() - 90, 70); - innerCross -= QRect(0, 90, 70, 70); - innerCross -= QRect(90, 90, size.width() - 90, 70); - - const QRegion redArea(QRegion(0, 0, size.width(), size.height()) - outerCross); - const QRegion whiteArea(outerCross - innerCross); - const QRegion blueArea(innerCross); - QRegion systemClip; - - // Okay, here's the image that should look like a Norwegian civil/war flag in the end. - QImage flag(size, QImage::Format_ARGB32); - flag.fill(QColor(Qt::transparent).rgba()); - - if (useSystemClip) { - QPainterPath warClip(QPoint(size.width(), 0)); - warClip.lineTo(size.width() - 110, 60); - warClip.lineTo(size.width(), 80); - warClip.lineTo(size.width() - 110, 100); - warClip.lineTo(size.width(), 160); - warClip.closeSubpath(); - systemClip = QRegion(0, 0, size.width(), size.height()) - QRegion(warClip.toFillPolygon().toPolygon()); - flag.paintEngine()->setSystemClip(systemClip); - } - - QPainter painter(&flag); - painter.fillRect(QRect(QPoint(), size), Qt::red); // Fill image background with red. - painter.setClipRegion(outerCross); // Limit widget painting to inside the outer cross. - - // Here's the widget that's supposed to draw the inner/outer cross of the flag. - // The outer cross (white) should be drawn when the background is auto-filled, and - // the inner cross (blue) should be drawn in the paintEvent. - class MyWidget : public QWidget - { public: - void paintEvent(QPaintEvent *) - { - QPainter painter(this); - // Be evil and try to paint outside the outer cross. This should not be - // possible since the shared painter is clipped to the outer cross. - painter.setClipRect(0, 0, 60, 60, Qt::ReplaceClip); - painter.fillRect(rect(), Qt::green); - painter.setClipRegion(clip, Qt::ReplaceClip); - painter.fillRect(rect(), Qt::blue); - } - QRegion clip; - }; - - MyWidget widget; - widget.clip = innerCross; - widget.setFixedSize(size); - widget.setPalette(Qt::white); - widget.setAutoFillBackground(true); - widget.render(&painter); - -#ifdef RENDER_DEBUG - flag.save("flag.png"); -#endif - - // Let's make sure we got a Norwegian flag. - for (int i = 0; i < flag.height(); ++i) { - for (int j = 0; j < flag.width(); ++j) { - const QPoint pixel(j, i); - const QRgb pixelValue = flag.pixel(pixel); - if (useSystemClip && !systemClip.contains(pixel)) - QCOMPARE(pixelValue, QColor(Qt::transparent).rgba()); - else if (redArea.contains(pixel)) - QCOMPARE(pixelValue, QColor(Qt::red).rgba()); - else if (whiteArea.contains(pixel)) - QCOMPARE(pixelValue, QColor(Qt::white).rgba()); - else - QCOMPARE(pixelValue, QColor(Qt::blue).rgba()); - } - } -} - -void tst_QWidget::render_task252837() -{ - QWidget widget; - widget.resize(200, 200); - - QPixmap pixmap(widget.size()); - QPainter painter(&pixmap); - // Please do not crash. - widget.render(&painter); -} - -void tst_QWidget::render_worldTransform() -{ - class MyWidget : public QWidget - { public: - void paintEvent(QPaintEvent *) - { - QPainter painter(this); - // Make sure world transform is identity. - QCOMPARE(painter.worldTransform(), QTransform()); - - // Make sure device transform is correct. - const QPoint widgetOffset = geometry().topLeft(); - QTransform expectedDeviceTransform = QTransform::fromTranslate(105, 5); - expectedDeviceTransform.rotate(90); - expectedDeviceTransform.translate(widgetOffset.x(), widgetOffset.y()); - QCOMPARE(painter.deviceTransform(), expectedDeviceTransform); - - // Set new world transform. - QTransform newWorldTransform = QTransform::fromTranslate(10, 10); - newWorldTransform.rotate(90); - painter.setWorldTransform(newWorldTransform); - QCOMPARE(painter.worldTransform(), newWorldTransform); - - // Again, check device transform. - expectedDeviceTransform.translate(10, 10); - expectedDeviceTransform.rotate(90); - QCOMPARE(painter.deviceTransform(), expectedDeviceTransform); - - painter.fillRect(QRect(0, 0, 20, 10), Qt::green); - } - }; - - MyWidget widget; - widget.setFixedSize(100, 100); - widget.setPalette(Qt::red); - widget.setAutoFillBackground(true); - - MyWidget child; - child.setParent(&widget); - child.move(50, 50); - child.setFixedSize(50, 50); - child.setPalette(Qt::blue); - child.setAutoFillBackground(true); - - QImage image(QSize(110, 110), QImage::Format_RGB32); - image.fill(QColor(Qt::black).rgb()); - - QPainter painter(&image); - painter.translate(105, 5); - painter.rotate(90); - - const QTransform worldTransform = painter.worldTransform(); - const QTransform deviceTransform = painter.deviceTransform(); - - // Render widgets onto image. - widget.render(&painter); -#ifdef RENDER_DEBUG - image.save("render_worldTransform_image.png"); -#endif - - // Ensure the transforms are unchanged after render. - QCOMPARE(painter.worldTransform(), painter.worldTransform()); - QCOMPARE(painter.deviceTransform(), painter.deviceTransform()); - painter.end(); - - // Paint expected image. - QImage expected(QSize(110, 110), QImage::Format_RGB32); - expected.fill(QColor(Qt::black).rgb()); - - QPainter expectedPainter(&expected); - expectedPainter.translate(105, 5); - expectedPainter.rotate(90); - expectedPainter.save(); - expectedPainter.fillRect(widget.rect(),Qt::red); - expectedPainter.translate(10, 10); - expectedPainter.rotate(90); - expectedPainter.fillRect(QRect(0, 0, 20, 10), Qt::green); - expectedPainter.restore(); - expectedPainter.translate(50, 50); - expectedPainter.fillRect(child.rect(),Qt::blue); - expectedPainter.translate(10, 10); - expectedPainter.rotate(90); - expectedPainter.fillRect(QRect(0, 0, 20, 10), Qt::green); - expectedPainter.end(); - -#ifdef RENDER_DEBUG - expected.save("render_worldTransform_expected.png"); -#endif - - QCOMPARE(image, expected); -} - -void tst_QWidget::setContentsMargins() -{ - QLabel label("why does it always rain on me?"); - QSize oldSize = label.sizeHint(); - label.setFrameStyle(QFrame::Sunken | QFrame::Box); - QSize newSize = label.sizeHint(); - QVERIFY(oldSize != newSize); - - QLabel label2("why does it always rain on me?"); - label2.show(); - label2.setFrameStyle(QFrame::Sunken | QFrame::Box); - QCOMPARE(newSize, label2.sizeHint()); - - QLabel label3("why does it always rain on me?"); - label3.setFrameStyle(QFrame::Sunken | QFrame::Box); - QCOMPARE(newSize, label3.sizeHint()); -} - -// 4DWM issues on IRIX makes this test fail. -#ifndef Q_OS_IRIX -void tst_QWidget::moveWindowInShowEvent_data() -{ - QTest::addColumn<QPoint>("initial"); - QTest::addColumn<QPoint>("position"); - - QPoint p = QApplication::desktop()->availableGeometry().topLeft(); - - QTest::newRow("1") << p << (p + QPoint(10, 10)); - QTest::newRow("2") << (p + QPoint(10,10)) << p; -} - -void tst_QWidget::moveWindowInShowEvent() -{ - QFETCH(QPoint, initial); - QFETCH(QPoint, position); - - class MoveWindowInShowEventWidget : public QWidget - { - public: - QPoint position; - void showEvent(QShowEvent *) - { - move(position); - } - }; - - MoveWindowInShowEventWidget widget; - widget.resize(QSize(qApp->desktop()->availableGeometry().size() / 3).expandedTo(QSize(1, 1))); - // move to this position in showEvent() - widget.position = position; - - // put the widget in it's starting position - widget.move(initial); - QCOMPARE(widget.pos(), initial); - - // show it - widget.show(); - #ifdef Q_WS_X11 - qt_x11_wait_for_window_manager(&widget); - #endif - QTest::qWait(100); - // it should have moved - QCOMPARE(widget.pos(), position); -} -#endif - -void tst_QWidget::repaintWhenChildDeleted() -{ -#ifdef Q_WS_WIN - if (QSysInfo::WindowsVersion & QSysInfo::WV_VISTA) { - QTest::qWait(1000); - } -#endif - ColorWidget w(0, Qt::red); -#if !defined(Q_OS_WINCE) - QPoint startPoint = QApplication::desktop()->availableGeometry(&w).topLeft(); - startPoint.rx() += 50; - startPoint.ry() += 50; - w.setGeometry(QRect(startPoint, QSize(100, 100))); -#else - w.setGeometry(60, 60, 110, 110); -#endif - w.show(); - QTest::qWaitForWindowShown(&w); - QTest::qWait(10); - QTRY_COMPARE(w.r, QRegion(w.rect())); - w.r = QRegion(); - - { - const QPoint tlwOffset = w.geometry().topLeft(); - ColorWidget child(&w, Qt::blue); - child.setGeometry(10, 10, 10, 10); - child.show(); - QTest::qWait(10); - QTRY_COMPARE(child.r, QRegion(child.rect())); - w.r = QRegion(); - } - - QTest::qWait(10); - QTRY_COMPARE(w.r, QRegion(10, 10, 10, 10)); -} - -// task 175114 -void tst_QWidget::hideOpaqueChildWhileHidden() -{ - ColorWidget w(0, Qt::red); -#if !defined(Q_OS_WINCE) - QPoint startPoint = QApplication::desktop()->availableGeometry(&w).topLeft(); - startPoint.rx() += 50; - startPoint.ry() += 50; - w.setGeometry(QRect(startPoint, QSize(100, 100))); -#else - w.setGeometry(60, 60, 110, 110); -#endif - - ColorWidget child(&w, Qt::blue); - child.setGeometry(10, 10, 80, 80); - - ColorWidget child2(&child, Qt::white); - child2.setGeometry(10, 10, 60, 60); - - w.show(); - QTest::qWaitForWindowShown(&w); - QTest::qWait(10); - QTRY_COMPARE(child2.r, QRegion(child2.rect())); - child.r = QRegion(); - child2.r = QRegion(); - w.r = QRegion(); - - child.hide(); - child2.hide(); - QTest::qWait(100); - - QCOMPARE(w.r, QRegion(child.geometry())); - - child.show(); - QTest::qWait(100); - QCOMPARE(child.r, QRegion(child.rect())); - QCOMPARE(child2.r, QRegion()); -} - -// This test doesn't make sense without support for showMinimized(). -#if !defined(Q_OS_WINCE) && !defined(Q_WS_QWS) -void tst_QWidget::updateWhileMinimized() -{ - UpdateWidget widget; - // Filter out activation change and focus events to avoid update() calls in QWidget. - widget.updateOnActivationChangeAndFocusIn = false; - widget.reset(); - widget.show(); - QTest::qWaitForWindowShown(&widget); - QApplication::processEvents(); - QTRY_VERIFY(widget.numPaintEvents > 0); - QTest::qWait(150); - - // Minimize window. - widget.showMinimized(); - QTest::qWait(110); - - widget.reset(); - - // The widget is not visible on the screen (but isVisible() still returns true). - // Make sure update requests are discarded until the widget is shown again. - widget.update(0, 0, 50, 50); - QTest::qWait(10); - QCOMPARE(widget.numPaintEvents, 0); - - // Restore window. - widget.showNormal(); - QTest::qWait(30); - QTRY_COMPARE(widget.numPaintEvents, 1); - QCOMPARE(widget.paintedRegion, QRegion(0, 0, 50, 50)); -} -#endif - -#if defined(Q_WS_WIN) || defined(Q_WS_X11) -class PaintOnScreenWidget: public QWidget -{ -public: - PaintOnScreenWidget(QWidget *parent = 0, Qt::WindowFlags f = 0) - :QWidget(parent, f) - { - } -#if defined(Q_WS_WIN) - // This is the only way to enable PaintOnScreen on Windows. - QPaintEngine * paintEngine () const {return 0;} -#endif -}; - -void tst_QWidget::alienWidgets() -{ - qApp->setAttribute(Qt::AA_DontCreateNativeWidgetSiblings); - QWidget parent; - QWidget child(&parent); - QWidget grandChild(&child); - QWidget greatGrandChild(&grandChild); - parent.show(); - -#ifdef Q_WS_X11 - qt_x11_wait_for_window_manager(&parent); -#endif - - // Verify that the WA_WState_Created attribute is set - // and the top-level is the only native window. - QVERIFY(parent.testAttribute(Qt::WA_WState_Created)); - QVERIFY(parent.internalWinId()); - - QVERIFY(child.testAttribute(Qt::WA_WState_Created)); - QVERIFY(!child.internalWinId()); - - QVERIFY(grandChild.testAttribute(Qt::WA_WState_Created)); - QVERIFY(!grandChild.internalWinId()); - - QVERIFY(greatGrandChild.testAttribute(Qt::WA_WState_Created)); - QVERIFY(!greatGrandChild.internalWinId()); - - // Enforce native windows all the way up in the parent hierarchy - // if not WA_DontCreateNativeAncestors is set. - grandChild.setAttribute(Qt::WA_DontCreateNativeAncestors); - greatGrandChild.setAttribute(Qt::WA_NativeWindow); - QVERIFY(greatGrandChild.internalWinId()); - QVERIFY(grandChild.internalWinId()); - QVERIFY(!child.internalWinId()); - - { - // Ensure that hide() on an ancestor of a widget with - // Qt::WA_DontCreateNativeAncestors still gets unmapped - QWidget window; - QWidget widget(&window); - QWidget child(&widget); - child.setAttribute(Qt::WA_NativeWindow); - child.setAttribute(Qt::WA_DontCreateNativeAncestors); - window.show(); - QVERIFY(child.testAttribute(Qt::WA_Mapped)); - widget.hide(); - QVERIFY(!child.testAttribute(Qt::WA_Mapped)); - } - - // Enforce a native window when calling QWidget::winId. - QVERIFY(child.winId()); - QVERIFY(child.internalWinId()); - - // Check that paint on screen widgets (incl. children) are native. - PaintOnScreenWidget paintOnScreen(&parent); - QWidget paintOnScreenChild(&paintOnScreen); - paintOnScreen.show(); - QVERIFY(paintOnScreen.testAttribute(Qt::WA_WState_Created)); - QVERIFY(!paintOnScreen.testAttribute(Qt::WA_NativeWindow)); - QVERIFY(!paintOnScreen.internalWinId()); - QVERIFY(!paintOnScreenChild.testAttribute(Qt::WA_NativeWindow)); - QVERIFY(!paintOnScreenChild.internalWinId()); - - paintOnScreen.setAttribute(Qt::WA_PaintOnScreen); - QVERIFY(paintOnScreen.testAttribute(Qt::WA_NativeWindow)); - QVERIFY(paintOnScreen.internalWinId()); - QVERIFY(paintOnScreenChild.testAttribute(Qt::WA_NativeWindow)); - QVERIFY(paintOnScreenChild.internalWinId()); - - // Check that widgets with the Qt::MSWindowsOwnDC attribute set - // are native. - QWidget msWindowsOwnDC(&parent, Qt::MSWindowsOwnDC); - msWindowsOwnDC.show(); - QVERIFY(msWindowsOwnDC.testAttribute(Qt::WA_WState_Created)); - QVERIFY(msWindowsOwnDC.testAttribute(Qt::WA_NativeWindow)); - QVERIFY(msWindowsOwnDC.internalWinId()); - - { // Enforce a native window when calling QWidget::handle() (on X11) or QWidget::getDC() (on Windows). - QWidget widget(&parent); - widget.show(); - QVERIFY(widget.testAttribute(Qt::WA_WState_Created)); - QVERIFY(!widget.internalWinId()); -#ifdef Q_WS_X11 - widget.handle(); -#else - widget.getDC(); -#endif - QVERIFY(widget.internalWinId()); - } - -#ifdef Q_WS_X11 -#ifndef QT_NO_XRENDER - { // Enforce a native window when calling QWidget::x11PictureHandle(). - QWidget widget(&parent); - widget.show(); - QVERIFY(widget.testAttribute(Qt::WA_WState_Created)); - QVERIFY(!widget.internalWinId()); - widget.x11PictureHandle(); - QVERIFY(widget.internalWinId()); - } -#endif - - { // Make sure we don't create native windows when setting Qt::WA_X11NetWmWindowType attributes - // on alien widgets (see task 194231). - QWidget dummy; - QVERIFY(dummy.winId()); - QWidget widget(&dummy); - widget.setAttribute(Qt::WA_X11NetWmWindowTypeToolBar); - QVERIFY(!widget.internalWinId()); - } -#endif - - - { // Make sure we create native ancestors when setting Qt::WA_PaintOnScreen before show(). - QWidget topLevel; - QWidget child(&topLevel); - QWidget grandChild(&child); - PaintOnScreenWidget greatGrandChild(&grandChild); - - greatGrandChild.setAttribute(Qt::WA_PaintOnScreen); - QVERIFY(!child.internalWinId()); - QVERIFY(!grandChild.internalWinId()); - QVERIFY(!greatGrandChild.internalWinId()); - - topLevel.show(); - QVERIFY(child.internalWinId()); - QVERIFY(grandChild.internalWinId()); - QVERIFY(greatGrandChild.internalWinId()); - } - - { // Ensure that widgets reparented into Qt::WA_PaintOnScreen widgets become native. - QWidget topLevel; - QWidget *widget = new PaintOnScreenWidget(&topLevel); - widget->setAttribute(Qt::WA_PaintOnScreen); - QWidget *child = new QWidget; - QWidget *dummy = new QWidget(child); - QWidget *grandChild = new QWidget(child); - QWidget *dummy2 = new QWidget(grandChild); - - child->setParent(widget); - - QVERIFY(!topLevel.internalWinId()); - QVERIFY(!child->internalWinId()); - QVERIFY(!dummy->internalWinId()); - QVERIFY(!grandChild->internalWinId()); - QVERIFY(!dummy2->internalWinId()); - - topLevel.show(); - QVERIFY(topLevel.internalWinId()); - QVERIFY(widget->testAttribute(Qt::WA_NativeWindow)); - QVERIFY(child->internalWinId()); - QVERIFY(child->testAttribute(Qt::WA_NativeWindow)); - QVERIFY(!child->testAttribute(Qt::WA_PaintOnScreen)); - QVERIFY(!dummy->internalWinId()); - QVERIFY(!dummy->testAttribute(Qt::WA_NativeWindow)); - QVERIFY(!grandChild->internalWinId()); - QVERIFY(!grandChild->testAttribute(Qt::WA_NativeWindow)); - QVERIFY(!dummy2->internalWinId()); - QVERIFY(!dummy2->testAttribute(Qt::WA_NativeWindow)); - } - - { // Ensure that ancestors of a Qt::WA_PaintOnScreen widget stay native - // if they are re-created (typically in QWidgetPrivate::setParent_sys) (task 210822). - QWidget window; - QWidget child(&window); - - QWidget grandChild; - grandChild.setWindowTitle("This causes the widget to be created"); - - PaintOnScreenWidget paintOnScreenWidget; - paintOnScreenWidget.setAttribute(Qt::WA_PaintOnScreen); - paintOnScreenWidget.setParent(&grandChild); - - grandChild.setParent(&child); - - window.show(); - - QVERIFY(window.internalWinId()); - QVERIFY(child.internalWinId()); - QVERIFY(child.testAttribute(Qt::WA_NativeWindow)); - QVERIFY(grandChild.internalWinId()); - QVERIFY(grandChild.testAttribute(Qt::WA_NativeWindow)); - QVERIFY(paintOnScreenWidget.internalWinId()); - QVERIFY(paintOnScreenWidget.testAttribute(Qt::WA_NativeWindow)); - } - - { // Ensure that all siblings are native unless Qt::AA_DontCreateNativeWidgetSiblings is set. - qApp->setAttribute(Qt::AA_DontCreateNativeWidgetSiblings, false); - QWidget mainWindow; - QWidget *toolBar = new QWidget(&mainWindow); - QWidget *dockWidget = new QWidget(&mainWindow); - QWidget *centralWidget = new QWidget(&mainWindow); - - QWidget *button = new QWidget(centralWidget); - QWidget *mdiArea = new QWidget(centralWidget); - - QWidget *horizontalScroll = new QWidget(mdiArea); - QWidget *verticalScroll = new QWidget(mdiArea); - QWidget *viewport = new QWidget(mdiArea); - - viewport->setAttribute(Qt::WA_NativeWindow); - mainWindow.show(); - - // Ensure that the viewport and its siblings are native: - QVERIFY(verticalScroll->testAttribute(Qt::WA_NativeWindow)); - QVERIFY(verticalScroll->testAttribute(Qt::WA_NativeWindow)); - QVERIFY(horizontalScroll->testAttribute(Qt::WA_NativeWindow)); - - // Ensure that the mdi area and its siblings are native: - QVERIFY(mdiArea->testAttribute(Qt::WA_NativeWindow)); - QVERIFY(button->testAttribute(Qt::WA_NativeWindow)); - - // Ensure that the central widget and its siblings are native: - QVERIFY(centralWidget->testAttribute(Qt::WA_NativeWindow)); - QVERIFY(dockWidget->testAttribute(Qt::WA_NativeWindow)); - QVERIFY(toolBar->testAttribute(Qt::WA_NativeWindow)); - } -} -#endif // Q_WS_WIN / Q_WS_X11 - -class ASWidget : public QWidget -{ -public: - ASWidget(QSize sizeHint, QSizePolicy sizePolicy, bool layout, bool hfwLayout, QWidget *parent = 0) - : QWidget(parent), mySizeHint(sizeHint) - { - setSizePolicy(sizePolicy); - if (layout) { - QSizePolicy sp = QSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); - sp.setHeightForWidth(hfwLayout); - - QVBoxLayout *vbox = new QVBoxLayout; - vbox->setMargin(0); - vbox->addWidget(new ASWidget(sizeHint + QSize(30, 20), sp, false, false)); - setLayout(vbox); - } - } - - QSize sizeHint() const { - if (layout()) - return layout()->totalSizeHint(); - return mySizeHint; - } - int heightForWidth(int width) const { - if (sizePolicy().hasHeightForWidth()) { - return width * 2; - } else { - return -1; - } - } - - QSize mySizeHint; -}; - -void tst_QWidget::adjustSize_data() -{ - const int MagicW = 200; - const int MagicH = 100; - - QTest::addColumn<QSize>("sizeHint"); - QTest::addColumn<int>("hPolicy"); - QTest::addColumn<int>("vPolicy"); - QTest::addColumn<bool>("hfwSP"); - QTest::addColumn<bool>("layout"); - QTest::addColumn<bool>("hfwLayout"); - QTest::addColumn<bool>("haveParent"); - QTest::addColumn<QSize>("expectedSize"); - - QTest::newRow("1") << QSize(5, 6) << int(QSizePolicy::Minimum) << int(QSizePolicy::Expanding) - << false << false << false << false << QSize(5, qMax(6, MagicH)); - QTest::newRow("2") << QSize(5, 6) << int(QSizePolicy::Minimum) << int(QSizePolicy::Expanding) - << true << false << false << false << QSize(5, qMax(10, MagicH)); - QTest::newRow("3") << QSize(5, 6) << int(QSizePolicy::Minimum) << int(QSizePolicy::Expanding) - << false << true << false << false << QSize(35, 26); - QTest::newRow("4") << QSize(5, 6) << int(QSizePolicy::Minimum) << int(QSizePolicy::Expanding) - << false << true << true << false << QSize(35, 70); - QTest::newRow("5") << QSize(40001, 30001) << int(QSizePolicy::Minimum) << int(QSizePolicy::Expanding) - << false << false << false << false << QSize(100000, 100000); - QTest::newRow("6") << QSize(40001, 30001) << int(QSizePolicy::Minimum) << int(QSizePolicy::Expanding) - << true << false << false << false << QSize(100000, 100000); - QTest::newRow("7") << QSize(40001, 30001) << int(QSizePolicy::Minimum) << int(QSizePolicy::Expanding) - << false << true << false << false << QSize(100000, 100000); - QTest::newRow("8") << QSize(40001, 30001) << int(QSizePolicy::Minimum) << int(QSizePolicy::Expanding) - << false << true << true << false << QSize(100000, 100000); - QTest::newRow("9") << QSize(5, 6) << int(QSizePolicy::Expanding) << int(QSizePolicy::Minimum) - << true << false << false << false << QSize(qMax(5, MagicW), 10); - - QTest::newRow("1c") << QSize(5, 6) << int(QSizePolicy::Minimum) << int(QSizePolicy::Expanding) - << false << false << false << true << QSize(5, 6); - QTest::newRow("2c") << QSize(5, 6) << int(QSizePolicy::Minimum) << int(QSizePolicy::Expanding) - << true << false << false << true << QSize(5, 6 /* or 10 would be OK too, since hfw contradicts sizeHint() */); - QTest::newRow("3c") << QSize(5, 6) << int(QSizePolicy::Minimum) << int(QSizePolicy::Expanding) - << false << true << false << true << QSize(35, 26); - QTest::newRow("4c") << QSize(5, 6) << int(QSizePolicy::Minimum) << int(QSizePolicy::Expanding) - << false << true << true << true << QSize(35, 70); - QTest::newRow("5c") << QSize(40001, 30001) << int(QSizePolicy::Minimum) << int(QSizePolicy::Expanding) - << false << false << false << true << QSize(40001, 30001); - QTest::newRow("6c") << QSize(40001, 30001) << int(QSizePolicy::Minimum) << int(QSizePolicy::Expanding) - << true << false << false << true << QSize(40001, 30001 /* or 80002 would be OK too, since hfw contradicts sizeHint() */); - QTest::newRow("7c") << QSize(40001, 30001) << int(QSizePolicy::Minimum) << int(QSizePolicy::Expanding) - << false << true << false << true << QSize(40001 + 30, 30001 + 20); - QTest::newRow("8c") << QSize(40001, 30001) << int(QSizePolicy::Minimum) << int(QSizePolicy::Expanding) - << false << true << true << true << QSize(40001 + 30, 80002 + 60); - QTest::newRow("9c") << QSize(5, 6) << int(QSizePolicy::Expanding) << int(QSizePolicy::Minimum) - << true << false << false << true << QSize(5, 6); -} - -void tst_QWidget::adjustSize() -{ - QFETCH(QSize, sizeHint); - QFETCH(int, hPolicy); - QFETCH(int, vPolicy); - QFETCH(bool, hfwSP); - QFETCH(bool, layout); - QFETCH(bool, hfwLayout); - QFETCH(bool, haveParent); - QFETCH(QSize, expectedSize); - - QWidget *parent = new QWidget; - - QSizePolicy sp = QSizePolicy(QSizePolicy::Policy(hPolicy), QSizePolicy::Policy(vPolicy)); - sp.setHeightForWidth(hfwSP); - - QWidget *child = new ASWidget(sizeHint, sp, layout, hfwLayout, haveParent ? parent : 0); - child->resize(123, 456); - child->adjustSize(); - if (expectedSize == QSize(100000, 100000)) { - QVERIFY(child->size().width() < sizeHint.width()); - QVERIFY(child->size().height() < sizeHint.height()); - } else { -#if defined (Q_OS_WINCE) - if (!haveParent) { - const QRect& desktopRect = qApp->desktop()->availableGeometry(); - expectedSize.setWidth(qMin(expectedSize.width(), desktopRect.width())); - expectedSize.setHeight(qMin(expectedSize.height(), desktopRect.height())); - } -#endif - QCOMPARE(child->size(), expectedSize); - } - - delete parent; -} - -class TestLayout : public QVBoxLayout -{ - Q_OBJECT -public: - TestLayout(QWidget *w = 0) : QVBoxLayout(w) - { - invalidated = false; - } - - void invalidate() - { - invalidated = true; - } - - bool invalidated; -}; - -void tst_QWidget::updateGeometry_data() -{ - QTest::addColumn<QSize>("minSize"); - QTest::addColumn<bool>("shouldInvalidate"); - QTest::addColumn<QSize>("maxSize"); - QTest::addColumn<bool>("shouldInvalidate2"); - QTest::addColumn<int>("verticalSizePolicy"); - QTest::addColumn<bool>("shouldInvalidate3"); - QTest::addColumn<bool>("setVisible"); - QTest::addColumn<bool>("shouldInvalidate4"); - - QTest::newRow("setMinimumSize") - << QSize(100, 100) << true - << QSize() << false - << int(QSizePolicy::Preferred) << false - << true << false; - QTest::newRow("setMaximumSize") - << QSize() << false - << QSize(100, 100) << true - << int(QSizePolicy::Preferred) << false - << true << false; - QTest::newRow("setMinimumSize, then maximumSize to a different size") - << QSize(100, 100) << true - << QSize(300, 300) << true - << int(QSizePolicy::Preferred) << false - << true << false; - QTest::newRow("setMinimumSize, then maximumSize to the same size") - << QSize(100, 100) << true - << QSize(100, 100) << true - << int(QSizePolicy::Preferred) << false - << true << false; - QTest::newRow("setMinimumSize, then maximumSize to the same size and then hide it") - << QSize(100, 100) << true - << QSize(100, 100) << true - << int(QSizePolicy::Preferred) << false - << false << true; - QTest::newRow("Change sizePolicy") - << QSize() << false - << QSize() << false - << int(QSizePolicy::Minimum) << true - << true << false; - -} - -void tst_QWidget::updateGeometry() -{ - QFETCH(QSize, minSize); - QFETCH(bool, shouldInvalidate); - QFETCH(QSize, maxSize); - QFETCH(bool, shouldInvalidate2); - QFETCH(int, verticalSizePolicy); - QFETCH(bool, shouldInvalidate3); - QFETCH(bool, setVisible); - QFETCH(bool, shouldInvalidate4); - QWidget parent; - parent.resize(200, 200); - TestLayout *lout = new TestLayout(); - parent.setLayout(lout); - QWidget *child = new QWidget(&parent); - lout->addWidget(child); - parent.show(); - QApplication::processEvents(); - - lout->invalidated = false; - if (minSize.isValid()) - child->setMinimumSize(minSize); - QCOMPARE(lout->invalidated, shouldInvalidate); - - lout->invalidated = false; - if (maxSize.isValid()) - child->setMaximumSize(maxSize); - QCOMPARE(lout->invalidated, shouldInvalidate2); - - lout->invalidated = false; - child->setSizePolicy(QSizePolicy(QSizePolicy::Preferred, (QSizePolicy::Policy)verticalSizePolicy)); - if (shouldInvalidate3) - QCOMPARE(lout->invalidated, true); - - lout->invalidated = false; - if (!setVisible) - child->setVisible(false); - QCOMPARE(lout->invalidated, shouldInvalidate4); -} - -void tst_QWidget::sendUpdateRequestImmediately() -{ -#ifdef Q_WS_MAC - if (!QApplicationPrivate::graphicsSystem()) - QSKIP("We only send update requests on the Mac when passing -graphicssystem", SkipAll); -#endif - - UpdateWidget updateWidget; - updateWidget.show(); -#ifdef Q_WS_X11 - qt_x11_wait_for_window_manager(&updateWidget); -#endif - - qApp->processEvents(); -#ifdef Q_WS_QWS - QApplication::sendPostedEvents(); //glib workaround -#endif - updateWidget.reset(); - - QCOMPARE(updateWidget.numUpdateRequestEvents, 0); - updateWidget.repaint(); - QCOMPARE(updateWidget.numUpdateRequestEvents, 1); -} - -// 4DWM issues on IRIX makes this test fail. -#ifndef Q_OS_IRIX -void tst_QWidget::doubleRepaint() -{ -#if defined(Q_WS_MAC) - if (!macHasAccessToWindowsServer()) - QSKIP("Not having window server access causes the wrong number of repaints to be issues", SkipAll); -#endif - UpdateWidget widget; - widget.setFocusPolicy(Qt::StrongFocus); - // Filter out activation change and focus events to avoid update() calls in QWidget. - widget.updateOnActivationChangeAndFocusIn = false; - - // Show: 1 repaint - int expectedRepaints = 1; - widget.show(); - QTest::qWaitForWindowShown(&widget); - QTest::qWait(10); - QTRY_COMPARE(widget.numPaintEvents, expectedRepaints); - widget.numPaintEvents = 0; - - // Minmize: Should not trigger a repaint. - widget.showMinimized(); - QTest::qWait(10); - QCOMPARE(widget.numPaintEvents, 0); - widget.numPaintEvents = 0; - - // Restore: Should not trigger a repaint. - widget.showNormal(); - QTest::qWaitForWindowShown(&widget); - QTest::qWait(10); - QCOMPARE(widget.numPaintEvents, 0); -} -#endif - -#ifndef Q_WS_MAC -// This test only makes sense on the Mac when passing -graphicssystem. -void tst_QWidget::resizeInPaintEvent() -{ - QWidget window; - UpdateWidget widget(&window); - window.show(); - QTest::qWaitForWindowShown(&window); - QTRY_VERIFY(widget.numPaintEvents > 0); - - widget.reset(); - QCOMPARE(widget.numPaintEvents, 0); - - widget.resizeInPaintEvent = true; - // This will call resize in the paintEvent, which in turn will call - // invalidateBuffer() and a new update request should be posted. - widget.repaint(); - QCOMPARE(widget.numPaintEvents, 1); - widget.numPaintEvents = 0; - - QTest::qWait(10); - // Make sure the resize triggers another update. - QTRY_COMPARE(widget.numPaintEvents, 1); -} - -void tst_QWidget::opaqueChildren() -{ - QWidget widget; - widget.resize(200, 200); - - QWidget child(&widget); - child.setGeometry(-700, -700, 200, 200); - - QWidget grandChild(&child); - grandChild.resize(200, 200); - - QWidget greatGrandChild(&grandChild); - greatGrandChild.setGeometry(50, 50, 200, 200); - greatGrandChild.setPalette(Qt::red); - greatGrandChild.setAutoFillBackground(true); // Opaque child widget. - - widget.show(); -#ifdef Q_WS_X11 - qt_x11_wait_for_window_manager(&widget); -#endif - QTest::qWait(100); - - // Child, grandChild and greatGrandChild are outside the ancestor clip. - QRegion expectedOpaqueRegion(50, 50, 150, 150); - QCOMPARE(qt_widget_private(&grandChild)->getOpaqueChildren(), expectedOpaqueRegion); - - // Now they are all inside the ancestor clip. - child.setGeometry(50, 50, 150, 150); - QCOMPARE(qt_widget_private(&grandChild)->getOpaqueChildren(), expectedOpaqueRegion); - - // Set mask on greatGrandChild. - const QRegion mask(10, 10, 50, 50); - greatGrandChild.setMask(mask); - expectedOpaqueRegion &= mask.translated(50, 50); - QCOMPARE(qt_widget_private(&grandChild)->getOpaqueChildren(), expectedOpaqueRegion); - - // Make greatGrandChild "transparent". - greatGrandChild.setAutoFillBackground(false); - QCOMPARE(qt_widget_private(&grandChild)->getOpaqueChildren(), QRegion()); -} -#endif - - -class MaskSetWidget : public QWidget -{ - Q_OBJECT -public: - MaskSetWidget(QWidget* p =0) - : QWidget(p) {} - - void paintEvent(QPaintEvent* event) { - QPainter p(this); - - paintedRegion += event->region(); - foreach(QRect r, event->region().rects()) - p.fillRect(r, Qt::red); - } - - void resizeEvent(QResizeEvent*) { - setMask(QRegion(QRect(0, 0, width(), 10).normalized())); - } - - QRegion paintedRegion; - -public slots: - void resizeDown() { - setGeometry(QRect(0, 50, 50, 50)); - } - - void resizeUp() { - setGeometry(QRect(0, 50, 150, 50)); - } - -}; - -void tst_QWidget::setMaskInResizeEvent() -{ - UpdateWidget w; - w.reset(); - w.resize(200, 200); - w.setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint); - w.raise(); - - MaskSetWidget testWidget(&w); - testWidget.setGeometry(0, 0, 100, 100); - testWidget.setMask(QRegion(QRect(0,0,100,10))); - testWidget.show(); - w.show(); - QTest::qWaitForWindowShown(&w); - QTest::qWait(30); - QTRY_VERIFY(w.numPaintEvents > 0); - - w.reset(); - testWidget.paintedRegion = QRegion(); - QTimer::singleShot(0, &testWidget, SLOT(resizeDown())); - QTest::qWait(100); - - QRegion expectedParentUpdate(0, 0, 100, 10); // Old testWidget area. - expectedParentUpdate += testWidget.geometry(); // New testWidget area. - QCOMPARE(w.paintedRegion, expectedParentUpdate); - QCOMPARE(testWidget.paintedRegion, testWidget.mask()); - - testWidget.paintedRegion = QRegion(); - // Now resize the widget again, but in the oposite direction - QTimer::singleShot(0, &testWidget, SLOT(resizeUp())); - QTest::qWait(100); - - QTRY_COMPARE(testWidget.paintedRegion, testWidget.mask()); -} - -class MoveInResizeWidget : public QWidget -{ - Q_OBJECT -public: - MoveInResizeWidget(QWidget* p = 0) - : QWidget(p) - { - setWindowFlags(Qt::FramelessWindowHint); - } - - void resizeEvent(QResizeEvent*) { - - move(QPoint(100,100)); - - static bool firstTime = true; - if (firstTime) - QTimer::singleShot(250, this, SLOT(resizeMe())); - - firstTime = false; - } - -public slots: - void resizeMe() { - resize(100, 100); - } -}; - -void tst_QWidget::moveInResizeEvent() -{ - MoveInResizeWidget testWidget; - testWidget.setGeometry(50, 50, 200, 200); - testWidget.show(); - QTest::qWaitForWindowShown(&testWidget); - QTest::qWait(300); - - QRect expectedGeometry(100,100, 100, 100); - QTRY_COMPARE(testWidget.geometry(), expectedGeometry); -} - - -#if defined(Q_WS_WIN) || defined(Q_WS_X11) -void tst_QWidget::immediateRepaintAfterShow() -{ - UpdateWidget widget; - widget.show(); - qApp->processEvents(); - // On X11 in particular, we are now waiting for a MapNotify event before - // syncing the backing store. However, if someone request a repaint() - // we must repaint immediately regardless of the current state. - widget.numPaintEvents = 0; - widget.repaint(); - QCOMPARE(widget.numPaintEvents, 1); -} - -void tst_QWidget::immediateRepaintAfterInvalidateBuffer() -{ - QWidget *widget = new UpdateWidget; - widget->show(); -#ifdef Q_WS_X11 - qt_x11_wait_for_window_manager(widget); -#endif - QTest::qWait(200); - - static_cast<UpdateWidget *>(widget)->numPaintEvents = 0; - - // Marks the area covered by the widget as dirty in the backing store and - // posts an UpdateRequest event. - qt_widget_private(widget)->invalidateBuffer(widget->rect()); - QCOMPARE(static_cast<UpdateWidget *>(widget)->numPaintEvents, 0); - - // The entire widget is already dirty, but this time we want to update immediately - // by calling repaint(), and thus we have to repaint the widget and not wait for - // the UpdateRequest to be sent when we get back to the event loop. - widget->repaint(); - QCOMPARE(static_cast<UpdateWidget *>(widget)->numPaintEvents, 1); - - delete widget; -} -#endif - -void tst_QWidget::effectiveWinId() -{ - QWidget parent; - QWidget child(&parent); - - // Shouldn't crash. - QVERIFY(!parent.effectiveWinId()); - QVERIFY(!child.effectiveWinId()); - - parent.show(); - - QVERIFY(parent.effectiveWinId()); - QVERIFY(child.effectiveWinId()); -} - -void tst_QWidget::effectiveWinId2() -{ - QWidget parent; - - class MyWidget : public QWidget { - bool event(QEvent *e) - { - if (e->type() == QEvent::WinIdChange) { - // Shouldn't crash. - effectiveWinId(); - } - - return QWidget::event(e); - } - }; - - MyWidget child; - child.setParent(&parent); - parent.show(); - - child.setParent(0); - child.setParent(&parent); -} - -class CustomWidget : public QWidget -{ -public: - mutable int metricCallCount; - - CustomWidget(QWidget *parent = 0) : QWidget(parent), metricCallCount(0) {} - - virtual int metric(PaintDeviceMetric metric) const { - ++metricCallCount; - return QWidget::metric(metric); - } -}; - -void tst_QWidget::customDpi() -{ - QWidget *topLevel = new QWidget; - CustomWidget *custom = new CustomWidget(topLevel); - QWidget *child = new QWidget(custom); - - custom->metricCallCount = 0; - topLevel->logicalDpiX(); - QCOMPARE(custom->metricCallCount, 0); - custom->logicalDpiX(); - QCOMPARE(custom->metricCallCount, 1); - child->logicalDpiX(); - QCOMPARE(custom->metricCallCount, 2); - - delete topLevel; -} - -void tst_QWidget::customDpiProperty() -{ - QWidget *topLevel = new QWidget; - QWidget *middle = new CustomWidget(topLevel); - QWidget *child = new QWidget(middle); - - const int initialDpiX = topLevel->logicalDpiX(); - const int initialDpiY = topLevel->logicalDpiY(); - - middle->setProperty("_q_customDpiX", 300); - middle->setProperty("_q_customDpiY", 400); - - QCOMPARE(topLevel->logicalDpiX(), initialDpiX); - QCOMPARE(topLevel->logicalDpiY(), initialDpiY); - - QCOMPARE(middle->logicalDpiX(), 300); - QCOMPARE(middle->logicalDpiY(), 400); - - QCOMPARE(child->logicalDpiX(), 300); - QCOMPARE(child->logicalDpiY(), 400); - - middle->setProperty("_q_customDpiX", QVariant()); - middle->setProperty("_q_customDpiY", QVariant()); - - QCOMPARE(topLevel->logicalDpiX(), initialDpiX); - QCOMPARE(topLevel->logicalDpiY(), initialDpiY); - - QCOMPARE(middle->logicalDpiX(), initialDpiX); - QCOMPARE(middle->logicalDpiY(), initialDpiY); - - QCOMPARE(child->logicalDpiX(), initialDpiX); - QCOMPARE(child->logicalDpiY(), initialDpiY); - - delete topLevel; -} - -void tst_QWidget::quitOnCloseAttribute() -{ - QWidget w; - QCOMPARE(w.testAttribute(Qt::WA_QuitOnClose), true); - w.setAttribute(Qt::WA_QuitOnClose, false); - QCOMPARE(w.testAttribute(Qt::WA_QuitOnClose), false); - - w.setAttribute(Qt::WA_QuitOnClose); - w.setWindowFlags(Qt::Tool); - QCOMPARE(w.testAttribute(Qt::WA_QuitOnClose), false); - - w.setAttribute(Qt::WA_QuitOnClose); - w.setWindowFlags(Qt::Popup); - QCOMPARE(w.testAttribute(Qt::WA_QuitOnClose), false); - - w.setAttribute(Qt::WA_QuitOnClose); - w.setWindowFlags(Qt::ToolTip); - QCOMPARE(w.testAttribute(Qt::WA_QuitOnClose), false); - - w.setAttribute(Qt::WA_QuitOnClose); - w.setWindowFlags(Qt::SplashScreen); - QCOMPARE(w.testAttribute(Qt::WA_QuitOnClose), false); - - w.setAttribute(Qt::WA_QuitOnClose); - w.setWindowFlags(Qt::SubWindow); - QCOMPARE(w.testAttribute(Qt::WA_QuitOnClose), false); - - w.setAttribute(Qt::WA_QuitOnClose); - w.setWindowFlags(Qt::Dialog); - QCOMPARE(w.testAttribute(Qt::WA_QuitOnClose), true); - w.show(); - QCOMPARE(w.testAttribute(Qt::WA_QuitOnClose), true); - w.setWindowFlags(Qt::Tool); - QCOMPARE(w.testAttribute(Qt::WA_QuitOnClose), false); -} - -void tst_QWidget::moveRect() -{ - QWidget widget; - widget.setUpdatesEnabled(false); - QWidget child(&widget); - child.setUpdatesEnabled(false); - child.setAttribute(Qt::WA_OpaquePaintEvent); - widget.show(); - QTest::qWait(200); - child.move(10, 10); // Don't crash. -} - -#ifdef Q_WS_WIN -class GDIWidget : public QDialog -{ -public: - GDIWidget() { setAttribute(Qt::WA_PaintOnScreen); } - QPaintEngine *paintEngine() const { return 0; } - - - void paintEvent(QPaintEvent *) { - HDC hdc = getDC(); - SelectObject(hdc, CreateSolidBrush(RGB(255, 0, 0))); - Rectangle(hdc, 0, 0, 10, 10); - - releaseDC(hdc); - - QImage im = QPixmap::grabWindow(winId(), 0, 0, width(), height()).toImage(); - color = im.pixel(1, 1); - - accept(); - } - - QSize sizeHint() const { - return QSize(400, 300); - } - - QColor color; -}; - -void tst_QWidget::gdiPainting() -{ - GDIWidget w; - w.exec(); - - QCOMPARE(w.color, QColor(255, 0, 0)); - -} - -void tst_QWidget::paintOnScreenPossible() -{ - QWidget w1; - w1.setAttribute(Qt::WA_PaintOnScreen); - QVERIFY(!w1.testAttribute(Qt::WA_PaintOnScreen)); - - GDIWidget w2; - w2.setAttribute(Qt::WA_PaintOnScreen); - QVERIFY(w2.testAttribute(Qt::WA_PaintOnScreen)); -} -#endif - -void tst_QWidget::reparentStaticWidget() -{ - QWidget window1; - - QWidget *child = new QWidget(&window1); - child->setPalette(Qt::red); - child->setAutoFillBackground(true); - child->setAttribute(Qt::WA_StaticContents); - child->resize(100, 100); - - QWidget *grandChild = new QWidget(child); - grandChild->setPalette(Qt::blue); - grandChild->setAutoFillBackground(true); - grandChild->resize(50, 50); - grandChild->setAttribute(Qt::WA_StaticContents); - window1.show(); - QTest::qWaitForWindowShown(&window1); - - QWidget window2; - window2.show(); - QTest::qWaitForWindowShown(&window2); - QTest::qWait(20); - - // Reparent into another top-level. - child->setParent(&window2); - child->show(); - - // Please don't crash. - window1.resize(window1.size() + QSize(2, 2)); - QTest::qWait(20); - - // Make sure we move all static children even though - // the reparented widget itself is non-static. - child->setAttribute(Qt::WA_StaticContents, false); - child->setParent(&window1); - child->show(); - - // Please don't crash. - window2.resize(window2.size() + QSize(2, 2)); - QTest::qWait(20); - - child->setParent(0); - child->show(); - QTest::qWait(20); - - // Please don't crash. - child->resize(child->size() + QSize(2, 2)); - window2.resize(window2.size() + QSize(2, 2)); - QTest::qWait(20); - - QWidget *siblingOfGrandChild = new QWidget(child); - siblingOfGrandChild->show(); - QTest::qWait(20); - - // Nothing should happen when reparenting within the same top-level. - grandChild->setParent(siblingOfGrandChild); - grandChild->show(); - QTest::qWait(20); - - QWidget paintOnScreen; - paintOnScreen.setAttribute(Qt::WA_PaintOnScreen); - paintOnScreen.show(); - QTest::qWaitForWindowShown(&paintOnScreen); - QTest::qWait(20); - - child->setParent(&paintOnScreen); - child->show(); - QTest::qWait(20); - - // Please don't crash. - paintOnScreen.resize(paintOnScreen.size() + QSize(2, 2)); - QTest::qWait(20); - -} - -void tst_QWidget::QTBUG6883_reparentStaticWidget2() -{ - QMainWindow mw; - QDockWidget *one = new QDockWidget("one", &mw); - mw.addDockWidget(Qt::LeftDockWidgetArea, one , Qt::Vertical); - - QWidget *child = new QWidget(); - child->setPalette(Qt::red); - child->setAutoFillBackground(true); - child->setAttribute(Qt::WA_StaticContents); - child->resize(100, 100); - one->setWidget(child); - - QToolBar *mainTools = mw.addToolBar("Main Tools"); - mainTools->addWidget(new QLineEdit); - - mw.show(); - QTest::qWaitForWindowShown(&mw); - - one->setFloating(true); - QTest::qWait(20); - //do not crash -} - -#ifdef Q_WS_QWS -void tst_QWidget::updateOutsideSurfaceClip() -{ - UpdateWidget widget; - widget.setWindowFlags(Qt::FramelessWindowHint); - widget.resize(100, 100); - widget.raise(); - widget.show(); - QTest::qWait(200); - widget.reset(); - - // Move widget partially outside buffer and change the surface clip. - widget.move(-50, 0); - QTest::qWait(100); - - // Update region is outside the surface clip and should not trigger a repaint. - widget.update(0, 0, 20, 20); - QTest::qWait(100); - QCOMPARE(widget.numPaintEvents, 0); - - // Now, move the widget back so that the update region is inside the clip - // and make sure we get a repaint of the dirty area. - widget.move(0, 0); - QTest::qWait(100); - QCOMPARE(widget.numPaintEvents, 1); - QCOMPARE(widget.paintedRegion, QRegion(0, 0, 20, 20)); -} -#endif -class ColorRedWidget : public QWidget -{ -public: - ColorRedWidget(QWidget *parent = 0) - : QWidget(parent, Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint | Qt::ToolTip) - { - } - - void paintEvent(QPaintEvent *) { - QPainter p(this); - p.fillRect(rect(),Qt::red); - } -}; - -void tst_QWidget::translucentWidget() -{ - QPixmap pm(16,16); - pm.fill(Qt::red); - ColorRedWidget label; - label.setFixedSize(16,16); - label.setAttribute(Qt::WA_TranslucentBackground); - label.move(qApp->desktop()->availableGeometry().topLeft()); - label.show(); -#ifdef Q_WS_X11 - qt_x11_wait_for_window_manager(&label); -#endif - QTest::qWait(200); - - QPixmap widgetSnapshot; - -#ifdef Q_WS_WIN - QWidget *desktopWidget = QApplication::desktop()->screen(0); - if (QSysInfo::windowsVersion() >= QSysInfo::WV_VISTA) - widgetSnapshot = QPixmap::grabWindow(desktopWidget->winId(), 0,0, label.width(), label.height()); - else -#endif - widgetSnapshot = QPixmap::grabWindow(label.winId()); - QImage actual = widgetSnapshot.toImage().convertToFormat(QImage::Format_RGB32); - QImage expected = pm.toImage().convertToFormat(QImage::Format_RGB32); - QCOMPARE(actual.size(),expected.size()); - QCOMPARE(actual,expected); -} - -class MaskResizeTestWidget : public QWidget -{ - Q_OBJECT -public: - MaskResizeTestWidget(QWidget* p =0) - : QWidget(p) { - setMask(QRegion(QRect(0, 0, 100, 100).normalized())); - } - - void paintEvent(QPaintEvent* event) { - QPainter p(this); - - paintedRegion += event->region(); - foreach(QRect r, event->region().rects()) - p.fillRect(r, Qt::red); - } - - QRegion paintedRegion; - -public slots: - void enlargeMask() { - QRegion newMask(QRect(0, 0, 150, 150).normalized()); - setMask(newMask); - } - - void shrinkMask() { - QRegion newMask(QRect(0, 0, 50, 50).normalized()); - setMask(newMask); - } - -}; - -void tst_QWidget::setClearAndResizeMask() -{ - UpdateWidget topLevel; - topLevel.resize(150, 150); - topLevel.show(); - QTest::qWaitForWindowShown(&topLevel); - QTRY_VERIFY(topLevel.numPaintEvents > 0); - topLevel.reset(); - - // Mask top-level widget - const QRegion topLevelMask(0, 0, 100, 100, QRegion::Ellipse); - topLevel.setMask(topLevelMask); - QCOMPARE(topLevel.mask(), topLevelMask); -#if defined(Q_WS_WIN) || defined(Q_WS_X11) // We don't control what's happening on other platforms. - // and ensure that the top-level doesn't get any update. - QCOMPARE(topLevel.numPaintEvents, 0); -#endif - - topLevel.reset(); - - // Clear top-level mask - topLevel.clearMask(); - QCOMPARE(topLevel.mask(), QRegion()); - QTest::qWait(10); - QRegion outsideOldMask(topLevel.rect()); - outsideOldMask -= topLevelMask; -#if defined(Q_WS_WIN) || defined(Q_WS_X11) // We don't control what's happening on other platforms. - // and ensure that the top-level gets an update for the area outside the old mask. - QTRY_VERIFY(topLevel.numPaintEvents > 0); - QTRY_COMPARE(topLevel.paintedRegion, outsideOldMask); -#endif - - UpdateWidget child(&topLevel); - child.setAutoFillBackground(true); // NB! Opaque child. - child.setPalette(Qt::red); - child.resize(100, 100); - child.show(); - QTest::qWait(10); - - child.reset(); - topLevel.reset(); - - // Mask child widget with a mask that is smaller than the rect - const QRegion childMask(0, 0, 50, 50); - child.setMask(childMask); - QTRY_COMPARE(child.mask(), childMask); - QTest::qWait(50); - // and ensure that the child widget doesn't get any update. -#ifdef Q_WS_MAC - // Mac always issues a full update when calling setMask, and we cannot force it to not do so. - if (child.internalWinId()) - QCOMPARE(child.numPaintEvents, 1); - else -#endif - QCOMPARE(child.numPaintEvents, 0); - // and the parent widget gets an update for the newly exposed area. - QTRY_COMPARE(topLevel.numPaintEvents, 1); - QRegion expectedParentExpose(child.rect()); - expectedParentExpose -= childMask; - QCOMPARE(topLevel.paintedRegion, expectedParentExpose); - - child.reset(); - topLevel.reset(); - - // Clear child widget mask - child.clearMask(); - QTRY_COMPARE(child.mask(), QRegion()); - QTest::qWait(10); - // and ensure that that the child widget gets an update for the area outside the old mask. - QTRY_COMPARE(child.numPaintEvents, 1); - outsideOldMask = child.rect(); -#ifdef Q_WS_MAC - // Mac always issues a full update when calling setMask, and we cannot force it to not do so. - if (!child.internalWinId()) -#endif - outsideOldMask -= childMask; - QCOMPARE(child.paintedRegion, outsideOldMask); - // and the parent widget doesn't get any update. - QCOMPARE(topLevel.numPaintEvents, 0); - - child.reset(); - topLevel.reset(); - - // Mask child widget with a mask that is bigger than the rect - child.setMask(QRegion(0, 0, 1000, 1000)); - QTest::qWait(100); -#ifdef Q_WS_MAC - // Mac always issues a full update when calling setMask, and we cannot force it to not do so. - if (child.internalWinId()) - QTRY_COMPARE(child.numPaintEvents, 1); - else -#endif - // and ensure that we don't get any updates at all. - QTRY_COMPARE(child.numPaintEvents, 0); - QCOMPARE(topLevel.numPaintEvents, 0); - - // ...and the same applies when clearing the mask. - child.clearMask(); - QTest::qWait(100); -#ifdef Q_WS_MAC - // Mac always issues a full update when calling setMask, and we cannot force it to not do so. - if (child.internalWinId()) - QTRY_VERIFY(child.numPaintEvents > 0); - else -#endif - QCOMPARE(child.numPaintEvents, 0); - QCOMPARE(topLevel.numPaintEvents, 0); - - QWidget resizeParent; - MaskResizeTestWidget resizeChild(&resizeParent); - - resizeParent.resize(300,300); - resizeParent.raise(); - resizeParent.setWindowFlags(Qt::WindowStaysOnTopHint); - resizeChild.setGeometry(50,50,200,200); - QPalette pal = resizeParent.palette(); - pal.setColor(QPalette::Window, QColor(Qt::white)); - resizeParent.setPalette(pal); - - resizeParent.show(); - QTest::qWaitForWindowShown(&resizeParent); - // Disable the size grip on the Mac; otherwise it'll be included when grabbing the window. - resizeParent.setFixedSize(resizeParent.size()); - resizeChild.show(); - QTest::qWait(100); - resizeChild.paintedRegion = QRegion(); - - QTimer::singleShot(100, &resizeChild, SLOT(shrinkMask())); - QTest::qWait(200); -#ifdef Q_WS_MAC - // Mac always issues a full update when calling setMask, and we cannot force it to not do so. - if (child.internalWinId()) - QTRY_COMPARE(resizeChild.paintedRegion, resizeChild.mask()); - else -#endif - QTRY_COMPARE(resizeChild.paintedRegion, QRegion()); - - resizeChild.paintedRegion = QRegion(); - const QRegion oldMask = resizeChild.mask(); - QTimer::singleShot(0, &resizeChild, SLOT(enlargeMask())); - QTest::qWait(100); -#ifdef Q_WS_MAC - // Mac always issues a full update when calling setMask, and we cannot force it to not do so. - if (child.internalWinId()) - QTRY_COMPARE(resizeChild.paintedRegion, resizeChild.mask()); - else -#endif - QTRY_COMPARE(resizeChild.paintedRegion, resizeChild.mask() - oldMask); -} - -void tst_QWidget::maskedUpdate() -{ - UpdateWidget topLevel; - topLevel.resize(200, 200); - const QRegion topLevelMask(50, 50, 70, 70); - topLevel.setMask(topLevelMask); - - UpdateWidget child(&topLevel); - child.setGeometry(20, 20, 180, 180); - const QRegion childMask(60, 60, 30, 30); - child.setMask(childMask); - - UpdateWidget grandChild(&child); - grandChild.setGeometry(50, 50, 100, 100); - const QRegion grandChildMask(20, 20, 10, 10); - grandChild.setMask(grandChildMask); - - topLevel.show(); - QTest::qWaitForWindowShown(&topLevel); - QTRY_VERIFY(topLevel.numPaintEvents > 0); - - -#define RESET_WIDGETS \ - topLevel.reset(); \ - child.reset(); \ - grandChild.reset(); - -#define CLEAR_MASK(widget) \ - widget.clearMask(); \ - QTest::qWait(100); \ - RESET_WIDGETS; - - // All widgets are transparent at this point, so any call to update() will result - // in composition, i.e. the update propagates to ancestors and children. - - // TopLevel update. - RESET_WIDGETS; - topLevel.update(); - QTest::qWait(10); - - QTRY_COMPARE(topLevel.paintedRegion, topLevelMask); - QTRY_COMPARE(child.paintedRegion, childMask); - QTRY_COMPARE(grandChild.paintedRegion, grandChildMask); - - // Child update. - RESET_WIDGETS; - child.update(); - QTest::qWait(10); - - QTRY_COMPARE(topLevel.paintedRegion, childMask.translated(child.pos())); - QTRY_COMPARE(child.paintedRegion, childMask); - QTRY_COMPARE(grandChild.paintedRegion, grandChildMask); - - // GrandChild update. - RESET_WIDGETS; - grandChild.update(); - QTest::qWait(10); - - QTRY_COMPARE(topLevel.paintedRegion, grandChildMask.translated(grandChild.mapTo(&topLevel, QPoint()))); - QTRY_COMPARE(child.paintedRegion, grandChildMask.translated(grandChild.pos())); - QTRY_COMPARE(grandChild.paintedRegion, grandChildMask); - - topLevel.setAttribute(Qt::WA_OpaquePaintEvent); - child.setAttribute(Qt::WA_OpaquePaintEvent); - grandChild.setAttribute(Qt::WA_OpaquePaintEvent); - - // All widgets are now opaque, which means no composition, i.e. - // the update does not propate to ancestors and children. - - // TopLevel update. - RESET_WIDGETS; - topLevel.update(); - QTest::qWait(10); - - QRegion expectedTopLevelUpdate = topLevelMask; - expectedTopLevelUpdate -= childMask.translated(child.pos()); // Subtract opaque children. - QTRY_COMPARE(topLevel.paintedRegion, expectedTopLevelUpdate); - QTRY_COMPARE(child.paintedRegion, QRegion()); - QTRY_COMPARE(grandChild.paintedRegion, QRegion()); - - // Child update. - RESET_WIDGETS; - child.update(); - QTest::qWait(10); - - QTRY_COMPARE(topLevel.paintedRegion, QRegion()); - QRegion expectedChildUpdate = childMask; - expectedChildUpdate -= grandChildMask.translated(grandChild.pos()); // Subtract oapque children. - QTRY_COMPARE(child.paintedRegion, expectedChildUpdate); - QTRY_COMPARE(grandChild.paintedRegion, QRegion()); - - // GrandChild update. - RESET_WIDGETS; - grandChild.update(); - QTest::qWait(10); - - QTRY_COMPARE(topLevel.paintedRegion, QRegion()); - QTRY_COMPARE(child.paintedRegion, QRegion()); - QTRY_COMPARE(grandChild.paintedRegion, grandChildMask); - - // GrandChild update. - CLEAR_MASK(grandChild); - grandChild.update(); - QTest::qWait(10); - - QTRY_COMPARE(topLevel.paintedRegion, QRegion()); - QTRY_COMPARE(child.paintedRegion, QRegion()); - QRegion expectedGrandChildUpdate = grandChild.rect(); - // Clip with parent's mask. - expectedGrandChildUpdate &= childMask.translated(-grandChild.pos()); - QCOMPARE(grandChild.paintedRegion, expectedGrandChildUpdate); - - // GrandChild update. - CLEAR_MASK(child); - grandChild.update(); - QTest::qWait(10); - - QTRY_COMPARE(topLevel.paintedRegion, QRegion()); - QTRY_COMPARE(child.paintedRegion, QRegion()); - expectedGrandChildUpdate = grandChild.rect(); - // Clip with parent's mask. - expectedGrandChildUpdate &= topLevelMask.translated(-grandChild.mapTo(&topLevel, QPoint())); - QTRY_COMPARE(grandChild.paintedRegion, expectedGrandChildUpdate); - - // Child update. - RESET_WIDGETS; - child.update(); - QTest::qWait(10); - - QTRY_COMPARE(topLevel.paintedRegion, QRegion()); - expectedChildUpdate = child.rect(); - // Clip with parent's mask. - expectedChildUpdate &= topLevelMask.translated(-child.pos()); - expectedChildUpdate -= grandChild.geometry(); // Subtract opaque children. - QTRY_COMPARE(child.paintedRegion, expectedChildUpdate); - QTRY_COMPARE(grandChild.paintedRegion, QRegion()); - - // GrandChild update. - CLEAR_MASK(topLevel); - grandChild.update(); - QTest::qWait(10); - - QTRY_COMPARE(topLevel.paintedRegion, QRegion()); - QTRY_COMPARE(child.paintedRegion, QRegion()); - QTRY_COMPARE(grandChild.paintedRegion, QRegion(grandChild.rect())); // Full update. -} - -// Windows Mobile has no proper cursor support, so skip this test on that platform. -#if defined(Q_WS_X11) || (defined(Q_WS_WIN) && !defined(Q_OS_WINCE_WM)) || defined(Q_WS_QWS) || defined(Q_WS_QPA) -void tst_QWidget::syntheticEnterLeave() -{ - class MyWidget : public QWidget - { - public: - MyWidget(QWidget *parent = 0) : QWidget(parent), numEnterEvents(0), numLeaveEvents(0) {} - void enterEvent(QEvent *) { ++numEnterEvents; } - void leaveEvent(QEvent *) { ++numLeaveEvents; } - int numEnterEvents; - int numLeaveEvents; - }; - - QCursor::setPos(QPoint(0,0)); - - MyWidget window; - window.setWindowFlags(Qt::WindowStaysOnTopHint); - window.resize(200, 200); - - MyWidget *child1 = new MyWidget(&window); - child1->setPalette(Qt::blue); - child1->setAutoFillBackground(true); - child1->resize(200, 200); - child1->setCursor(Qt::OpenHandCursor); - - MyWidget *child2 = new MyWidget(&window); - child2->resize(200, 200); - - MyWidget *grandChild = new MyWidget(child2); - grandChild->setPalette(Qt::red); - grandChild->setAutoFillBackground(true); - grandChild->resize(200, 200); - grandChild->setCursor(Qt::WaitCursor); - - window.show(); - window.raise(); -#ifdef Q_WS_X11 - qt_x11_wait_for_window_manager(&window); -#endif - QTest::qWait(300); - -#define RESET_EVENT_COUNTS \ - window.numEnterEvents = 0; \ - window.numLeaveEvents = 0; \ - child1->numEnterEvents = 0; \ - child1->numLeaveEvents = 0; \ - child2->numEnterEvents = 0; \ - child2->numLeaveEvents = 0; \ - grandChild->numEnterEvents = 0; \ - grandChild->numLeaveEvents = 0; - - // Position the cursor in the middle of the window. - const QPoint globalPos = window.mapToGlobal(QPoint(100, 100)); - QCursor::setPos(globalPos); // Enter child2 and grandChild. - QTest::qWait(300); - - QCOMPARE(window.numLeaveEvents, 0); - QCOMPARE(child2->numLeaveEvents, 0); - QCOMPARE(grandChild->numLeaveEvents, 0); - QCOMPARE(child1->numLeaveEvents, 0); - - // This event arrives asynchronously - QTRY_COMPARE(window.numEnterEvents, 1); - QCOMPARE(child2->numEnterEvents, 1); - QCOMPARE(grandChild->numEnterEvents, 1); - QCOMPARE(child1->numEnterEvents, 0); - - RESET_EVENT_COUNTS; - child2->hide(); // Leave child2 and grandChild, enter child1. - - QCOMPARE(window.numLeaveEvents, 0); - QCOMPARE(child2->numLeaveEvents, 1); - QCOMPARE(grandChild->numLeaveEvents, 1); - QCOMPARE(child1->numLeaveEvents, 0); - - QCOMPARE(window.numEnterEvents, 0); - QCOMPARE(child2->numEnterEvents, 0); - QCOMPARE(grandChild->numEnterEvents, 0); - QCOMPARE(child1->numEnterEvents, 1); - - RESET_EVENT_COUNTS; - child2->show(); // Leave child1, enter child2 and grandChild. - - QCOMPARE(window.numLeaveEvents, 0); - QCOMPARE(child2->numLeaveEvents, 0); - QCOMPARE(grandChild->numLeaveEvents, 0); - QCOMPARE(child1->numLeaveEvents, 1); - - QCOMPARE(window.numEnterEvents, 0); - QCOMPARE(child2->numEnterEvents, 1); - QCOMPARE(grandChild->numEnterEvents, 1); - QCOMPARE(child1->numEnterEvents, 0); - - RESET_EVENT_COUNTS; - delete child2; // Enter child1 (and do not send leave events to child2 and grandChild). - - QCOMPARE(window.numLeaveEvents, 0); - QCOMPARE(child1->numLeaveEvents, 0); - - QCOMPARE(window.numEnterEvents, 0); - QCOMPARE(child1->numEnterEvents, 1); -} -#endif - -// Windows Mobile has no proper cursor support, so skip this test on that platform. -#if defined(Q_WS_X11) || (defined(Q_WS_WIN) && !defined(Q_OS_WINCE_WM)) || defined(Q_WS_QWS) || defined(Q_WS_QPA) -void tst_QWidget::taskQTBUG_4055_sendSyntheticEnterLeave() -{ - class SELParent : public QWidget - { - public: - SELParent(QWidget *parent = 0): QWidget(parent) { } - - void mousePressEvent(QMouseEvent *) { child->show(); } - QWidget *child; - }; - - class SELChild : public QWidget - { - public: - SELChild(QWidget *parent = 0) : QWidget(parent), numEnterEvents(0), numMouseMoveEvents(0) {} - void enterEvent(QEvent *) { ++numEnterEvents; } - void mouseMoveEvent(QMouseEvent *event) - { - QCOMPARE(event->button(), Qt::NoButton); - QCOMPARE(event->buttons(), Qt::MouseButtons(Qt::NoButton)); - ++numMouseMoveEvents; - } - void reset() { numEnterEvents = numMouseMoveEvents = 0; } - int numEnterEvents, numMouseMoveEvents; - }; - - QCursor::setPos(QPoint(0,0)); - - SELParent parent; - parent.resize(200, 200); - SELChild child(&parent); - child.resize(200, 200); - parent.show(); - #ifdef Q_WS_X11 - qt_x11_wait_for_window_manager(&parent); - #endif - QTest::qWait(150); - - QCursor::setPos(child.mapToGlobal(QPoint(100, 100))); - // Make sure the cursor has entered the child. - QTRY_VERIFY(child.numEnterEvents > 0); - - child.hide(); - child.reset(); - child.show(); - - // Make sure the child gets enter event and no mouse move event. - QTRY_COMPARE(child.numEnterEvents, 1); - QCOMPARE(child.numMouseMoveEvents, 0); - - child.hide(); - child.reset(); - child.setMouseTracking(true); - child.show(); - - // Make sure the child gets enter event and mouse move event. - // Note that we verify event->button() and event->buttons() - // in SELChild::mouseMoveEvent(). - QTRY_COMPARE(child.numEnterEvents, 1); - QCOMPARE(child.numMouseMoveEvents, 1); - - // Sending synthetic enter/leave trough the parent's mousePressEvent handler. - parent.child = &child; - - child.hide(); - child.reset(); - QTest::mouseClick(&parent, Qt::LeftButton); - - // Make sure the child gets enter event and one mouse move event. - QTRY_COMPARE(child.numEnterEvents, 1); - QCOMPARE(child.numMouseMoveEvents, 1); - - child.hide(); - child.reset(); - child.setMouseTracking(false); - QTest::mouseClick(&parent, Qt::LeftButton); - - // Make sure the child gets enter event and no mouse move event. - QTRY_COMPARE(child.numEnterEvents, 1); - QCOMPARE(child.numMouseMoveEvents, 0); - } -#endif - -void tst_QWidget::windowFlags() -{ - QWidget w; - w.setWindowFlags(w.windowFlags() | Qt::FramelessWindowHint); - QVERIFY(w.windowFlags() & Qt::FramelessWindowHint); -} - -void tst_QWidget::initialPosForDontShowOnScreenWidgets() -{ - { // Check default position. - const QPoint expectedPos(0, 0); - QWidget widget; - widget.setAttribute(Qt::WA_DontShowOnScreen); - widget.winId(); // Make sure create_sys is called. - QCOMPARE(widget.pos(), expectedPos); - QCOMPARE(widget.geometry().topLeft(), expectedPos); - } - - { // Explicitly move to a position. - const QPoint expectedPos(100, 100); - QWidget widget; - widget.setAttribute(Qt::WA_DontShowOnScreen); - widget.move(expectedPos); - widget.winId(); // Make sure create_sys is called. - QCOMPARE(widget.pos(), expectedPos); - QCOMPARE(widget.geometry().topLeft(), expectedPos); - } -} - -#ifdef Q_WS_X11 -void tst_QWidget::paintOutsidePaintEvent() -{ - QWidget widget; - widget.resize(200, 200); - - QWidget child1(&widget); - child1.resize(100, 100); - child1.setPalette(Qt::red); - child1.setAutoFillBackground(true); - - QWidget child2(&widget); - child2.setGeometry(50, 50, 100, 100); - child2.setPalette(Qt::blue); - child2.setAutoFillBackground(true); - - widget.show(); - QTest::qWaitForWindowShown(&widget); - QTest::qWait(60); - - const QPixmap before = QPixmap::grabWindow(widget.winId()); - - // Child 1 should be clipped by child 2, so nothing should change. - child1.setAttribute(Qt::WA_PaintOutsidePaintEvent); - QPainter painter(&child1); - painter.fillRect(child1.rect(), Qt::red); - painter.end(); - XSync(QX11Info::display(), false); // Flush output buffer. - QTest::qWait(60); - - const QPixmap after = QPixmap::grabWindow(widget.winId()); - - QCOMPARE(before, after); -} -#endif - -class MyEvilObject : public QObject -{ - Q_OBJECT -public: - MyEvilObject(QWidget *widgetToCrash) : QObject(), widget(widgetToCrash) - { - connect(widget, SIGNAL(destroyed(QObject *)), this, SLOT(beEvil(QObject *))); - delete widget; - } - QWidget *widget; - -private slots: - void beEvil(QObject *) { widget->update(0, 0, 150, 150); } -}; - -void tst_QWidget::updateOnDestroyedSignal() -{ - QWidget widget; - - QWidget *child = new QWidget(&widget); - child->resize(100, 100); - child->setAutoFillBackground(true); - child->setPalette(Qt::red); - - widget.show(); -#ifdef Q_WS_X11 - qt_x11_wait_for_window_manager(&widget); -#endif - QTest::qWait(200); - - // Please do not crash. - MyEvilObject evil(child); - QTest::qWait(200); -} - -void tst_QWidget::toplevelLineEditFocus() -{ - testWidget->hide(); - - QLineEdit w; - w.show(); - QTest::qWaitForWindowShown(&w); - QTest::qWait(20); - - QTRY_COMPARE(QApplication::activeWindow(), (QWidget*)&w); - QTRY_COMPARE(QApplication::focusWidget(), (QWidget*)&w); -} - -void tst_QWidget::focusWidget_task254563() -{ - //having different visibility for widget is important - QWidget top; - top.show(); - QWidget container(&top); - QWidget *widget = new QWidget(&container); - widget->show(); - - widget->setFocus(); //set focus (will set the focus widget up to the toplevel to be 'widget') - container.setFocus(); - delete widget; // will call clearFocus but that doesn't help - QVERIFY(top.focusWidget() != widget); //dangling pointer -} - -// This test case relies on developer build (AUTOTEST_EXPORT). -#ifdef QT_BUILD_INTERNAL -void tst_QWidget::destroyBackingStore() -{ - UpdateWidget w; - w.reset(); - w.show(); - - QTest::qWaitForWindowShown(&w); - QApplication::processEvents(); - QTRY_VERIFY(w.numPaintEvents > 0); - w.reset(); - w.update(); - qt_widget_private(&w)->topData()->backingStoreTracker.create(&w); - - w.update(); - QApplication::processEvents(); -#ifdef Q_WS_QWS - QApplication::processEvents(); -#endif - QCOMPARE(w.numPaintEvents, 1); - - // Check one more time, because the second time around does more caching. - w.update(); - QApplication::processEvents(); - QCOMPARE(w.numPaintEvents, 2); -} -#endif - -// Helper function -QWidgetBackingStore* backingStore(QWidget &widget) -{ - QWidgetBackingStore *backingStore = 0; -#ifdef QT_BUILD_INTERNAL - if (QTLWExtra *topExtra = qt_widget_private(&widget)->maybeTopData()) - backingStore = topExtra->backingStoreTracker.data(); -#endif - return backingStore; -} - -// Tables of 5000 elements do not make sense on Windows Mobile. -#ifndef Q_OS_WINCE_WM -void tst_QWidget::rectOutsideCoordinatesLimit_task144779() -{ - QApplication::setOverrideCursor(Qt::BlankCursor); //keep the cursor out of screen grabs - QWidget main(0,Qt::FramelessWindowHint); //don't get confused by the size of the window frame - QPalette palette; - palette.setColor(QPalette::Window, Qt::red); - main.setPalette(palette); - - QDesktopWidget desktop; - QRect desktopDimensions = desktop.availableGeometry(&main); - QSize mainSize(400, 400); - mainSize = mainSize.boundedTo(desktopDimensions.size()); - main.resize(mainSize); - - QWidget *offsetWidget = new QWidget(&main); - offsetWidget->setGeometry(0, -(15000 - mainSize.height()), mainSize.width(), 15000); - - // big widget is too big for the coordinates, it must be limited by wrect - // if wrect is not at the right position because of offsetWidget, bigwidget - // is not painted correctly - QWidget *bigWidget = new QWidget(offsetWidget); - bigWidget->setGeometry(0, 0, mainSize.width(), 50000); - palette.setColor(QPalette::Window, Qt::green); - bigWidget->setPalette(palette); - bigWidget->setAutoFillBackground(true); - - main.show(); - QTest::qWaitForWindowShown(&main); - - QPixmap correct(main.size()); - correct.fill(Qt::green); - - QTRY_COMPARE(QPixmap::grabWindow(main.winId()).toImage().convertToFormat(QImage::Format_RGB32), - correct.toImage().convertToFormat(QImage::Format_RGB32)); - QApplication::restoreOverrideCursor(); -} -#endif - -void tst_QWidget::inputFocus_task257832() -{ - QLineEdit *widget = new QLineEdit; - QInputContext *context = widget->inputContext(); - if (!context) - QSKIP("No input context", SkipSingle); - widget->setFocus(); - widget->winId(); // make sure, widget has been created - context->setFocusWidget(widget); - QCOMPARE(context->focusWidget(), static_cast<QWidget*>(widget)); - widget->setReadOnly(true); - QVERIFY(!context->focusWidget()); - delete widget; -} - -void tst_QWidget::setGraphicsEffect() -{ - // Check that we don't have any effect by default. - QWidget *widget = new QWidget; - QVERIFY(!widget->graphicsEffect()); - - // SetGet check. - QPointer<QGraphicsEffect> blurEffect = new QGraphicsBlurEffect; - widget->setGraphicsEffect(blurEffect); - QCOMPARE(widget->graphicsEffect(), static_cast<QGraphicsEffect *>(blurEffect)); - - // Ensure the existing effect is deleted when setting a new one. - QPointer<QGraphicsEffect> shadowEffect = new QGraphicsDropShadowEffect; - widget->setGraphicsEffect(shadowEffect); - QVERIFY(!blurEffect); - QCOMPARE(widget->graphicsEffect(), static_cast<QGraphicsEffect *>(shadowEffect)); - blurEffect = new QGraphicsBlurEffect; - - // Ensure the effect is uninstalled when setting it on a new target. - QWidget *anotherWidget = new QWidget; - anotherWidget->setGraphicsEffect(blurEffect); - widget->setGraphicsEffect(blurEffect); - QVERIFY(!anotherWidget->graphicsEffect()); - QVERIFY(!shadowEffect); - - // Ensure the existing effect is deleted when deleting the widget. - delete widget; - QVERIFY(!blurEffect); - delete anotherWidget; - - // Ensure the effect is uninstalled when deleting it - widget = new QWidget; - blurEffect = new QGraphicsBlurEffect; - widget->setGraphicsEffect(blurEffect); - delete blurEffect; - QVERIFY(!widget->graphicsEffect()); - - // Ensure the existing effect is uninstalled and deleted when setting a null effect - blurEffect = new QGraphicsBlurEffect; - widget->setGraphicsEffect(blurEffect); - widget->setGraphicsEffect(0); - QVERIFY(!widget->graphicsEffect()); - QVERIFY(!blurEffect); - - delete widget; -} - -void tst_QWidget::activateWindow() -{ - // Test case for task 260685 - - // Create first mainwindow and set it active - QMainWindow* mainwindow = new QMainWindow(); - QLabel* label = new QLabel(mainwindow); - mainwindow->setCentralWidget(label); - mainwindow->setVisible(true); - mainwindow->activateWindow(); - QTest::qWaitForWindowShown(mainwindow); - qApp->processEvents(); - - QTRY_VERIFY(mainwindow->isActiveWindow()); - - // Create second mainwindow and set it active - QMainWindow* mainwindow2 = new QMainWindow(); - QLabel* label2 = new QLabel(mainwindow2); - mainwindow2->setCentralWidget(label2); - mainwindow2->setVisible(true); - mainwindow2->activateWindow(); - qApp->processEvents(); - - QTRY_VERIFY(!mainwindow->isActiveWindow()); - QTRY_VERIFY(mainwindow2->isActiveWindow()); - - // Revert first mainwindow back to visible active - mainwindow->setVisible(true); - mainwindow->activateWindow(); - qApp->processEvents(); - - QTRY_VERIFY(mainwindow->isActiveWindow()); - QTRY_VERIFY(!mainwindow2->isActiveWindow()); -} - -void tst_QWidget::openModal_taskQTBUG_5804() -{ - class Widget : public QWidget - { - public: - Widget(QWidget *parent) : QWidget(parent) - { - } - ~Widget() - { - QMessageBox msgbox; - QTimer::singleShot(10, &msgbox, SLOT(accept())); - msgbox.exec(); //open a modal dialog - } - }; - - QWidget *win = new QWidget; - new Widget(win); - win->show(); - QTest::qWaitForWindowShown(win); - delete win; -} - -class InputContextTester : public QInputContext -{ - Q_OBJECT -public: - QString identifierName() { return QString(); } - bool isComposing() const { return false; } - QString language() { return QString(); } - void reset() { ++resets; } - int resets; -}; - -void tst_QWidget::focusProxyAndInputMethods() -{ - InputContextTester *inputContext = new InputContextTester; - QWidget *toplevel = new QWidget(0, Qt::X11BypassWindowManagerHint); - toplevel->setAttribute(Qt::WA_InputMethodEnabled, true); - qApp->setInputContext(inputContext); // ownership is transferred - - QWidget *child = new QWidget(toplevel); - child->setFocusProxy(toplevel); - child->setAttribute(Qt::WA_InputMethodEnabled, true); - - toplevel->setFocusPolicy(Qt::WheelFocus); - child->setFocusPolicy(Qt::WheelFocus); - - QVERIFY(!child->hasFocus()); - QVERIFY(!toplevel->hasFocus()); - - toplevel->show(); - QTest::qWaitForWindowShown(toplevel); - QApplication::setActiveWindow(toplevel); - QVERIFY(toplevel->hasFocus()); - QVERIFY(child->hasFocus()); - - // verify that toggling input methods on the child widget - // correctly propagate to the focus proxy's input method - // and that the input method gets the focus proxy passed - // as the focus widget instead of the child widget. - // otherwise input method queries go to the wrong widget - - QCOMPARE(inputContext->focusWidget(), toplevel); - - child->setAttribute(Qt::WA_InputMethodEnabled, false); - QVERIFY(!inputContext->focusWidget()); - - child->setAttribute(Qt::WA_InputMethodEnabled, true); - QCOMPARE(inputContext->focusWidget(), toplevel); - - child->setEnabled(false); - QVERIFY(!inputContext->focusWidget()); - - child->setEnabled(true); - QCOMPARE(inputContext->focusWidget(), toplevel); - - delete toplevel; -} - -#ifdef QT_BUILD_INTERNAL -class scrollWidgetWBS : public QWidget -{ -public: - void deleteBackingStore() - { - static_cast<QWidgetPrivate*>(d_ptr.data())->topData()->backingStoreTracker.destroy(); - } - void enableBackingStore() - { - if (!static_cast<QWidgetPrivate*>(d_ptr.data())->maybeBackingStore()) { - static_cast<QWidgetPrivate*>(d_ptr.data())->topData()->backingStoreTracker.create(this); - static_cast<QWidgetPrivate*>(d_ptr.data())->invalidateBuffer(this->rect()); - repaint(); - } - } -}; -#endif - -// Test case relies on developer build (AUTOTEST_EXPORT). -#ifdef QT_BUILD_INTERNAL -void tst_QWidget::scrollWithoutBackingStore() -{ - scrollWidgetWBS scrollable; - scrollable.resize(100,100); - QLabel child(QString("@"),&scrollable); - child.resize(50,50); - scrollable.show(); - QTest::qWaitForWindowShown(&scrollable); - scrollable.scroll(50,50); - QCOMPARE(child.pos(),QPoint(50,50)); - scrollable.deleteBackingStore(); - scrollable.scroll(-25,-25); - QCOMPARE(child.pos(),QPoint(25,25)); - scrollable.enableBackingStore(); - QCOMPARE(child.pos(),QPoint(25,25)); -} -#endif - -void tst_QWidget::taskQTBUG_7532_tabOrderWithFocusProxy() -{ - QWidget w; - w.setFocusPolicy(Qt::TabFocus); - QWidget *fp = new QWidget(&w); - fp->setFocusPolicy(Qt::TabFocus); - w.setFocusProxy(fp); - QWidget::setTabOrder(&w, fp); - - // In debug mode, no assertion failure means it's alright. -} - -void tst_QWidget::movedAndResizedAttributes() -{ -#if defined (Q_OS_MAC) || defined(Q_WS_QWS) - QEXPECT_FAIL("", "FixMe, QTBUG-8941 and QTBUG-8977", Abort); - QVERIFY(false); -#else - QWidget w; - w.show(); - - QVERIFY(!w.testAttribute(Qt::WA_Moved)); - QVERIFY(!w.testAttribute(Qt::WA_Resized)); - - w.setWindowState(Qt::WindowFullScreen); - - QVERIFY(!w.testAttribute(Qt::WA_Moved)); - QVERIFY(!w.testAttribute(Qt::WA_Resized)); - - w.setWindowState(Qt::WindowMaximized); - - QVERIFY(!w.testAttribute(Qt::WA_Moved)); - QVERIFY(!w.testAttribute(Qt::WA_Resized)); - - w.setWindowState(Qt::WindowMinimized); - - QVERIFY(!w.testAttribute(Qt::WA_Moved)); - QVERIFY(!w.testAttribute(Qt::WA_Resized)); - - w.showNormal(); - - QVERIFY(!w.testAttribute(Qt::WA_Moved)); - QVERIFY(!w.testAttribute(Qt::WA_Resized)); - - w.showMaximized(); - - QVERIFY(!w.testAttribute(Qt::WA_Moved)); - QVERIFY(!w.testAttribute(Qt::WA_Resized)); - - w.showFullScreen(); - - QVERIFY(!w.testAttribute(Qt::WA_Moved)); - QVERIFY(!w.testAttribute(Qt::WA_Resized)); - - w.showNormal(); - w.move(10,10); - QVERIFY(w.testAttribute(Qt::WA_Moved)); -#if defined(Q_OS_WIN) - QEXPECT_FAIL("", "FixMe, QTBUG-8911", Abort); -#endif - QVERIFY(!w.testAttribute(Qt::WA_Resized)); - - w.resize(100, 100); - QVERIFY(w.testAttribute(Qt::WA_Moved)); - QVERIFY(w.testAttribute(Qt::WA_Resized)); -#endif -} - -void tst_QWidget::childAt() -{ - QWidget parent(0, Qt::FramelessWindowHint); - parent.resize(200, 200); - - QWidget *child = new QWidget(&parent); - child->setPalette(Qt::red); - child->setAutoFillBackground(true); - child->setGeometry(20, 20, 160, 160); - - QWidget *grandChild = new QWidget(child); - grandChild->setPalette(Qt::blue); - grandChild->setAutoFillBackground(true); - grandChild->setGeometry(-20, -20, 220, 220); - - QVERIFY(!parent.childAt(19, 19)); - QVERIFY(!parent.childAt(180, 180)); - QCOMPARE(parent.childAt(20, 20), grandChild); - QCOMPARE(parent.childAt(179, 179), grandChild); - - grandChild->setAttribute(Qt::WA_TransparentForMouseEvents); - QCOMPARE(parent.childAt(20, 20), child); - QCOMPARE(parent.childAt(179, 179), child); - grandChild->setAttribute(Qt::WA_TransparentForMouseEvents, false); - - child->setMask(QRect(50, 50, 60, 60)); - - QVERIFY(!parent.childAt(69, 69)); - QVERIFY(!parent.childAt(130, 130)); - QCOMPARE(parent.childAt(70, 70), grandChild); - QCOMPARE(parent.childAt(129, 129), grandChild); - - child->setAttribute(Qt::WA_MouseNoMask); - QCOMPARE(parent.childAt(69, 69), grandChild); - QCOMPARE(parent.childAt(130, 130), grandChild); - child->setAttribute(Qt::WA_MouseNoMask, false); - - grandChild->setAttribute(Qt::WA_TransparentForMouseEvents); - QCOMPARE(parent.childAt(70, 70), child); - QCOMPARE(parent.childAt(129, 129), child); - grandChild->setAttribute(Qt::WA_TransparentForMouseEvents, false); - - grandChild->setMask(QRect(80, 80, 40, 40)); - - QCOMPARE(parent.childAt(79, 79), child); - QCOMPARE(parent.childAt(120, 120), child); - QCOMPARE(parent.childAt(80, 80), grandChild); - QCOMPARE(parent.childAt(119, 119), grandChild); - - grandChild->setAttribute(Qt::WA_MouseNoMask); - - QCOMPARE(parent.childAt(79, 79), grandChild); - QCOMPARE(parent.childAt(120, 120), grandChild); -} - -#ifdef Q_WS_MAC -void tst_QWidget::childAt_unifiedToolBar() -{ - QLabel *label = new QLabel(QLatin1String("foo")); - QToolBar *toolBar = new QToolBar; - toolBar->addWidget(new QLabel("dummy")); - toolBar->addWidget(label); - - QMainWindow mainWindow; - mainWindow.addToolBar(toolBar); - mainWindow.show(); - - // Calculate the top-left corner of the tool bar and the label (in mainWindow's coordinates). - QPoint labelTopLeft = label->mapTo(&mainWindow, QPoint()); - QPoint toolBarTopLeft = toolBar->mapTo(&mainWindow, QPoint()); - - QCOMPARE(mainWindow.childAt(toolBarTopLeft), static_cast<QWidget *>(toolBar)); - QCOMPARE(mainWindow.childAt(labelTopLeft), static_cast<QWidget *>(label)); - - // Enable unified tool bars. - mainWindow.setUnifiedTitleAndToolBarOnMac(true); - QTest::qWait(50); - - // The tool bar is now in the "non-client" area of QMainWindow, i.e. - // outside the mainWindow's rect(), and since mapTo et al. doesn't work - // in that case (see commit 35667fd45ada49269a5987c235fdedfc43e92bb8), - // we use mapToGlobal/mapFromGlobal to re-calculate the corners. - QPoint oldToolBarTopLeft = toolBarTopLeft; - toolBarTopLeft = mainWindow.mapFromGlobal(toolBar->mapToGlobal(QPoint())); - QVERIFY(toolBarTopLeft != oldToolBarTopLeft); - QVERIFY(toolBarTopLeft.y() < 0); - labelTopLeft = mainWindow.mapFromGlobal(label->mapToGlobal(QPoint())); - - QCOMPARE(mainWindow.childAt(toolBarTopLeft), static_cast<QWidget *>(toolBar)); - QCOMPARE(mainWindow.childAt(labelTopLeft), static_cast<QWidget *>(label)); -} - -void tst_QWidget::taskQTBUG_11373() -{ - QMainWindow * myWindow = new QMainWindow(); - QWidget * center = new QWidget(); - myWindow -> setCentralWidget(center); - QWidget * drawer = new QWidget(myWindow, Qt::Drawer); - drawer -> hide(); - QCOMPARE(drawer->isVisible(), false); - myWindow -> show(); - myWindow -> raise(); - // The drawer shouldn't be visible now. - QCOMPARE(drawer->isVisible(), false); - myWindow -> setWindowState(Qt::WindowFullScreen); - myWindow -> setWindowState(Qt::WindowNoState); - // The drawer should still not be visible, since we haven't shown it. - QCOMPARE(drawer->isVisible(), false); -} -#endif - -void tst_QWidget::taskQTBUG_17333_ResizeInfiniteRecursion() -{ - QTableView tb; - const char *s = "border: 1px solid;"; - tb.setStyleSheet(s); - tb.show(); - - QTest::qWaitForWindowShown(&tb); - tb.setGeometry(QRect(100, 100, 0, 100)); - // No crash, it works. -} - -void tst_QWidget::nativeChildFocus() -{ - QWidget w; - QLayout *layout = new QVBoxLayout; - w.setLayout(layout); - QLineEdit *p1 = new QLineEdit; - QLineEdit *p2 = new QLineEdit; - layout->addWidget(p1); - layout->addWidget(p2); -#if 1 - p1->setObjectName("p1"); - p2->setObjectName("p2"); -#endif - w.show(); -#if 1 - w.activateWindow(); - p1->setFocus(); - p1->setAttribute(Qt::WA_NativeWindow); - p2->setAttribute(Qt::WA_NativeWindow); - QApplication::processEvents(); - QTest::qWaitForWindowShown(&w); - QTest::qWait(10); - - qDebug() << "checking active window:" << QApplication::activeWindow(); - QCOMPARE(QApplication::activeWindow(), &w); - QCOMPARE(QApplication::focusWidget(), static_cast<QWidget*>(p1)); -#endif - - QTest::qWait(1000); -} - -QTEST_MAIN(tst_QWidget) -#include "tst_qwidget.moc" |