Qt 5.2 introduces many new features and improvements as well as bugfixes
over the 5.1.x series. For more details, refer to the online documentation
included in this distribution. The documentation is also available online:

  http://qt-project.org/doc/qt-5.2

The Qt version 5.2 series is binary compatible with the 5.1.x series.
Applications compiled for 5.1 will continue to run with 5.2.

Some of the changes listed in this file include issue tracking numbers
corresponding to tasks in the Qt Bug Tracker:

  http://bugreports.qt-project.org/

Each of these identifiers can be entered in the bug tracker to obtain more
information about a particular change.

****************************************************************************
*                   Important Behavior Changes                             *
****************************************************************************

 - Qt is now compiled with qreal typedef'ed to double on all
   platforms. qreal was a float on ARM chipsets before. This guarantees more
   consistent behavior between all platforms Qt supports, but is binary
   incompatible to Qt 5.1 on ARM. The old behavior can be restored by
   passing -qreal float to configure.
 - The supported date range in QDateTime has been reduced to about +/- 292
   million years, the range supported by the number of msecs since the Unix
   epoch of 1 Jan 1970 as stored in a qint64, and as able to be used in the
   setMSecsSinceEpoch() and toMSecsSinceEpoch() methods.

 - QUrl and QUrlQuery:
   * [QTBUG-31660] QUrl no longer considers all delimiter characters
     equivalent to their percent-encoded forms. Now, both classes always
     keep all delimiters exactly as they were in the original URL text.
   * [QTBUG-31660] QUrl no longer decodes %7B and %7D to "{" and "}" in the
     output of toString()
   * QUrl no longer supports QUrl::FullyDecoded mode in authority() and
     userInfo(), nor QUrl::DecodedMode in setAuthority() and setUserInfo().
   * [QTBUG-31945] QUrl no longer decodes %23 found in the fragment to "#"
     in the output of toString(QUrl::FullyEncoded) or toEncoded()
   * QUrl now defaults to decoded mode in the getters and setters for
     userName, password, host, topLevelDomain, path and fileName. This
     means a '%' in one of those fields is now returned (or set) as '%'
     rather than "%25". In the unlikely case where the former behavior was
     expected, pass PrettyDecoded to the getter and TolerantMode to the
     setter.
   * QUrl now normalizes the path given in setPath, removing ./ and ../ and
     duplicate slashes.

 - QWheelEvent has gained a "phase" attribute and may now be sent with
   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                                         *
****************************************************************************

QtCore
------

 - Added QCollator, a class to collate Unicode strings.
 - Added QCommandLineParser, a class to parse command lines.
 - Added QFileSelector, a class to select platform-specific file assets.
 - Added QLoggingCategory and related functions for logging
 - [QTBUG-23946] Fixed a bug that prevented Qt from being built in a
   namespace on Mac OS X.
 - Updated the locale database to CLDR 23.1
 - Added support for ARMv8 64-bit mode.

 - Metatype system (QMetaType & QVariant):
   * Qt now handles metatypes automatically for std::vector, std::list,
     std::pair and std::map
   * The metatype system now supports registering explicit conversion
     functions via QMetaType::registerConverter
   * The metatype system now supports iteration over a container type via
     QSequentialIterable and QAssociativeIterable
   * Registering the same type name twice will now print only a warning (as
     opposed to aborting the execution of the program)

 - Qt Containers:
   * In debug mode, the Qt containers will now verify whether the iterators
     passed to most mutating functions belong to the iterator in question.
   * Fixed a number of bugs that would modify shared containers when calling
     erase(), under corner-case conditions.

