diff options
46 files changed, 381 insertions, 100 deletions
@@ -5068,6 +5068,11 @@ if [ "$CFG_TSLIB" != "no" ]; then fi fi +# Check we actually have X11 :-) +if compileTest x11/xlib "XLib"; then + QT_CONFIG="$QT_CONFIG xlib" +fi + if [ "$CFG_XCB" != "no" ]; then if [ -n "$PKG_CONFIG" ] && $PKG_CONFIG --exists "xcb >= 1.5" 2>/dev/null; then QMAKE_CFLAGS_XCB="`$PKG_CONFIG --cflags xcb 2>/dev/null`" @@ -5113,17 +5118,6 @@ if [ "$CFG_XCB" != "no" ]; then fi fi - # Check for X11. Eventually we should port everything to XCB, - # but for now the port is incomplete and Xlib is a requirement. - if compileTest x11/xlib "XLib"; then - QT_CONFIG="$QT_CONFIG xlib" - else - echo "The test for linking against Xlib failed!" - echo " You might need to install dependency packages." - echo " See src/plugins/platforms/xcb/README." - exit 1 - fi - if [ "$CFG_XCB_XLIB" != "no" ]; then if compileTest qpa/xcb-xlib "xcb-xlib" $QMAKE_CFLAGS_XCB $QMAKE_LIBS_XCB; then QT_CONFIG="$QT_CONFIG xcb-xlib" diff --git a/dist/changes-5.2.0 b/dist/changes-5.2.0 index a51cc91f98..4dd1604fcc 100644 --- a/dist/changes-5.2.0 +++ b/dist/changes-5.2.0 @@ -52,6 +52,29 @@ information about a particular change. zero delta() in order to indicate beginning and end of transient scrolling. + - Mac OS X framework builds of Qt no longer contain a Unix-like include/ + directory; all headers are located in the frameworks. This may affect + 3rd party build systems not based on qmake or cmake. + +**************************************************************************** +* Platform deprecation notice * +**************************************************************************** + + - The support for the old implementation of QAtomicInt and + QAtomicPointer is deprecated in Qt 5.2 and will be removed in Qt + 5.3. Building with the following compilers or environments will not + be possible in Qt 5.3 or the build will suffer greatly in + performance, unless support is revived by writing new atomics code. + * Green Hills compiler for INTEGRITY + * Sun Studio compiler suite for Solaris + * IBM Visual Age compiler suite for AIX + * Kernel-mode VxWorks + + Developers interested in picking up support should contact the + development mailing list at development@qt-project.org for more + information. Note that those platforms are currently not tested. Most + likely, they have further problems than just the atomics code. + **************************************************************************** * Library * **************************************************************************** @@ -700,3 +723,44 @@ X11 - [QTBUG-31762] Fix position of system tray icon (except Unity) - [QTBUG-27349] Reintroduced command line argument for positioning windows (-geometry) + +**************************************************************************** +* Tools * +**************************************************************************** + +- configure + + * Added option to disable the QtMultimedia WMF backend + * [Unix] Added option to build with gcov support + * Added -extprefix option to support Qt installing into a different + location than the on-device -prefix within the -sysroot. + * [QTBUG-33584][Unix] Fixed parsing of -device-option with equal signs. + +- cmake config files + + * [QTBUG-33145] Fixed usage of non-QtBase modules with Qt compiled from + source tarballs. + * [QTBUG-33223] Fixed header file location on multi-arch systems. + * Added support for automatic packaging of Qt plugins with cpack. + +- qmake + + * [QTBUG-491] Added saner approach to debug/release path rewriting. + * Added the parseJson() function. + * Added "osx" scope as an alias for "macx". Note that matching on the + makespec is generally deprecated - use "linux", "gcc", etc. + * Added support for .qmake.stash files which are really *just* caches. + * [Xcode] Added support for QMAKE_PRE_LINK and QMAKE_POST_LINK. + * [QTBUG-31129] Added installation of PDB files for dlltarget. + * [QTBUG-28102] Added support for querying disabled Qt features. + * Removed macx-clang-libc++* makespecs. libc++ is now handled automatically. + * [QTBUG-32912][MSVS] Fixed moc not being run in case of DBUS_ADAPTORS or + DBUS_INTERFACES being present. + * [QTBUG-30644] Fixed unsatisfied requires() breaking recursive targets. + * [QTBUG-31204] Fixed extra compilers not finding their inputs. + * [QTBUG-32885][MSVS] Made it possible to disable debug information. + * [QTBUG-33446][MSVS] Fixed generation of VS2010+ solution files. + * [QTBUG-32375][MSVS] Fixed output directory of nested projects. + * [QTBUG-34392][MSVS] Fixed /SAFESEH:NO with VS2010+. + * [QTBUG-34357][MSVS] Fixed breakage with multiple VS versions in PATH. + * [MSVS] Fixed sub-project dependency generation. diff --git a/mkspecs/features/qt_module.prf b/mkspecs/features/qt_module.prf index 5068f7028f..11509eeb40 100644 --- a/mkspecs/features/qt_module.prf +++ b/mkspecs/features/qt_module.prf @@ -131,30 +131,33 @@ android: CONFIG += qt_android_deps #install directives load(qt_installs) +!isEmpty(_QMAKE_SUPER_CACHE_): \ + rplbase = $$dirname(_QMAKE_SUPER_CACHE_)/[^/][^/]* +else: \ + rplbase = $$MODULE_BASE_OUTDIR +include_replace.match = $$rplbase/include +include_replace.replace = $$[QT_INSTALL_HEADERS/raw] +include_replace.CONFIG = path +lib_replace.match = $$rplbase/lib +host_build: \ + lib_replace.replace = $$[QT_HOST_LIBS] +else: \ + lib_replace.replace = $$[QT_INSTALL_LIBS/raw] +lib_replace.CONFIG = path +QMAKE_PRL_INSTALL_REPLACE += include_replace lib_replace + unix|win32-g++* { CONFIG += create_pc - host_build: \ - QMAKE_PKGCONFIG_LIBDIR = $$[QT_HOST_LIBS] - else: \ - QMAKE_PKGCONFIG_LIBDIR = $$[QT_INSTALL_LIBS/raw] - QMAKE_PKGCONFIG_INCDIR = $$[QT_INSTALL_HEADERS/raw] + QMAKE_PKGCONFIG_LIBDIR = $$lib_replace.replace + QMAKE_PKGCONFIG_INCDIR = $$include_replace.replace QMAKE_PKGCONFIG_CFLAGS = -I${includedir}/$$MODULE_INCNAME QMAKE_PKGCONFIG_DESTDIR = pkgconfig - !isEmpty(_QMAKE_SUPER_CACHE_): \ - rplbase = $$dirname(_QMAKE_SUPER_CACHE_)/[^/][^/]* - else: \ - rplbase = $$MODULE_BASE_OUTDIR - include_replace.match = $$rplbase/include - include_replace.replace = $$[QT_INSTALL_HEADERS/raw] - lib_replace.match = $$rplbase/lib - lib_replace.replace = $$QMAKE_PKGCONFIG_LIBDIR QMAKE_PKGCONFIG_INSTALL_REPLACE += include_replace lib_replace - QMAKE_PRL_INSTALL_REPLACE += include_replace lib_replace } unix { CONFIG += create_libtool explicitlib - QMAKE_LIBTOOL_LIBDIR = $$QMAKE_PKGCONFIG_LIBDIR + QMAKE_LIBTOOL_LIBDIR = $$lib_replace.replace QMAKE_LIBTOOL_INSTALL_REPLACE += include_replace lib_replace } diff --git a/mkspecs/macx-ios-clang/features/default_post.prf b/mkspecs/macx-ios-clang/features/default_post.prf index 8d46f35201..3428823624 100644 --- a/mkspecs/macx-ios-clang/features/default_post.prf +++ b/mkspecs/macx-ios-clang/features/default_post.prf @@ -192,6 +192,22 @@ macx-xcode { QMAKE_CXXFLAGS += -stdlib=libstdc++ QMAKE_LFLAGS += -stdlib=libstdc++ } + + # Make the default debug information format for debug builds + # DWARF instead of DWARF with dSYM. This cuts down build times + # for application debug builds significantly, as Xcode doesn't + # have to pull out all the DWARF info from our static libraries + # and put it into a dSYM file. We don't need that dSYM file in + # the first place, since the information is available in the + # object files inside the archives (static libraries). The only + # unfortunate side effect of this is that the user won't be + # able to break on specific lines of main(). This is due to + # using ld to rename the main-function, and will go away once + # we implement a separate tool to do the symbol renaming. + debug_information_format.name = DEBUG_INFORMATION_FORMAT + debug_information_format.value = dwarf + debug_information_format.build = debug + QMAKE_MAC_XCODE_SETTINGS += debug_information_format } macx-xcode { diff --git a/qmake/generators/mac/pbuilder_pbx.cpp b/qmake/generators/mac/pbuilder_pbx.cpp index 2674f31d03..fa4a844a5d 100644 --- a/qmake/generators/mac/pbuilder_pbx.cpp +++ b/qmake/generators/mac/pbuilder_pbx.cpp @@ -1140,7 +1140,7 @@ ProjectBuilderMakefileGenerator::writeMakeParts(QTextStream &t) //### } - project->values("QMAKE_PBX_PRESCRIPT_BUILDPHASES").append(phase_key); + project->values("QMAKE_PBX_BUILDPHASES").append(phase_key); t << "\t\t" << phase_key << " = {\n" << "\t\t\t" << writeSettings("name", "Copy '" + bundle_data[i] + "' Files to Bundle") << ";\n" << "\t\t\t" << writeSettings("buildActionMask", "2147483647", SettingsNoQuote) << ";\n" diff --git a/qmake/generators/makefile.cpp b/qmake/generators/makefile.cpp index 3dd63b4590..946a1ee986 100644 --- a/qmake/generators/makefile.cpp +++ b/qmake/generators/makefile.cpp @@ -3336,6 +3336,13 @@ MakefileGenerator::writePkgConfigFile() t << endl; } +static QString windowsifyPath(const QString &str) +{ + // The paths are escaped in prl files, so every slash needs to turn into two backslashes. + // Then each backslash needs to be escaped for sed. And another level for C quoting here. + return QString(str).replace('/', "\\\\\\\\"); +} + QString MakefileGenerator::installMetaFile(const ProKey &replace_rule, const QString &src, const QString &dst) { QString ret; @@ -3348,8 +3355,12 @@ QString MakefileGenerator::installMetaFile(const ProKey &replace_rule, const QSt for (int r = 0; r < replace_rules.size(); ++r) { const ProString match = project->first(ProKey(replace_rules.at(r) + ".match")), replace = project->first(ProKey(replace_rules.at(r) + ".replace")); - if (!match.isEmpty() /*&& match != replace*/) + if (!match.isEmpty() /*&& match != replace*/) { ret += " -e " + shellQuote("s," + match + "," + replace + ",g"); + if (isWindowsShell() && project->first(ProKey(replace_rules.at(r) + ".CONFIG")).contains("path")) + ret += " -e " + shellQuote("s," + windowsifyPath(match.toQString()) + + "," + windowsifyPath(replace.toQString()) + ",gi"); + } } ret += " \"" + src + "\" >\"" + dst + "\""; } diff --git a/qmake/main.cpp b/qmake/main.cpp index 79e3739f56..f5116ba752 100644 --- a/qmake/main.cpp +++ b/qmake/main.cpp @@ -85,6 +85,7 @@ static int doSed(int argc, char **argv) return 3; } QChar sep = ++j < cmd.length() ? cmd.at(j) : QChar(); + Qt::CaseSensitivity matchcase = Qt::CaseSensitive; bool escaped = false; int phase = 1; QStringList phases; @@ -126,12 +127,16 @@ static int doSed(int argc, char **argv) fprintf(stderr, "Error: sed s command requires three arguments (%d, %c, %s)\n", phase, sep.toLatin1(), qPrintable(curr)); return 3; } + if (curr.contains(QLatin1Char('i'))) { + curr.remove(QLatin1Char('i')); + matchcase = Qt::CaseInsensitive; + } if (curr != QLatin1String("g")) { - fprintf(stderr, "Error: sed s command must be used with the g option (only)\n"); + fprintf(stderr, "Error: sed s command supports only g & i options; g is required\n"); return 3; } SedSubst subst; - subst.from = QRegExp(phases.at(0)); + subst.from = QRegExp(phases.at(0), matchcase); subst.to = phases.at(1); subst.to.replace("\\\\", "\\"); // QString::replace(rx, sub) groks \1, but not \\. substs << subst; diff --git a/qtbase.pro b/qtbase.pro index 9091fba4e0..140a137099 100644 --- a/qtbase.pro +++ b/qtbase.pro @@ -181,7 +181,7 @@ mkspecs.path = $$[QT_HOST_DATA]/mkspecs mkspecs.files = \ $$OUT_PWD/mkspecs/qconfig.pri $$OUT_PWD/mkspecs/qmodule.pri $$OUT_PWD/mkspecs/qdevice.pri $$OUT_PWD/mkspecs/qfeatures.pri \ $$files($$PWD/mkspecs/*) -mkspecs.files -= $$PWD/mkspecs/modules +mkspecs.files -= $$PWD/mkspecs/modules $$PWD/mkspecs/modules-inst INSTALLS += mkspecs global_docs.files = $$PWD/doc/global diff --git a/src/android/java/res/values/libs.xml b/src/android/java/res/values/libs.xml index 231406d224..797e6bb8c4 100644 --- a/src/android/java/res/values/libs.xml +++ b/src/android/java/res/values/libs.xml @@ -1,7 +1,7 @@ <?xml version='1.0' encoding='utf-8'?> <resources> <array name="qt_sources"> - <item>https://download.qt-project.org/ministro/android/qt5/latest</item> + <item>https://download.qt-project.org/ministro/android/qt5/qt-5.2</item> </array> <!-- The following is handled automatically by the deployment tool. It should diff --git a/src/android/java/src/org/qtproject/qt5/android/bindings/QtActivity.java b/src/android/java/src/org/qtproject/qt5/android/bindings/QtActivity.java index 7c741edfda..a10e58bb87 100644 --- a/src/android/java/src/org/qtproject/qt5/android/bindings/QtActivity.java +++ b/src/android/java/src/org/qtproject/qt5/android/bindings/QtActivity.java @@ -150,7 +150,7 @@ public class QtActivity extends Activity private ActivityInfo m_activityInfo = null; // activity info object, used to access the libs and the strings private DexClassLoader m_classLoader = null; // loader object - private String[] m_sources = {"https://download.qt-project.org/ministro/android/qt5/latest"}; // Make sure you are using ONLY secure locations + private String[] m_sources = {"https://download.qt-project.org/ministro/android/qt5/qt-5.2"}; // Make sure you are using ONLY secure locations private String m_repository = "default"; // Overwrites the default Ministro repository // Possible values: // * default - Ministro default repository set with "Ministro configuration tool". diff --git a/src/concurrent/qtconcurrentmedian.h b/src/concurrent/qtconcurrentmedian.h index b39b3ed32b..ce2afb9c28 100644 --- a/src/concurrent/qtconcurrentmedian.h +++ b/src/concurrent/qtconcurrentmedian.h @@ -102,10 +102,19 @@ public: { if (dirty) { dirty = false; + +// This is a workaround for http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58800 +// Avoid using std::nth_element for stdlibc++ <= 4.7.3 || (>= 4.8.0 && <= 4.8.2) +#if defined(__GLIBCXX__) && (__GLIBCXX__ <= 20130411 || (__GLIBCXX__ >= 20130322 && __GLIBCXX__ <= 20131016)) + QVector<T> sorted = values; + std::sort(sorted.begin(), sorted.end()); + currentMedian = sorted.at(bufferSize / 2); +#else QVector<T> copy = values; typename QVector<T>::iterator begin = copy.begin(), mid = copy.begin() + bufferSize/2, end = copy.end(); std::nth_element(begin, mid, end); currentMedian = *mid; +#endif } return currentMedian; } diff --git a/src/corelib/global/qglobal.cpp b/src/corelib/global/qglobal.cpp index a648949d26..6644d6d101 100644 --- a/src/corelib/global/qglobal.cpp +++ b/src/corelib/global/qglobal.cpp @@ -556,10 +556,8 @@ Q_STATIC_ASSERT_X(UCHAR_MAX == 255, "Qt assumes that char is 8 bits"); \typedef qreal \relates <QtGlobal> - Typedef for \c double on all platforms except for those using CPUs with - ARM architectures. - On ARM-based platforms, \c qreal is a typedef for \c float for performance - reasons. + Typedef for \c double unless Qt is configured with the + \c{-qreal float} option. */ /*! \typedef uchar diff --git a/src/corelib/kernel/qjni.cpp b/src/corelib/kernel/qjni.cpp index 4e06d12aee..aaa75c0fb8 100644 --- a/src/corelib/kernel/qjni.cpp +++ b/src/corelib/kernel/qjni.cpp @@ -74,7 +74,8 @@ static jclass getCachedClass(JNIEnv *env, const char *className) if (!classLoader.isValid()) return 0; - QJNIObjectPrivate stringName = QJNIObjectPrivate::fromString(QLatin1String(className)); + QJNIObjectPrivate stringName = QJNIObjectPrivate::fromString(QString::fromLatin1(className).replace(QLatin1Char('/'), + QLatin1Char('.'))); QJNIObjectPrivate classObject = classLoader.callObjectMethod("loadClass", "(Ljava/lang/String;)Ljava/lang/Class;", stringName.object()); diff --git a/src/corelib/kernel/qobject.cpp b/src/corelib/kernel/qobject.cpp index 7d2410a18a..a65cf517ce 100644 --- a/src/corelib/kernel/qobject.cpp +++ b/src/corelib/kernel/qobject.cpp @@ -2996,6 +2996,10 @@ bool QObject::disconnect(const QObject *sender, const QMetaMethod &signal, expensive initialization only if something is connected to a signal. + \warning This function is called from the thread which performs the + connection, which may be a different thread from the thread in + which this object lives. + \sa connect(), disconnectNotify() */ @@ -3022,6 +3026,15 @@ void QObject::connectNotify(const QMetaMethod &signal) modularity. However, it might be useful for optimizing access to expensive resources. + \warning This function is called from the thread which performs the + disconnection, which may be a different thread from the thread in + which this object lives. This function may also be called with a QObject + internal mutex locked. It is therefore not allowed to re-enter any + of any QObject functions from your reimplementation and if you lock + a mutex in your reimplementation, make sure that you don't call QObject + functions with that mutex held in other places or it will result in + a deadlock. + \sa disconnect(), connectNotify() */ diff --git a/src/gui/text/qtextdocument.h b/src/gui/text/qtextdocument.h index a85e9c86c9..d8f52e9f98 100644 --- a/src/gui/text/qtextdocument.h +++ b/src/gui/text/qtextdocument.h @@ -71,6 +71,7 @@ class QTextCursor; template<typename T> class QVector; +#ifndef Q_QDOC // Workaround for QTBUG-35230 namespace Qt { Q_GUI_EXPORT bool mightBeRichText(const QString&); @@ -80,6 +81,7 @@ namespace Qt Q_GUI_EXPORT QTextCodec *codecForHtml(const QByteArray &ba); #endif } +#endif // Q_QDOC class Q_GUI_EXPORT QAbstractUndoItem { diff --git a/src/plugins/platforms/cocoa/qcocoaglcontext.mm b/src/plugins/platforms/cocoa/qcocoaglcontext.mm index 777d4a871b..8f74a71b1e 100644 --- a/src/plugins/platforms/cocoa/qcocoaglcontext.mm +++ b/src/plugins/platforms/cocoa/qcocoaglcontext.mm @@ -192,8 +192,6 @@ bool QCocoaGLContext::makeCurrent(QPlatformSurface *surface) QWindow *window = static_cast<QCocoaWindow *>(surface)->window(); setActiveWindow(window); - if (![m_context view]) - return false; [m_context makeCurrentContext]; update(); return true; diff --git a/src/plugins/platforms/cocoa/qcocoawindow.h b/src/plugins/platforms/cocoa/qcocoawindow.h index 4f5a208f43..c7ec315f04 100644 --- a/src/plugins/platforms/cocoa/qcocoawindow.h +++ b/src/plugins/platforms/cocoa/qcocoawindow.h @@ -159,8 +159,10 @@ public: void registerTouch(bool enable); qreal devicePixelRatio() const; + bool isWindowExposable(); void exposeWindow(); void obscureWindow(); + void updateExposedGeometry(); QWindow *childWindowAt(QPoint windowPoint); protected: // NSWindow handling. The QCocoaWindow/QNSView can either be displayed @@ -202,7 +204,9 @@ public: // for QNSView bool m_hasModalSession; bool m_frameStrutEventsEnabled; + bool m_geometryUpdateExposeAllowed; bool m_isExposed; + QRect m_exposedGeometry; int m_registerTouchCount; bool m_resizableTransientParent; bool m_overrideBecomeKey; diff --git a/src/plugins/platforms/cocoa/qcocoawindow.mm b/src/plugins/platforms/cocoa/qcocoawindow.mm index 1aace958ed..a2ef43db67 100644 --- a/src/plugins/platforms/cocoa/qcocoawindow.mm +++ b/src/plugins/platforms/cocoa/qcocoawindow.mm @@ -213,6 +213,7 @@ QCocoaWindow::QCocoaWindow(QWindow *tlw) , m_windowCursor(0) , m_hasModalSession(false) , m_frameStrutEventsEnabled(false) + , m_geometryUpdateExposeAllowed(false) , m_isExposed(false) , m_registerTouchCount(0) , m_resizableTransientParent(false) @@ -1084,22 +1085,61 @@ qreal QCocoaWindow::devicePixelRatio() const } } +// Returns whether the window can be expose, which it can +// if it is on screen and has a valid geometry. +bool QCocoaWindow::isWindowExposable() +{ + QSize size = geometry().size(); + bool validGeometry = (size.width() > 0 && size.height() > 0); + bool validScreen = ([[m_contentView window] screen] != 0); + bool nonHiddenSuperView = ![[m_contentView superview] isHidden]; + return (validGeometry && validScreen && nonHiddenSuperView); +} + +// Exposes the window by posting an expose event to QWindowSystemInterface void QCocoaWindow::exposeWindow() { - if (!m_isExposed && ![[m_contentView superview] isHidden]) { + m_geometryUpdateExposeAllowed = true; + + if (!isWindowExposable()) + return; + + if (!m_isExposed) { m_isExposed = true; + m_exposedGeometry = geometry(); QWindowSystemInterface::handleExposeEvent(window(), QRegion(geometry())); } } +// Obscures the window by posting an empty expose event to QWindowSystemInterface void QCocoaWindow::obscureWindow() { if (m_isExposed) { + m_geometryUpdateExposeAllowed = false; m_isExposed = false; QWindowSystemInterface::handleExposeEvent(window(), QRegion()); } } +// Updates window geometry by posting an expose event to QWindowSystemInterface +void QCocoaWindow::updateExposedGeometry() +{ + // updateExposedGeometry is not allowed to send the initial expose. If you want + // that call exposeWindow(); + if (!m_geometryUpdateExposeAllowed) + return; + + if (!isWindowExposable()) + return; + + if (m_exposedGeometry == geometry()) + return; + + m_isExposed = true; + m_exposedGeometry = geometry(); + QWindowSystemInterface::handleExposeEvent(window(), QRegion(geometry())); +} + QWindow *QCocoaWindow::childWindowAt(QPoint windowPoint) { QWindow *targetWindow = window(); diff --git a/src/plugins/platforms/cocoa/qnsview.h b/src/plugins/platforms/cocoa/qnsview.h index ca2a15a1cc..403f8dc78a 100644 --- a/src/plugins/platforms/cocoa/qnsview.h +++ b/src/plugins/platforms/cocoa/qnsview.h @@ -93,6 +93,8 @@ QT_END_NAMESPACE - (BOOL)hasMask; - (BOOL)isOpaque; +- (void)convertFromScreen:(NSPoint)mouseLocation toWindowPoint:(QPointF *)qtWindowPoint andScreenPoint:(QPointF *)qtScreenPoint; + - (void)resetMouseButtons; - (void)handleMouseEvent:(NSEvent *)theEvent; diff --git a/src/plugins/platforms/cocoa/qnsview.mm b/src/plugins/platforms/cocoa/qnsview.mm index 71c4de3b69..1c15c3b561 100644 --- a/src/plugins/platforms/cocoa/qnsview.mm +++ b/src/plugins/platforms/cocoa/qnsview.mm @@ -175,7 +175,7 @@ static QTouchDevice *touchDevice = 0; - (void) globalFrameChanged:(NSNotification*)notification { Q_UNUSED(notification); - QWindowSystemInterface::handleExposeEvent(m_window, m_window->geometry()); + m_platformWindow->updateExposedGeometry(); } - (void)viewDidMoveToSuperview @@ -186,7 +186,7 @@ static QTouchDevice *touchDevice = 0; if ([self superview]) { m_platformWindow->m_contentViewIsEmbedded = true; QWindowSystemInterface::handleGeometryChange(m_window, m_platformWindow->geometry()); - QWindowSystemInterface::handleExposeEvent(m_window, m_platformWindow->geometry()); + m_platformWindow->updateExposedGeometry(); QWindowSystemInterface::flushWindowSystemEvents(); } else { m_platformWindow->m_contentViewIsEmbedded = false; @@ -261,7 +261,7 @@ static QTouchDevice *touchDevice = 0; // Send a geometry change event to Qt, if it's ready to handle events if (!m_platformWindow->m_inConstructor) { QWindowSystemInterface::handleGeometryChange(m_window, geometry); - QWindowSystemInterface::handleExposeEvent(m_window, geometry); + m_platformWindow->updateExposedGeometry(); QWindowSystemInterface::flushWindowSystemEvents(); } } diff --git a/src/plugins/platforms/cocoa/qnswindowdelegate.h b/src/plugins/platforms/cocoa/qnswindowdelegate.h index 06e11fffbb..5717551cc3 100644 --- a/src/plugins/platforms/cocoa/qnswindowdelegate.h +++ b/src/plugins/platforms/cocoa/qnswindowdelegate.h @@ -53,6 +53,7 @@ - (id)initWithQCocoaWindow: (QCocoaWindow *) cocoaWindow; +- (void)windowDidBecomeKey:(NSNotification *)notification; - (void)windowDidResize:(NSNotification *)notification; - (void)windowDidMove:(NSNotification *)notification; - (void)windowWillMove:(NSNotification *)notification; diff --git a/src/plugins/platforms/cocoa/qnswindowdelegate.mm b/src/plugins/platforms/cocoa/qnswindowdelegate.mm index 10536bd5f4..c9b3d69381 100644 --- a/src/plugins/platforms/cocoa/qnswindowdelegate.mm +++ b/src/plugins/platforms/cocoa/qnswindowdelegate.mm @@ -56,6 +56,17 @@ return self; } +- (void)windowDidBecomeKey:(NSNotification *)notification +{ + Q_UNUSED(notification); + if (m_cocoaWindow->m_windowUnderMouse) { + QPointF windowPoint; + QPointF screenPoint; + [m_cocoaWindow->m_qtView convertFromScreen:[NSEvent mouseLocation] toWindowPoint:&windowPoint andScreenPoint:&screenPoint]; + QWindowSystemInterface::handleEnterEvent(m_cocoaWindow->m_enterLeaveTargetWindow, windowPoint, screenPoint); + } +} + - (void)windowDidResize:(NSNotification *)notification { Q_UNUSED(notification); diff --git a/src/plugins/platforms/ios/qioseventdispatcher.mm b/src/plugins/platforms/ios/qioseventdispatcher.mm index 51eb10d385..f93c6cc3a7 100644 --- a/src/plugins/platforms/ios/qioseventdispatcher.mm +++ b/src/plugins/platforms/ios/qioseventdispatcher.mm @@ -206,13 +206,6 @@ namespace bool debugStackUsage = false; } -static int infoPlistValue(NSString* key, int defaultValue) -{ - static NSBundle *bundle = [NSBundle mainBundle]; - NSNumber* value = [bundle objectForInfoDictionaryKey:key]; - return value ? [value intValue] : defaultValue; -} - extern "C" int __attribute__((weak)) main(int argc, char *argv[]) { @autoreleasepool { diff --git a/src/plugins/platforms/ios/qiosglobal.h b/src/plugins/platforms/ios/qiosglobal.h index 1c76d29389..17184dc21d 100644 --- a/src/plugins/platforms/ios/qiosglobal.h +++ b/src/plugins/platforms/ios/qiosglobal.h @@ -61,6 +61,7 @@ QPointF fromCGPoint(const CGPoint &point); Qt::ScreenOrientation toQtScreenOrientation(UIDeviceOrientation uiDeviceOrientation); UIDeviceOrientation fromQtScreenOrientation(Qt::ScreenOrientation qtOrientation); QRect fromPortraitToPrimary(const QRect &rect, QPlatformScreen *screen); +int infoPlistValue(NSString* key, int defaultValue); QT_END_NAMESPACE diff --git a/src/plugins/platforms/ios/qiosglobal.mm b/src/plugins/platforms/ios/qiosglobal.mm index d749b8f514..8dd690f301 100644 --- a/src/plugins/platforms/ios/qiosglobal.mm +++ b/src/plugins/platforms/ios/qiosglobal.mm @@ -134,5 +134,12 @@ QRect fromPortraitToPrimary(const QRect &rect, QPlatformScreen *screen) : QRect(rect.y(), geometry.height() - rect.width() - rect.x(), rect.height(), rect.width()); } +int infoPlistValue(NSString* key, int defaultValue) +{ + static NSBundle *bundle = [NSBundle mainBundle]; + NSNumber* value = [bundle objectForInfoDictionaryKey:key]; + return value ? [value intValue] : defaultValue; +} + QT_END_NAMESPACE diff --git a/src/plugins/platforms/ios/qiosinputcontext.mm b/src/plugins/platforms/ios/qiosinputcontext.mm index 0e43429015..ea6a0bd4a6 100644 --- a/src/plugins/platforms/ios/qiosinputcontext.mm +++ b/src/plugins/platforms/ios/qiosinputcontext.mm @@ -270,7 +270,7 @@ void QIOSInputContext::scrollRootView() && m_keyboardListener->m_keyboardVisibleAndDocked && m_focusView.window == view.window) { QRectF cursorRect = qGuiApp->inputMethod()->cursorRectangle(); - cursorRect.translate(qGuiApp->focusWindow()->geometry().topLeft()); + cursorRect.translate(m_focusView.qwindow->geometry().topLeft()); qreal keyboardY = m_keyboardListener->m_keyboardEndRect.y(); int statusBarY = qGuiApp->primaryScreen()->availableGeometry().y(); const int margin = 20; diff --git a/src/plugins/platforms/ios/qiosintegration.h b/src/plugins/platforms/ios/qiosintegration.h index c655d8d3bf..fdecf70725 100644 --- a/src/plugins/platforms/ios/qiosintegration.h +++ b/src/plugins/platforms/ios/qiosintegration.h @@ -74,6 +74,8 @@ public: QStringList themeNames() const; QPlatformTheme *createPlatformTheme(const QString &name) const; + QPlatformDrag *drag() const Q_DECL_OVERRIDE { return 0; } + QAbstractEventDispatcher *createEventDispatcher() const; QPlatformNativeInterface *nativeInterface() const; diff --git a/src/plugins/platforms/ios/qiosviewcontroller.mm b/src/plugins/platforms/ios/qiosviewcontroller.mm index 2e7e44d32c..0a6a00b753 100644 --- a/src/plugins/platforms/ios/qiosviewcontroller.mm +++ b/src/plugins/platforms/ios/qiosviewcontroller.mm @@ -101,12 +101,15 @@ - (BOOL)prefersStatusBarHidden { + static bool hiddenFromPlist = infoPlistValue(@"UIStatusBarHidden", false); + if (hiddenFromPlist) + return YES; QWindow *focusWindow = QGuiApplication::focusWindow(); - if (!focusWindow) + if (!focusWindow || !focusWindow->handle()) return [UIApplication sharedApplication].statusBarHidden; - QIOSWindow *topLevel = static_cast<QIOSWindow *>(focusWindow->handle())->topLevelWindow(); - return topLevel->window()->windowState() == Qt::WindowFullScreen; + QWindow *topLevel = static_cast<QIOSWindow *>(focusWindow->handle())->topLevelWindow(); + return topLevel->windowState() == Qt::WindowFullScreen; } @end diff --git a/src/plugins/platforms/ios/qioswindow.h b/src/plugins/platforms/ios/qioswindow.h index d36a81180c..8a5eb589d2 100644 --- a/src/plugins/platforms/ios/qioswindow.h +++ b/src/plugins/platforms/ios/qioswindow.h @@ -87,7 +87,7 @@ public: WId winId() const { return WId(m_view); }; - QIOSWindow *topLevelWindow() const; + QWindow *topLevelWindow() const; private: void applyGeometry(const QRect &rect); diff --git a/src/plugins/platforms/ios/qioswindow.mm b/src/plugins/platforms/ios/qioswindow.mm index 7ab136e8b9..1acd9ee354 100644 --- a/src/plugins/platforms/ios/qioswindow.mm +++ b/src/plugins/platforms/ios/qioswindow.mm @@ -108,8 +108,6 @@ [NSNumber numberWithBool:YES], kEAGLDrawablePropertyRetainedBacking, kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat, nil]; - [self updateTextInputTraits]; - if (isQtApplication()) self.hidden = YES; @@ -330,13 +328,9 @@ - (BOOL)becomeFirstResponder { - // On iOS, a QWindow should only have input focus when the input panel is - // open. This is to stop cursors and focus rects from being drawn when the - // user cannot type. And since the keyboard will open when a view becomes - // the first responder, it's now a good time to inform QPA that the QWindow - // this view backs became active: + // Note: QIOSInputContext controls our first responder status based on + // whether or not the keyboard should be open or closed. [self updateTextInputTraits]; - QWindowSystemInterface::handleWindowActivated(m_qioswindow->window()); return [super becomeFirstResponder]; } @@ -345,7 +339,8 @@ // Resigning first responed status means that the virtual keyboard was closed, or // some other view became first responder. In either case we clear the focus object to // avoid blinking cursors in line edits etc: - static_cast<QWindowPrivate *>(QObjectPrivate::get(m_qioswindow->window()))->clearFocusObject(); + if (m_qioswindow) + static_cast<QWindowPrivate *>(QObjectPrivate::get(m_qioswindow->window()))->clearFocusObject(); return [super resignFirstResponder]; } @@ -427,8 +422,10 @@ - (QWindow *)qwindow { - if ([self isKindOfClass:[QUIView class]]) - return static_cast<QUIView *>(self)->m_qioswindow->window(); + if ([self isKindOfClass:[QUIView class]]) { + if (QIOSWindow *w = static_cast<QUIView *>(self)->m_qioswindow) + return w->window(); + } return nil; } @@ -473,6 +470,7 @@ QIOSWindow::~QIOSWindow() // cancellation of all touch events. [m_view touchesCancelled:0 withEvent:0]; + m_view->m_qioswindow = 0; [m_view removeFromSuperview]; [m_view release]; } @@ -637,7 +635,7 @@ void QIOSWindow::setParent(const QPlatformWindow *parentWindow) } } -QIOSWindow *QIOSWindow::topLevelWindow() const +QWindow *QIOSWindow::topLevelWindow() const { QWindow *window = this->window(); while (window) { @@ -651,7 +649,7 @@ QIOSWindow *QIOSWindow::topLevelWindow() const window = parent; } - return static_cast<QIOSWindow *>(window->handle()); + return window; } void QIOSWindow::requestActivateWindow() diff --git a/src/tools/qdoc/generator.cpp b/src/tools/qdoc/generator.cpp index 97a980a3fa..3cbba788c8 100644 --- a/src/tools/qdoc/generator.cpp +++ b/src/tools/qdoc/generator.cpp @@ -334,14 +334,14 @@ QString Generator::fileBase(const Node *node) const if (node->isQmlNode()) { if (!node->qmlModuleName().isEmpty()) { base.prepend(node->qmlModuleName() + QLatin1Char('-')); - /* - To avoid file name conflicts in the html directory, - we prepend a prefix (by default, "qml-") to the file name of QML - element doc files. - */ - if ((node->subType() == Node::QmlClass) || (node->subType() == Node::QmlBasicType)) { - base.prepend(outputPrefix(QLatin1String("QML"))); - } + } + /* + To avoid file name conflicts in the html directory, + we prepend a prefix (by default, "qml-") to the file name of QML + element doc files. + */ + if ((node->subType() == Node::QmlClass) || (node->subType() == Node::QmlBasicType)) { + base.prepend(outputPrefix(QLatin1String("QML"))); } } else if (node->subType() == Node::QmlModule) { diff --git a/src/tools/qdoc/htmlgenerator.cpp b/src/tools/qdoc/htmlgenerator.cpp index 986b4ae261..511dc3240f 100644 --- a/src/tools/qdoc/htmlgenerator.cpp +++ b/src/tools/qdoc/htmlgenerator.cpp @@ -269,6 +269,9 @@ QString HtmlGenerator::format() void HtmlGenerator::generateTree() { qdb_->buildCollections(); + Node* qflags = qdb_->findNodeByNameAndType(QStringList("QFlags"), Node::Class, Node::NoSubType); + if (qflags) + qflagsHref_ = linkForNode(qflags,0); if (!runPrepareOnly()) { Generator::generateTree(); generateCollisionPages(); @@ -3660,7 +3663,7 @@ void HtmlGenerator::generateDetailedMember(const Node *node, if (enume->flagsType()) { out() << "<p>The " << protectEnc(enume->flagsType()->name()) << " type is a typedef for " - << "<a href=\"qflags.html\">QFlags</a><" + << "<a href=\"" << qflagsHref_ << "\">QFlags</a><" << protectEnc(enume->name()) << ">. It stores an OR combination of " << protectEnc(enume->name()) diff --git a/src/tools/qdoc/htmlgenerator.h b/src/tools/qdoc/htmlgenerator.h index f2525327e8..ae16f3c54f 100644 --- a/src/tools/qdoc/htmlgenerator.h +++ b/src/tools/qdoc/htmlgenerator.h @@ -262,6 +262,7 @@ private: QString cppclassespage; QString qmltypespage; QString buildversion; + QString qflagsHref_; public: static bool debugging_on; diff --git a/src/widgets/graphicsview/qgraphicsitem.cpp b/src/widgets/graphicsview/qgraphicsitem.cpp index 04047d8d0a..2d07e545c8 100644 --- a/src/widgets/graphicsview/qgraphicsitem.cpp +++ b/src/widgets/graphicsview/qgraphicsitem.cpp @@ -7634,7 +7634,10 @@ QGraphicsObject::~QGraphicsObject() bool QGraphicsObject::event(QEvent *ev) { if (ev->type() == QEvent::StyleAnimationUpdate) { - update(); + if (isVisible()) { + ev->accept(); + update(); + } return true; } return QObject::event(ev); diff --git a/src/widgets/graphicsview/qgraphicswidget.cpp b/src/widgets/graphicsview/qgraphicswidget.cpp index 4abb5e39e5..ccc51120a9 100644 --- a/src/widgets/graphicsview/qgraphicswidget.cpp +++ b/src/widgets/graphicsview/qgraphicswidget.cpp @@ -1409,9 +1409,14 @@ bool QGraphicsWidget::event(QEvent *event) break; case QEvent::WindowActivate: case QEvent::WindowDeactivate: - case QEvent::StyleAnimationUpdate: update(); break; + case QEvent::StyleAnimationUpdate: + if (isVisible()) { + event->accept(); + update(); + } + break; // Taken from QWidget::event case QEvent::ActivationChange: case QEvent::EnabledChange: diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp index c646255ddb..08e8975f9d 100644 --- a/src/widgets/kernel/qwidget.cpp +++ b/src/widgets/kernel/qwidget.cpp @@ -8249,7 +8249,10 @@ bool QWidget::event(QEvent *event) update(static_cast<QUpdateLaterEvent*>(event)->region()); break; case QEvent::StyleAnimationUpdate: - update(); + if (isVisible() && !window()->isMinimized()) { + event->accept(); + update(); + } break; case QEvent::WindowBlocked: diff --git a/src/widgets/styles/qstyle.cpp b/src/widgets/styles/qstyle.cpp index 77f869f036..da9b5da2a5 100644 --- a/src/widgets/styles/qstyle.cpp +++ b/src/widgets/styles/qstyle.cpp @@ -619,7 +619,7 @@ void QStyle::drawItemText(QPainter *painter, const QRect &rect, int alignment, c void QStyle::drawItemPixmap(QPainter *painter, const QRect &rect, int alignment, const QPixmap &pixmap) const { - int scale = pixmap.devicePixelRatio(); + qreal scale = pixmap.devicePixelRatio(); QRect aligned = alignedRect(QApplication::layoutDirection(), QFlag(alignment), pixmap.size() / scale, rect); QRect inter = aligned.intersected(rect); diff --git a/src/widgets/styles/qstyleanimation.cpp b/src/widgets/styles/qstyleanimation.cpp index 4fb67d90c0..90fb371982 100644 --- a/src/widgets/styles/qstyleanimation.cpp +++ b/src/widgets/styles/qstyleanimation.cpp @@ -93,7 +93,10 @@ void QStyleAnimation::setStartTime(const QTime &time) void QStyleAnimation::updateTarget() { QEvent event(QEvent::StyleAnimationUpdate); + event.setAccepted(false); QCoreApplication::sendEvent(target(), &event); + if (!event.isAccepted()) + stop(); } bool QStyleAnimation::isUpdateNeeded() const @@ -103,16 +106,8 @@ bool QStyleAnimation::isUpdateNeeded() const void QStyleAnimation::updateCurrentTime(int) { - if (QObject *tgt = target()) { - if (tgt->isWidgetType()) { - QWidget *widget = static_cast<QWidget *>(tgt); - if (!widget->isVisible() || widget->window()->isMinimized()) - stop(); - } - - if (isUpdateNeeded()) - updateTarget(); - } + if (target() && isUpdateNeeded()) + updateTarget(); } QProgressStyleAnimation::QProgressStyleAnimation(int speed, QObject *target) : diff --git a/src/widgets/widgets/qcombobox.cpp b/src/widgets/widgets/qcombobox.cpp index 37a14d3eb3..2c09f5a8f1 100644 --- a/src/widgets/widgets/qcombobox.cpp +++ b/src/widgets/widgets/qcombobox.cpp @@ -3073,7 +3073,7 @@ void QComboBox::wheelEvent(QWheelEvent *e) newIndex--; while ((newIndex >= 0) && !(d->model->flags(d->model->index(newIndex,d->modelColumn,d->root)) & Qt::ItemIsEnabled)) newIndex--; - } else { + } else if (e->delta() < 0) { newIndex++; while ((newIndex < count()) && !(d->model->flags(d->model->index(newIndex,d->modelColumn,d->root)) & Qt::ItemIsEnabled)) newIndex++; diff --git a/src/winmain/winmain.pro b/src/winmain/winmain.pro index 4303c3bc12..b0771caa55 100644 --- a/src/winmain/winmain.pro +++ b/src/winmain/winmain.pro @@ -31,8 +31,7 @@ load(qt_targets) wince*:QMAKE_POST_LINK = -unix|win32-g++* { - lib_replace.match = $$[QT_INSTALL_LIBS/get] - lib_replace.replace = $$[QT_INSTALL_LIBS/raw] - QMAKE_PRL_INSTALL_REPLACE += lib_replace -} +lib_replace.match = $$[QT_INSTALL_LIBS/get] +lib_replace.replace = $$[QT_INSTALL_LIBS/raw] +lib_replace.CONFIG = path +QMAKE_PRL_INSTALL_REPLACE += lib_replace diff --git a/tests/auto/concurrent/concurrent.pro b/tests/auto/concurrent/concurrent.pro index 20bad24fc1..e67c51aae3 100644 --- a/tests/auto/concurrent/concurrent.pro +++ b/tests/auto/concurrent/concurrent.pro @@ -3,6 +3,7 @@ SUBDIRS=\ qtconcurrentfilter \ qtconcurrentiteratekernel \ qtconcurrentmap \ + qtconcurrentmedian \ qtconcurrentrun \ qtconcurrentthreadengine diff --git a/tests/auto/concurrent/qtconcurrentmedian/qtconcurrentmedian.pro b/tests/auto/concurrent/qtconcurrentmedian/qtconcurrentmedian.pro new file mode 100644 index 0000000000..1eb27d825a --- /dev/null +++ b/tests/auto/concurrent/qtconcurrentmedian/qtconcurrentmedian.pro @@ -0,0 +1,5 @@ +CONFIG += testcase parallel_test +TARGET = tst_qtconcurrentmedian +QT = core testlib concurrent +SOURCES = tst_qtconcurrentmedian.cpp +DEFINES += QT_STRICT_ITERATORS diff --git a/tests/auto/concurrent/qtconcurrentmedian/tst_qtconcurrentmedian.cpp b/tests/auto/concurrent/qtconcurrentmedian/tst_qtconcurrentmedian.cpp new file mode 100644 index 0000000000..c9fbc790bd --- /dev/null +++ b/tests/auto/concurrent/qtconcurrentmedian/tst_qtconcurrentmedian.cpp @@ -0,0 +1,87 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, 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, Digia gives you certain additional +** rights. These rights are described in the Digia 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. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include <qtconcurrentmedian.h> + +#include <QtTest/QtTest> + +class tst_QtConcurrentMedian: public QObject +{ + Q_OBJECT +private slots: + void median_data(); + void median(); +}; + +void tst_QtConcurrentMedian::median_data() +{ + QTest::addColumn<QList<int> >("values"); + QTest::addColumn<int>("expectedMedian"); + + QTest::newRow("size=1") + << (QList<int>() << 1) + << 1; + + QTest::newRow("size=2") + << (QList<int>() << 3 << 2) + << 3; + + QTest::newRow("size=3") + << (QList<int>() << 3 << 1 << 2) + << 2; + + QTest::newRow("gcc bug 58800 (nth_element)") + << (QList<int>() << 207089 << 202585 << 180067 << 157549 << 211592 << 216096 << 207089) + << 207089; +} + +void tst_QtConcurrentMedian::median() +{ + QFETCH(QList<int> , values); + QFETCH(int, expectedMedian); + + QtConcurrent::Median<int> m(values.size()); + foreach (int value, values) + m.addValue(value); + QCOMPARE(m.median(), expectedMedian); +} + +QTEST_MAIN(tst_QtConcurrentMedian) +#include "tst_qtconcurrentmedian.moc" diff --git a/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp b/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp index 6c26ddb293..fc1d0e34cb 100644 --- a/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp +++ b/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp @@ -4221,6 +4221,7 @@ void tst_QGraphicsItem::cursor() QCursor cursor = view.viewport()->cursor(); { + QTest::mouseMove(view.viewport(), QPoint(100, 50)); QMouseEvent event(QEvent::MouseMove, QPoint(100, 50), Qt::NoButton, 0, 0); QApplication::sendEvent(view.viewport(), &event); } diff --git a/tests/auto/widgets/itemviews/qcolumnview/tst_qcolumnview.cpp b/tests/auto/widgets/itemviews/qcolumnview/tst_qcolumnview.cpp index 6c04e5b39a..e2b2fb9551 100644 --- a/tests/auto/widgets/itemviews/qcolumnview/tst_qcolumnview.cpp +++ b/tests/auto/widgets/itemviews/qcolumnview/tst_qcolumnview.cpp @@ -1043,13 +1043,14 @@ void tst_QColumnView::dynamicModelChanges() ColumnView view; view.setModel(&model); view.setItemDelegate(&delegate); + centerOnScreen(&view); view.show(); QStandardItem *item = new QStandardItem(QLatin1String("item")); model.appendRow(item); - QTest::qWait(200); //let the time for painting to occur - QCOMPARE(delegate.paintedIndexes.count(), 1); + QVERIFY(QTest::qWaitForWindowExposed(&view)); //let the time for painting to occur + QTRY_COMPARE(delegate.paintedIndexes.count(), 1); QCOMPARE(*delegate.paintedIndexes.begin(), model.index(0,0)); diff --git a/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp b/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp index 81ed983d0f..9e181c0676 100644 --- a/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp +++ b/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp @@ -598,6 +598,7 @@ void tst_QMenu::layoutDirection() centerOnScreen(&win); QMenu menu(&win); + menu.addAction("foo"); menu.move(win.geometry().topRight() + QPoint(50, 0)); menu.show(); QVERIFY(QTest::qWaitForWindowExposed(&menu)); |