- QtAlgorithms
  With STL no longer being optional for building and using Qt, a number of parts
  of QtAlgorithms no longer make sense, and have therefore been deprecated.

  Replacements are available in the STL, and generally have much better
  performance, but are not instantly source-compatible in all cases. For
  instance, specialization of qLess or qSwap means that a direct port to
  std::sort from qSort may not be possible, as std::sort does not use any of
  them; a possible workaround is explicitly passing a qLess functor to
  std::sort:

      std::sort(container.begin(), container.end(), qLess<T>());

  The functions in QtAlgorithms that have been deprecated, along with their
  STL counterparts, are:
    - qBinaryFind (std::binary_search / std::lower_bound)
    - qCopy (std::copy)
    - qCopyBackward (std::copy_backward)
    - qEqual (std::equal)
    - qFill (std::fill)
    - qFind (std::find)
    - qCount (std::count)
    - qSort (std::sort)
    - qStableSort (std::stable_sort)
    - qLowerBound (std::lower_bound)
    - qUpperBound (std::upper_bound)
    - qLess (std::less)
    - qGreater (std::greater)

 - QByteArray:
   * Added QByteArray::Base64Url and QByteArray::OmitTrailingEquals flags
     for QByteArray::toBase64 and fromBase64.
   * [QTBUG-34694] Fixed a bug that would cause QByteArray to overflow some
     size calculations.

 - QCoreApplication:
   * [QTBUG-15379][QTBUG-30628] Fixed a bug that caused Qt to mis-parse a
     command-line argument like -DKEY=\"VALUE\" on Windows.

 - QDateTime:
   * [QTBUG-26161][QTBUG-29666] Fully implement support for Qt::TimeSpec of
     Qt::OffsetFromUTC, added new methods for offsetFromUTC(),
     toTimeSpec(), and toOffsetFromUTC().
   * Added convenience methods for fromMSecsSinceEpoch() and fromTime_t()
     to take time spec to be used in returned datetime.
   * Add method timeZoneAbbreviation() to return effective time zone
     abbreviation.
   * The debug datastream is now an ISO-like format instead of Qt::TextDate
   * The Standard Time to Daylight Time transition for Qt::LocalTime is now
     handled correctly. Any date set in the "missing" hour is now
     considered invalid. All date math results that fall into the missing
     hour will be automatically adjusted to a valid time in the following
     hour.
   * Added new method isDaylightTime() to return if the datetime is in
     Daylight Time or not.
   * Added support for a new Qt::TimeZone spec to be used with QTimeZone to
     define times in a specific time zone.
   * Added Qt::RFC2822Date format that can be passed to QDateTime and
     QLocale formatters and parsers.
   * Fixed a bug that caused QDate::toString() to return empty for dates
     with years beyond 9999.

 - QFileSystemWatcher:
   * [QTBUG-33211] Fixed a bug that caused QFileSystemWatcher to emit change
     notifications with the wrong path on Linux.

 - QJson:
   * [QTBUG-33229] The Writer and the Parser now fully accept non-character
     unicode points.
   * The Writer will no longer write inf, -inf and nan for infinites and NaN
     values, which resulted in parsing back as strings. Instead, it will now
     output null.
   * The Writer now emits numeric values with full numeric precision. This
     also allows QJson to support integer values with no loss of precision
     up to 2^53.

 - QJsonValue:
   * Added QJsonValue::toInt(). QJsonValue can store 32-bit signed integers
     with no loss of precision.

 - QObject:
   * New-style signal connections to functors, lambdas, and static functions
     now works with a receiver object. The connection will be removed when
     the either the sender or receiver objects are destroyed.

 - QPluginLoader:
   * QPluginLoader will no longer load the plugins on Mac OS X and iOS
     systems when scanning for valid plugins.
   * Added QPluginLoader::staticPlugins(), which returns the list of
     built-in plugins (linked to the executable and any loaded libraries).

 - QProcess:
   * [QTBUG-32958] Fixed a bug that would cause QProcess to crash if
     waitForStarted() were called after an unsuccessful start()
   * Added QProcess::nullDevice(), which returns the platform's "blackhole"
     device (/dev/null on Unix, NUL on Windows). This can be used with
     QProcess::setStandardOutputFile.
   * Added enum values QProcess::ForwardedOutputChannel and
     QProcess::ForwardedErrorChannel, which allow for more fine-grained
     control over which channel is forwarded and which one is captured.
   * Added QProcess::ForwardedInputChannel, which allows for stdin to be
     forwarded to this process's input.
   * [QTBUG-32979] On Unix, QProcess now correctly forwards the siginfo_t
     and context parameters of the signal handler to the previous handler.

 - QScopedPointer:
   * Added QScopedPointerDeleteLater, a new class that can be used as the
     second template to QScopedPointer and will call deleteLater() on the
     pointer when it goes out of scope.

 - QSocketNotifier:
   * Fixed a bug that caused socket notifiers not to be re-enabled after
     they had been activated on BlackBerry.

 - QStandardPaths:
   * QStandardPaths::enableTestMode is deprecated and is replaced by
     QStandardPaths::setTestModeEnabled.
   * Added QStandardPaths::GenericConfigLocation, which refers to a location
     where applications can store config files to be shared with other
     applications.

 - QThread:
   * Added an advisory interrupt mechanism (QThread::requestInterruption and
     QThread::isInterruptionRequested).

 - QThreadPool:
   * Added method clear() to remove any queued QRunnables.
   * Fixed a number of race conditions.

 - QTime:
   * [QTBUG-30250] When calling QTime::toString(Qt::TextDate) and
     QTime::toString(Qt::ISODate), milliseconds are now included in
     the returned string. This also applies to
     QDateTime::toString(Qt::TextDate) and
     QDateTime::toString(ISODate).
   * Added new methods fromMSecsSinceStartOfDay() to create a new QTime
     from an msecs value, and msecsSinceStartOfDay() to return the QTime as
     the number of msecs since the start of the day.

 - QTimeZone:
   * Added new QTimeZone class to support time tone calculations using the
     host platform time zone database and the Olsen time zone ID's.

 - QUrl:
   * [QTBUG-33229] QUrl now fully accepts non-character unicode points;
     they are encoded as percent characters; they can also be pretty
     decoded
   * Added QUrl::RemoveFilename flag which can be passed to path(),
     authority() and toString() and will cause the filename part of the path
     (the contents after the last '/') to be removed.
   * Added QUrl::fileName(), which returns just the filename part of the
     path.
   * Added QUrl::NormalizePathSegments flag, which will cause QUrl to
     remove "/./" or "/../" sequences as much as possible. It will not
     remove "/../" from the beginning of the path.
   * Added QUrl::adjusted(), which returns a new QUrl with certain parts of
     the original URL removed or normalized.
   * Added QUrl::matches(), which can be used to compare parts of two URLs
     or to compare two URLs after normalization.

 - QUtf8:
   * [QTBUG-33229] UTF-8 now accepts non-character unicode points; these
     are not replaced by the replacement character anymore

 - QVariant:
   * Fixed QVariant::canConvert with longlong
   * Variant containing enum types can now be converted to integer
   * [QTBUG-33981] Fixed a bug that would cause QPolygonF to be saved or
     loaded incorrectly in QDataStream.

QtDBus
------

 - Improved error handling so as to give more feedback to the developer when
   certain marshalling or demarshalling actions fail.
 - [QTBUG-27809] Fixed some race conditions related to delivering method
   reply deliveries.
 - Fixed a bug that made non-slot invokables not get listed in the
   auto-generated introspections.

QtDeclarative
-------------

 - ColorDialog:
   * Added currentColor property.

 - [QTBUG-32928] ShortcutOverride events now work for QQuickItem
   subclasses

QtGui
-----

 - Accessibility classes are now public allowing accessibility
   information for custom widgets/QQuickItems

 - Session Management:
   * [QTBUG-28228] The new QPlatformSessionManager class brings back
     the session management functionality. It allows the
     implementation of platform specific behavior related to session
     management. For platform that don't support this feature the
     default behavior has not changed.  Both X11 and Windows session
     management are supported.

 - QPolygonF:
   * When a QVariant holds a QPolygonF() then it will be correctly seen as
     a null QVariant.

 - QImage:
   * Added three byte-ordered RGBA8888 format that simplifies interaction
     with OpenGL and other technologies that internally using RGBA formats.

 - [QTBUG-27349] Reintroduced command line argument for positioning
   windows (-geometry on X11, -qwindowgeometry on other platforms)

 - [QTBUG-28832] Fixed regression from Qt 4 when using
   QTextOption::ShowLineAndParagraphSeparators.

QtNetwork
---------

 - API was added to store and resume TLS session tickets.
 - The minimum support openssl version has been increased to openssl
   1.0. The code to support older versions has not been removed, but is no
   longer supported.
 - An off-by-one error in NTLM proxy authentication has been fixed.
 - Various improvements to reduce the memory used by qtnetwork have been
   made.
 - Improved support for HTTP proxy authentication.
 - Support for preconnecting to servers before making HTTP and HTTPS
   connections. This allows for much reduced latency when the hosts to be
   connected to are known.

QtPrintSupport
--------------

 - QPrintDialog:
   * Added support for setting CUPS job options in the print dialog.
   * Added support for setting CUPS Banner pages in the print dialog.
   * Added support for setting CUPS Page Set (even/odd pages only) in the
     print dialog.
   * Added support for setting CUPS Pages Per Sheet and Pages Per Sheet
     Layout options
   * Added CUPS server-side print range support for apps that can't support
     print range option themselves

QtSql
-----

Changes in Qt 5.1.0 (missing from released changelog dist/changes-5.1.0)
 - [QTBUG-28088] Remove dependency of DB driver headers on qsqlcachedresult_p.h.
 - Deprecate QSqlError setters. The constructor is sufficient, since it has
   a parameter for each member variable.
 - Rename the SQL driver header files to _p.h (make private)
   The drivers were never public API. They were exposed by mistake in
   public headers. What's more, they have #include'd a private header
   (qsqlcachedresult_p.h) since at least Qt 4.5.1. That means no one used
   those headers in Qt 4 (private headers weren't installed then) and
   it's unlikely anyone did in 5.0.
 - ODBC: Implemented lastInsertId() for some ODBC compatible databases.
 - PSQL: Make lastInsertID work for tables without OIDs.
 - [QTBUG-14904] SQLITE: Fix for Sql query aliases with dots
 - [QTBUG-2192] ODBC: fix loss of milliseconds when binding QDateTime
 - [QTBUG-30076] PSQL: escape backslashes only when server requires it
   IMPORTANT: Applications that implemented their own workarounds must be
   updated to avoid misbehavior and SQL injection vulnerabilities.
 - [QTBUG-10569] ODBC: fixed QODBCResult::exec() return value for DELETE
   operations when no rows are affected.
 - ODBC: Fixed loss of column metadata on SQL_NO_DATA.
 - QSqlTableModel: expose methods for getting primary values.
 - ODBC: Fixed possible cause of spurious errors (commit af35ee291a1bbbc8)

Changes in Qt 5.2.0
 - [QTBUG-29261] IBASE: Construct a valid QTime when creating timestamps for
   iBase SQL driver.
 - [QTBUG-33389] PSQL: Format QDateTime following ISO8601.
 - Add QSQLITE_OPEN_URI option to QSQLITE driver

QtWidgets
---------

 - Added class QKeySequenceEdit.
 - Added QMaxCocoaViewContainer and QMacNativeWidget classes.
 - [QTBUG-1016] Added API to control tool tip timing via:
   * new QToolTip::showTip() overload
   * QWidget::toolTipDuration() property.
   * QStyle::SH_ToolTip_WakeUpDelay and SH_ToolTip_FallAsleepDelay
     style hints.
 - [QTBUG-30255] Fixed a bug where spans across empty cells in a grid
   layout got broken.
 - [QTBUG-31569] WA_QuitOnClose now works even if there are other
   windows that don't have it set.
 - [QTBUG-32788] Properly handles Qt::WidgetWithChildrenShortcut
   shortcuts in MDI subwindows now.
 - [QTBUG-33078] QWidget::setWindowOpacity() now works when called
   before QWidget::show().
 - [QTBUG-33104] Fixed a bug where layout items with a Preferred size
   policy would be treated as fixed size, if mixed with Expanding
   items having maximumSize set.
 - [QTBUG-33247] Changed accessible trees and tables to always expose
   hidden headers, instead of only exposing the visible headers.
 - [QTBUG-34007] Fixed a crash in tablet support.
 - Fixed a bug where the maximum size hint of a layout with spans was
   wrong.
 - Item delegates now cycle through all three states of tri-state
   checkboxes, the same way QCheckBox itself does.

 - QAbstractItemView:
   * [QTBUG-7232] In ItemViews scrollbars will now by default only
     scroll 1 pixel when scrollMode is set to scrollPerPixel. That is
     it will (when scrollMode is scrollPerPixel) do what is stated in
     the documentation, and no longer automatically adjust the
     scrollbar's singleStep. The user can now control that value.

 - QAbstractScrollArea:
   * QAbstractScrollArea now has a SizeAdjustPolicy. If it is set to
     AdjustToContents it will make use of the protected viewportSizeHint()
     virtual function. This function returns a suggested size based on
     contents. Note that although the viewportSizeHint() virtual function
     was reserved in 5.0, user code was not supposed to be overriding it
     (as the function was private and undocumented).  Code that was
     overriding viewportSizeHint() needs to be recompiled against 5.2 for
     this feature to work correctly.

 - QButtonGroup:
   * [QTBUG-14857] Added buttonToggled() signals.

 - QColorDialog:
   * Added a web color QLineEdit.
   * [QTBUG-14332] Added a screen color picker button.
   * [QTBUG-31998] Does no longer create widgets when using the
     platform dialog.
   * [QTBUG-32054] Fixed a bug with keyboard navigation.

 - QComboBox:
   * [QTBUG-31146] Fixed selection of items with identical text in
     popup completion.
   * Added currentData() convenience function which allows to retrieve
     the user data set for the current item.

 - QCompleter:
   * [QTBUG-3414] Added filterMode property.
   * The activated() signal now passes invalid indexes instead of
     random bogus ones when falling back to the completion prefix.

 - QDesktopWidget:
   * [QTBUG-32567] Fixed emission of workAreaResized() signal.

 - QDialogButtonBox:
   * Added a (StandardButtons,QWidget*) constructor.

 - QDockWidget:
   * [QTBUG-31044] The position of a dock widget is now kept when
     undocking.
   * [QTBUG-32260] Fixed a bug where visibilityChanged was signaled
     wrongly in certain multi-screen setups.

 - QFileDialog:
   * setDefaultSuffix() now removes leading dot characters.
   * Introduced DontUseCustomDirectoryIcons. This improves the file
     dialog performance under Windows for the case where there are
     lots of folders. Went from taking 60 seconds to 2 seconds, on a
     SDCard with 10k folders.
   * Added setMimeTypeFilters() for mimetype-based filtering, as an
     alternative to pattern matching.
   * Fixed removing of directories containing hidden or system files.
   * Added QUrl-based API for remote files.
   * [QTBUG-13182] Improved performance on Windows by
     + not resolving NTFS symlinks (15x speedup on pessimistic
       workloads) and
     + using extensions over calling GetFileAttributesEx() in certain
       cases.
   * [QTBUG-29403] Fixed potential crash in destructor of
     ~QFileInfoGather in threaded applications.
   * [QTBUG-34132] QFileDialog does no longer instantiate widgets if a
     native dialog will be used instead.  Therefore some accessors
     which previously returned unused objects will now return null.
     As before, you can set the DontUseNativeDialog option to ensure
     that widgets will be created and used instead.
   * [QTBUG-33039] Does no longer create widgets when using the
     platform dialog.

 - QFontComboBox:
   * [QTBUG-1573] Made QFontComboBox locale-sensitive.

 - QFontDialog:
   * Now has finer-grained control over the types of fonts listed,
     similar to what QFontComboBox already had.

 - QGestureManager
   * Now supports Mac OS X native gestures.

 - QGraphicsView etc
   * Fixed a crash in QGraphicsProxyWidget.
   * [QTBUG-8061] Allow handling of mouseDoubleClickEvent in
     QGraphicsItems.
   * [QTBUG-19036] Make QGraphicsScene::items(QPointF) work using
     Qt::{Contains,Intersets}ItemBoundingRect with items that contain
     the point in the bounding rectangle, but not their (custom)
     shape.
   * [QTBUG-29945] Fixed drop-shadow and blur effects when using a
     QGLWidget viewport.

 - QGroupBox:
   * [QTBUG-33610] The check indicator of a checkable group box is no
     longer clipped when using a small title font.

 - QHeaderView:
   * Reduced memory usage by 33%.
   * [QTBUG-4346] A maximumSize for sections has been introduced. The
     maximum section size is by default the largest possible section
     size which in Qt 5.2 has been limited to 1048575 pixels.
   * [QTBUG-32203] Fixed a painting bug involving hidden and reordered
     sections.

 - QInputDialog:
   * Added getMultiLineText static method.

 - QLayout:
   * Added replaceWidget() function.

 - QLineEdit:
   * [QTBUG-32061] The cursor is now positioned correctly in an empty
     line edit with placeholder text.
   * Keep placeholderText visible when focused, until text is added.
   * Context-menu actions now have icons.
   * Made it possible to add side widgets.
   * Made it possible to add a clear button commonly used for item
     view filtering as a side widget

 - QListView:
   * [QTBUG-1180] Dragging an item outside the QListView in icon mode
     no longer loses the icon. Also fixed a bug where under certain
     conditions code overriding QAbstractItemView::viewOptions() would
     not be called.
   * [QTBUG-21433] Fixed content size calculation when either
     horizontal or vertical scroll bar policy is always off.

 - QMacStyle:
   * [QTBUG-31668] Fixed a case where multiple auto-default button
     animations were running in parallel on OS X

 - QMainWindow:
   * Added takeCentalWidget() function.

 - QMenu:
   * Added QMenu::toNSMenu() conversion function (Mac only)
   * Added QMenu::setAsDockMenu() and qt_mac_set_doc_menu(QMenu *menu)
     functions (Mac only).
   * [QTBUG-31664] Moving the mouse over a menu separator now closes
     any open sub menus.

 - QMenuBar:
   * [QTBUG-32807] Menus now close again on second click.
   * Added QMenuBar::toNSMenu() conversion function (Mac only)

 - QMessageBox:
   * May use native message boxes on some platforms now.
   * setDetailedText() now works after show().
   * [QTBUG-2450] Added setCheckBox() function.
   * [QTBUG-6731] It is now possible to select some or all text from a
     QMessageBox and copy it to the clipboard.

 - QScrollBar:
   * Transient scrollbars are now properly shown when starting
     two-finger scrolling on OS X.

 - QSizePolicy:
   * Added a retainSizeWhenHidden attribute.

 - QSpinBox:
   * Values can now be displayed in different bases
     (cf. displayIntegerBase property)
   * [QTBUG-31602][QTBUG-34305] Fixed size calculation when
     stylesheets are used.

 - QSplashScreen:
   * Added message(), a getter for the currently displayed message.

 - QSplitter:
   * Now gets the default value of opaqueResize property from (new)
     QStyle::SH_Splitter_OpaqueResize styleHint.

 - QStyle:
   * Added SH_ToolTip_WakeUpDelay and SH_ToolTip_FallAsleepDelay.
   * Fixed SH_ItemView_ActivateItemOnSingleClick not being retrieved
     correctly from the platform theme.

 - QSystemTrayIcon:
   * [QTBUG-31762] Fixed position of system tray icon on Linux/X11
     (except Unity).
   * [QTBUG-33461] Increased the maximum length of a system tray
     tooltip on Windows to what it was in Qt 4.

 - QTableView:
   * [QTBUG-4206] resizeToContents will now adjust to actual contents
     and not just visible area. QHeaderView::setAutoResizePrecision()
     has been introduced to control how precise the autoResize should
     be.

 - QTextEdit:
   * Added placeholderText akin to QLineEdit.
   * Context-menu actions now have icons.

 - QToolTip:
   * Added new showText() overload taking a duration.

 - QTreeView:
   * Added setTreePosition() function.

 - QWidget:
   * Added window{Title,Icon,IconText}Changed() signals.
   * Added toolTipDuration property.

 - QWindowContainer:
   * [QTBUG-32177] Sets active window correctly now.
   * [QTBUG-34138] Will not create native child widgets any more.

 - QWindowsVistaStyle:
   * [QTBUG-26503] Does no longer draw inapplicable scroll bar
     grippers on Windows 8.

 - QWizard:
   * [QTBUG-26722] The default background pixmap works again on OS X.
   * [QTBUG-29924] Gave all buttons an objectName().

****************************************************************************
*                      Platform Specific Changes                           *
****************************************************************************


Android
-------

 - Project structure and deployment has changed with the introduction of
   androiddeployqt. Source and build files are no longer mixed, and the
   build files for the APK package should not be touched. Customizing
   the build files is possible. Read the documentation for androiddeployqt
   for more information.
 - Status bar visibility is now controlled by Qt, so the window state will
   override settings in the AndroidManifest.xml. The default is still to
   show the status bar (QWindow::showMaximized()). Use
   QWindow::showFullScreen() to hide it.
 - Implemented support for accessibility on Android.
 - Implemented support for native action bar backend for menu bars in
   Qt Quick Controls and Qt Widgets.
 - Implemented support for native popup menus and comboboxes in Qt Quick
   Controls.
 - Implemented support for native message boxes in Qt Widgets.
 - Several improvements to handling dialogs and multiple top-level
   windows in Qt Widgets.
 - Implemented automatic inclusion of necessary permissions in manifest
   when linking against Qt Multimedia.
 - Fixed crash on startup when running on Android 4.4.
 - Add requirement for Android SDK version 13 or higher for building
   Qt application. Note that this is for building only. The application
   can still be targeted for devices with SDK versions 9 and up.
 - Default to target SDK version 14 to disable overflow button in
   system navigation.
 - New module: Qt Android Extras. Contains convenience APIs for using
   JNI, and will in the future include support for Android-specific
   features which do not fit in a cross-platform API.
 - Implemented support for thread-affinity in qrand() functions.
 - Fixed several problems with predictive text in soft keyboard.
 - Made several improvements to stability.
 - Implemented support for camera and low-latency audio in Qt Multimedia.
 - Fixed driver-specific bugs in text rendering in Qt Quick 2.
 - Added preference in default manifest for installing applications to
   external storage if possible.
 - Fixed delivery of key press event for the Back key.
 - Fixed race condition when showing a window in full screen which would
   cause it to not be maximized.
 - Fixed input method hints.
 - Made font point sizes compatible with the interpretation of point
   sizes on iOS to ease sharing code between the two platforms.
 - Added support for QAmbientTemperatureSensor, QPressureSensor
   and QProximitySensor to Qt Sensors.
 - Removed dependency on Qt Widgets in default build of Qt Quick Controls.

OS X
----

 - Added QMaxCocoaViewContainer and QMacNativeWidget classes.
 - Qt for OS X is now identified by the macro Q_OS_OSX. This complements the
   existing Q_OS_DARWIN macro (which identifies the open source kernel and
   could identify non-Apple products) and Q_OS_MAC, which is defined for
   both OS X and iOS. The old macro Q_OS_MACX is now deprecated.
 - Qt no longer complains about new versions of OS X that haven't been
   released yet. This will allow Qt 5.2 and future versions to build on
   future versions yet to be released. Note that those versions are not
   supported until official announcement by the Qt Project.
 - Added a number of functions to QtCore to convert to and from
   CFString/NSString and QString, CFURL/NSURL and QUrl.
 - QGestureManager now supports Mac OS X native gestures.
 - Added QMenu::setAsDockMenu(), QMenu(Bar)::toNSMenu(),
   qt_mac_set_doc_menu() functions.
 - [QTBUG-26722] The QWizard default background pixmap works again.

BlackBerry
----------

 - Cover windows (aka active frames) are now supported. Cover windows must
   have the Qt::CoverWindow flag set. They are shown when the application
   is minimized.

Windows
-------

 - [QTBUG-33409][QTBUG-8764][QTBUG-10032] Fixed virtual key mapping on
   Windows.
 - QCoreApplication::arguments() changed the handling of single quotes, double quotes
   and the backslash character, in order to match what argv[] contains.
   In particular, single quotes are no longer removed from the argument string.
   (QTBUG-15379, QTBUG-30628)

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.

- moc
 * Porting moc to QCommandLineParser has changed one specific option in its
   command line handling: using the -f option without argument
   is not supported anymore (it wasn't necessary, since including the header
   file is the default behavior).

