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.


****************************************************************************
*                       Source incompatible changes                        *
****************************************************************************

- The Qt 3 support module and all related code was removed.

- QAtomicInt's and QAtomicPointer's non-atomic convenience methods
  (i.e., operator=, operator int / operator T*, operator!, operator==,
  operator!= and operator->) have been removed as they did implicit
  loads and stores of unspecified memory ordering. Code dealing with
  is expected to use load(), loadAquire(), store() and storeRelease()
  as necessary instead.

- QObject
  * The signatures of the connectNotify() and disconnectNotify() functions
    have changed. The functions now get passed a QMetaMethod that identifies
    the signal, rather than a const char *.

- QSslCertificate::subjectInfo() and QSslCertificate::issuerInfo() now
  return a QStringList instead of a QString

- QSslCertificate::isValid() has been deprecated. Originally it only checked
  the certificate dates, but later checking for blacklisting was added. Now
  there's a more specific QSslCertificate::isBlacklisted() method.

- Unite clipping support has been removed from QPainter. The alternative is
  to unite QRegion's and using the result on QPainter.

- QLibrary::resolve() now returns a function pointer instead of a void
  pointer.

- QSslCertificate::alternateSubjectNames() is deprecated (but can be enabled
  via QT_DISABLE_DEPRECATED_BEFORE), use
  QSslCertificate::subjectAlternativeNames() instead.

- QLibraryInfo::buildKey() has been removed. Likewise, the QT_BUILD_KEY
  preprocessor #define has also been removed. The build-key is obsolete
  and is no longer necessary.

- QCoreApplication::translate() will no longer return the source text when
  the translation is empty. Use lrelease -removeidentical for optimization.

- QTranslator subclasses need to adjust the signature of the virtual method
  translate() in order to add the "int n = -1" argument.

- QString and QByteArray constructors that take a size argument will now treat
  negative sizes to indicate nul-terminated strings (a nul-terminated array of
  QChar, in the case of QString). In Qt 4, negative sizes were ignored and
  result in empty QString and QByteArray, respectively. The size argument to
  those constructors now has a default value of -1, thus replacing the separate
  constructors that did the same.

- Qt::escape() is deprecated (but can be enabled via
  QT_DISABLE_DEPRECATED_BEFORE), use QString::toHtmlEscaped() instead.

- QBool is gone. QString::contains, QByteArray::contains, and QList::contains
  used to return an internal QBool class so that the Qt3 code
  "if (a.contains() == 2)" wouldn't compile anymore. Such code cannot exist
  in Qt4, so these methods return a bool now. If your code used the undocumented
  QBool, simply replace it with bool.

- The old macros TRUE and FALSE have been removed, use true and false instead.

- qIsDetached<> has been removed without replacement.

- The return type of QFlags<Enum>::operator int() now matches the Enum's underlying
  type in signedness instead of always being 'int'. This was done in order to allow
  QFlags over enums whose underlying type is unsigned (Qt::MouseButton is one such
  enum).

- QMetaType:
  * QMetaType::construct() has been renamed to QMetaType::create().
  * QMetaType::unregisterType() has been removed.
  * QMetaType now records if the type argument inherits QObject. This
    can be used in scripting APIs, so that custom QObject subclasses
    are treated as QObject pointers. In QtScript for example, this can
    mean that QScriptValue.isQObject can be true where it was false before.
  * QMetaType::QWidgetStar has been removed. Use qMetaTypeId<QWidget*>()
    or QVariant::canConvert<QWidget*>() as appropriate.

- QMetaMethod:
  * QMetaMethod::signature() has been renamed to QMetaMethod::methodSignature(),
    and the return type has been changed to QByteArray. This was done to be able
    to generate the signature string on demand, rather than always storing it in
    the meta-data.
  * QMetaMethod::typeName() no longer returns an empty string when the return
    type is void; it returns "void". The recommended way of checking whether a
    method returns void is to compare the return value of QMetaMethod::returnType()
    to QMetaType::Void.

- QVariant:
  * Inconsistent constructor taking Qt::GlobalColor and producing QVariant(QColor)
    instance was removed. Code constructing such variants can be migrated by
    explicitly calling QColor constructor. For example from "QVariant(Qt::red)"
    to "QVariant(QColor(Qt::red))"
  * Similarly, implicit creation of QVariants from enum values Qt::BrushStyle,
    Qt::PenStyle, and Qt::CursorShape have been removed. Create objects explicitly
    or use static_cast<int>(Qt::SolidLine) to create a QVariant of type int with
    the same value as the enum.

- QLocale:
  * The historical language and country names were updated to their modern values,
    some deprecated names were dropped or mapped to their modern alternatives.

- QTestLib:
  * The plain-text, xml and lightxml test output formats have been changed to
    show a test result for every row of test data in data-driven tests.  In
    Qt4, only fails and skips were shown for individual data rows and passes
    were not shown for individual data rows, preventing accurate calculation
    of test run rates and pass rates.
  * The QTRY_VERIFY and QTRY_COMPARE macros have been moved into QTestLib.
    These macros formerly lived in tests/shared/util.h but are now provided
    by including the <QtTest/QtTest> header. In addition,
    QTRY_VERIFY_WITH_TIMEOUT and QTRY_COMPARE_WITH_TIMEOUT are provided,
    allowing for specifying custom timeout values.
  * The QTEST_NOOP_MAIN macro has been removed from the API.  If a test is
    known at compile-time to be inapplicable for a particular build it should
    be omitted via .pro file logic, or the test should call QSKIP in the
    initTestCase() method to skip the entire test and report a meaningful
    explanation in the test log.
  * The DEPENDS_ON macro has been removed from the API.  This macro did nothing
    and misled some users to believe that they could make test functions depend
    on each other or impose an execution order on test functions.
  * The QTest::qt_snprintf function has been removed from the API.  This was an
    internal testlib function that was exposed in the public API due to its use
    in a public macro.  Any calls to this function should be replaced by a call
    to qsnprintf(), which comes from the <QtCore/QByteArray> header.
  * The QTest::pixmapsAreEqual() function has been removed from the API.
    Comparison of QPixmap objects should be done using QCOMPARE, which provides
    more informative output in the event of a failure.
  * The QSKIP macro no longer has the "mode" parameter, which caused problems
    for calculating test metrics, as the SkipAll mode hid information about
    what test data was skipped.  Calling QSKIP in a test function now behaves
    like SkipSingle -- skipping a non-data-driven test function or skipping
    only the current data row of a data-driven test function.  Every skipped
    data row is now reported in the test log.
  * The qCompare() function template was both overloaded and specialised, which
    made it almost impossible to specialise the correct primary template and
    could lead to indecipherable error messages or surprising overload resolution
    (such as going via qCompare(QFlags<void*>,int) to satisfy a request for
    qCompare<void*>()). Now, specialisation has been replaced by overloading.
    As a consquence, code such as qCompare<QString>(l, r) will no longer use the
    QString-specific implementation and may fail to compile. We recommend you
    replace specialisations with overloading, too. Also, don't pass explicit
    template arguments to qCompare (e.g. qCompare<QString>(l, r)), but let
    overload resolution pick the correct one, and cast arguments in case of
    ambiguous overloads (e.g. qCompare(QString(l), r)). The resulting code will
    continue to work against older QtTestlib versions.

- The QSsl::TlsV1 enum value was renamed to QSsl::TlsV1_0 .

- QAccessible:
  * Internal QAccessible::State enum value HasInvokeExtension removed
- QAccessibleInterface:
  * The "child" integer parameters have been removed. This moves the api
    to be closer to IAccessible2.
    This means several functions lose their integer parameter:
    text(Text t, int child) -> text(Text t), rect(int child) -> rect()
    setText(Text t, int child, const QString &text) -> setText(Text t, const QString &text)
    role(int child) -> role(), state(int child) -> state()
  * parent() and child() was added in order to do hierarchical navigation.
  * relations() was added as a replacement to relationTo()
  * As a consequence of the above two points, navigate() was removed.
  * Accessible-Action related functions have been removed. QAccessibleInterface
    subclasses are expected to implement the QAccessibleActionInterface instead.
    These functions have been removed:
    QAccessibleInterface::userActionCount, QAccessibleInterface::actionText,
    QAccessibleInterface::doAction
- QAccessibleEvent also loses the child parameter.
    QAccessibleEvent(Type type, int child) -> QAccessibleEvent(Type type)
    QAccessibleEvent::child() removed.
- QAccessibleActionInterface:
  * Refactored to be based on action names. All functions have been changed from using
    int parameters to strings.

- QSound has been moved from QtGui to QtMultimedia

- QTabletEvent::QTabletEvent does not take a hiResGlobalPos argument anymore,
  as all coordinates are floating point based now.

- QTouchEvent:

  * The DeviceType enum and deviceType() have been deprecated due to
    the introduction of QTouchDevice.

  * The signature of the constructor has changed. It now takes a
    QTouchDevice pointer instead of just a DeviceType value.

  * TouchPointState no longer includes TouchPointStateMask and
    TouchPointPrimary. QTouchEvent::TouchPoint::isPrimary() has
    been removed.

  * QWidget *widget() has been removed and is replaced by QObject
    *target() in order to avoid QWidget dependencies.

  * QEvent::TouchCancel has been introduced. On systems where it makes
    sense this event type can be used to differentiate between a
    regular TouchEnd and abrupt touch sequence cancellations caused by
    the compositor, for example when a system gesture gets recognized.

- QMetaType

  * Q_DECLARE_METATYPE(Foo*) now requires that Foo is fully defined. In
    cases where a forward declared type should be used as a metatype,
    Q_DECLARE_OPAQUE_POINTER(Foo*) can be used to allow that.
  * Similarly, Q_DECLARE_METATYPE(QSharedPointer<Foo>), and
    Q_DECLARE_METATYPE(QWeakPointer<Foo>) require Foo to be fully defined. Again
    though, Q_DECLARE_OPAQUE_POINTER(Foo*) can be used to allow that.

- QItemEditorFactory

  * The signature of the createEditor and valuePropertyName methods
    have been changed to take arguments of type int instead of QVariant::Type.

- QModelIndex/QAbstractItemModel

  * The integer value that can be stored in a QModelIndex is now of type
    quintptr to match the size of the internal storage location.
  * The createIndex() method now only provides the void* and quintptr
    overloads, making calls with a literal 0 (createIndex(row, col, 0))
    ambiguous. Either cast (quintptr(0)) or omit the third argument
    (to get the void* overload).

- QWindowSystemInterface:

  * The signature of all handleTouchEvent() variants have changed,
    taking a QTouchDevice* instead of just a DeviceType value.
    Platform or generic plug-ins have to create and register at least
    one QTouchDevice before sending the first touch event.

  * The event type parameter is removed from handleTouchEvent().

- The previously exported function qt_translateRawTouchEvent() has been removed.
  Use QWindowSystemInterface::handleTouchEvent() instead.

- QAbstractEventDispatcher

  * The signature for the pure-virtual registerTimer() has changed. Subclasses
  of QAbstractEventDispatcher will need to be updated to reimplement the new
  pure-virtual 'virtual void registerTimer(int timerId, int interval,
  Qt::TimerType timerType, QObject *object) = 0;'

  * QAbstractEventDispatcher::TimerInfo is no longer a QPair<int, int>. It is
  now a struct with 3 members: struct TimerInfo { int timerId; int interval;
  Qt::TimerType timerType; }; Reimplementations of
  QAbstractEventDispatcher::registeredTimers() will need to be updated to pass
  3 arguments to the TimerInfo constructor (instead of 2).

- QUuid

  * Removed implicit conversion operator QUuid::operator QString(), instead
  QUuid::toString() function should be used.

- The QHttp, QHttpHeader, QHttpResponseHeader and QHttpRequestHeader classes have
  been removed, QNetworkAccessManager should be used instead.

- The QFtp and QUrlInfo classes are no longer exported, QNetworkAccessManager should be used
  instead. These classes are available in a separate module, qtftp.

- QProcess

  * On Windows, QProcess::ForwardedChannels will not forward the output of GUI
    applications anymore, if they do not create a console.

- QAbstractSocket's connectToHost() and disconnectFromHost() are now virtual and
  connectToHostImplementation() and disconnectFromHostImplementation() don't exist.

- QTcpServer::incomingConnection() now takes a qintptr instead of an int.

- QNetworkConfiguration::bearerName() removed, and bearerTypeName() should be used.

- QDir::convertSeparators() (deprecated since Qt 4.2) has been removed. Use
  QDir::toNativeSeparators() instead.

- QIconEngineV2 was merged into QIconEngine
  You might need to adjust your code if it used a QIconEngine.

- QTextCodecPlugin has been removed since it is no longer used. All text codecs
  are now built into QtCore.

- QDir::NoDotAndDotDot is QDir::NoDot|QDir::NoDotDot therefore there is no need
  to use or check both.

- QFSFileEngine, QAbstractFileEngine, QAbstractFileEngineIterator and
  QAbstractFileEngineHandler were removed from public API and are no longer
  exported. They may temporarily live as private implementation details, but
  they may be altogether dropped or otherwise changed at will in the future.

- QLocale
  * toShort(), toUShort(), toInt(), toUInt(), toLongLong() and toULongLong() no
    longer take a parameter for base, they will only perform localised base 10
    conversions. For converting other bases use the QString methods instead.

- QSystemLocale has been removed from the public API.

- QSqlQueryModel::indexInQuery() is now virtual. See note below under QtSql.

- QSqlDriver::subscribeToNotification, unsubscribeFromNotification,
  subscribedToNotifications, isIdentifierEscaped, and stripDelimiters
  are now virtual. See note below under QtSql.

- qMacVersion() has been removed. Use QSysInfo::macVersion() or
  QSysInfo::MacintoshVersion instead.

- QColorDialog::customColor() now returns a QColor value instead of QRgb.
  QColorDialog::setCustomColor() and QColorDialog::setStandardColor() now
  take a QColor value for their second parameter instead of QRgb.

- QPageSetupDialog has had the PageSetupDialogOption enum and the api to
  set and get the enum removed as none of the Options are used any more.

- QAbstractPageSetupDialog has been removed.

- QThread::terminated() has been removed, since its emission cannot be guaranteed.

- QPrintEngine - Removed the PPK_SuppressSystemPrintStatus key as no longer used.

- QCoreApplication::Type and QApplication::type() have been removed. These
  Qt3 legacy application types did not match the application types
  available in Qt5. Use for example qobject_cast instead to dynamically
  find out the exact application type.

- The following QStyle implementations have been made internal:
  * QFusionStyle
  * QGtkStyle
  * QMacStyle
  * QWindowsCEStyle
  * QWindowsMobileStyle
  * QWindowsStyle
  * QWindowsVistaStyle
  * QWindowsXPStyle
  Instead of creating instances or inheriting these classes directly, use:
  * QStyleFactory for creating instances of specific styles
  * QProxyStyle for customizing existing style implementations
  * QCommonStyle as a base for implementing full custom styles.

****************************************************************************
*                           General                                        *
****************************************************************************

General Improvements
--------------------

- The directory structure of the qtbase unit-tests has been reworked to
  more closely match the directory structure of the code under test.
  Integration tests have been moved to tests/auto/integrationtests.

- Qt is compiled with C++11 support enabled by default, provided the compiler
  supports C++11. Qmake based projects can enable C++11 support explicitly
  using 'CONFIG+=c++11' in their .pro files. To enable it conditionally, use
  'contains(QT_CONFIG,c++11):CONFIG+=c++11'. This will enable C++11 support
  only if Qt was built with C++11 support.

- The Unicode Data and Algorithms has been updated to match the
  Unicode Standard of version 6.2. For more information see http://www.unicode.org/

- The QLocale data has been updated to CLDR 22.1.
  For more information see http://cldr.unicode.org/

Third party components
----------------------

- SQLITE_ENABLE_FTS3,SQLITE_ENABLE_FTS3_PARENTHESIS and SQLITE_ENABLE_RTREE
flags are now enabled by default on all platforms, for the sqlite3 copy under
the 3rdparty directory.

Legal
-----

 - Copyright of Qt has been transferred to Digia Plc.

****************************************************************************
*                          Library                                         *
****************************************************************************

QtCore
------
* [QTBUG-12144], [QTBUG-18360] The QChar methods are now able to handle the full range
  of Unicode codepoints defined by the Unicode Standard of version 6.2.
  QChar::isPrint() will no longer return a false positives for
  the Unicode format characters, surrogates, and private use characters.

* Drop a bogus QChar::NoCategory enum value; the proper QChar::Other_NotAssigned
  value is returned for an unassigned codepoints now.

* layoutAboutToBeChanged is no longer emitted by QAbstractItemModel::beginMoveRows.
  layoutChanged is no longer emitted by QAbstractItemModel::endMoveRows. Proxy models
  should now also connect to (and disconnect from) the rowsAboutToBeMoved and
  rowsMoved signals.

* The QAbstractItemModel::sibling method was made virtual, allowing implementations
  to optimize based on internal data.

* The default value of the property QSortFilterProxyModel::dynamicSortFilter was
  changed from false to true.

* The signature of the virtual QAbstractItemView::dataChanged method has changed to
  include the roles which have changed. The signature is consistent with the dataChanged
  signal in the model.

* QFileSystemWatcher is now able to return failure in case of errors whilst
  altering the watchlist in both the singular and QStringList overloads of
  addPath and removePath.

* QString::mid, QString::midRef and QByteArray::mid, if the position passed
  is equal to the length (that is, right after the last character/byte),
  now return an empty QString, QStringRef or QByteArray respectively.
  in Qt 4 they returned a null QString or a null QStringRef.

* QString methods toLongLong(), toULongLong(), toLong(), toULong(), toInt(),
  toUInt(), toShort(), toUShort(), toDouble(), and toFloat() no longer use the
  default or system locale, they will always use the C locale. This is to
  guarantee consistent default conversion of strings. For locale-aware conversions
  use the equivalent QLocale methods.

* QDate, QTime, and QDateTime have undergone important behavioural changes:
  * QDate only implements the Gregorian calendar, the switch to the Julian
    calendar before 1582 has been removed. This means all QDate methods will
    return different results for dates prior to 15 October 1582, and there is
    no longer a gap between 4 October 1582 and 15 October 1582.
  * QDate::setYMD() is deprecated, use QDate::setDate() instead
  * Most methods now apply strict validity checks and will return appropriate
    and consistent values when invalid.  For example, QDate::year() will return
    0 and QDate::shortMonthName() will return QString().
  * Adding days to a null QDate or seconds to a null QTime will no longer return
    a valid QDate/QTime.
  * QDate stores the Julian Day as a qint64 extending date support across a
    more interesting range, see the class documentation for details.
    * Conversion to YMD form dates is only accurate between to 4800 BCE to
      1.4 million CE
    * The QDate::addDays() and QDateTime::addDays() methods now take a qint64
    * The QDate::daysTo() and QDateTime::daysTo() methods now return a qint64

* QTextCodec::codecForCStrings() and QTextCodec::setCodecForCStrings() have both
  been removed. This was removed due to issues with breaking other code from
  libraries, creating uncertainty/bugs in using QString easily, and (to a lesser
  extent) performance issues.

* QTextCodec::codecForTr() and QTextCodec::setCodecForTr() have been removed.
  QObject::trUtf8 and QCoreApplication::Encoding enum are now obsolete. Qt assumes
  that the source code is encoded in UTF-8.

* QFile::setEncodingFunction and QFile::setDecodingFunction are obsolete and do
  nothing in Qt 5. The QFile::encodeName and QFile::decodeName functions are now
  hardcoded to operate on QString::fromLocal8Bit and QString::toLocal8Bit
  only. Therefore, it's still possible to obtain the old behaviour by calling
  QTextCodec::setCodecForLocale. However, that is not recommended: new code
  should not make assumptions about the filesystem encoding and older code should
  have those assumptions removed.

* QIntValidator and QDoubleValidator no longer fall back to using the C locale if
  the requested locale fails to validate the input.

* A new set of classes for doing pattern matching with Perl-compatible regular
  expressions has been added: QRegularExpression, QRegularExpressionMatch and
  QRegularExpressionMatchIterator. They aim to replace QRegExp with a more
  powerful and flexible regular expression engine.

* QEvent::AccessibilityPrepare, AccessibilityHelp and AccessibilityDescription removed:
  * The enum values simply didn't make sense in the first place and should simply be dropped.

* Filtering of native events (QCoreApplication::setEventFilter, as well as
  QApplication::x11EventFilter/macEventFilter/qwsEventFilter/winEventFilter) have been replaced
  with QCoreApplication::installNativeEventFilter and removeNativeEventFilter,
  for an API much closer to QEvent filtering. Note that the native events that can be
  filtered this way depend on which QPA backend is chosen, at runtime. On X11, XEvents are
  not used anymore, and have been replaced with xcb_generic_event_t due to the switch to
  XCB, which requires porting the application code to XCB as well.

* [QTBUG-23529] QHash is now more resilient to a family of denial of service
  attacks exploiting algorithmic complexity, by supporting two-arguments overloads
  of the qHash() hashing function.

* [QTBUG-4844] QObject::disconnectNotify() is now called when a receiver is destroyed.

* QStateMachine
  - [QTBUG-15430] Added a QStateMachine constructor that takes a ChildMode parameter.
  - [QTBUG-17975] Delayed event posting now works from secondary threads.
  - [QTBUG-19789] Signal transitions now work correctly when the sender is in a different thread.
  - [QTBUG-20362] Property assignments now work as expected with nested, parallel states.
  - [QTBUG-22931] The root state can now be a parallel state group.
  - [QTBUG-24307] The initial state is now entered before the started() signal is emitted.
  - [QTBUG-25959] State entry and exit order is now SCXML spec-compliant.

* qDebug(), qWarning(), qCritical(), and qFatal() were changed to macros that track the origin
  of the message in source code. Whether this and other meta-information is printed can be
  configured  (for the default message handler) by setting the new QT_MESSAGE_PATTERN environment
  variable. qInstallMsgHandler() has been deprecated, and should be replaced with
  qInstallMessageHandler().

* QTextBoundaryFinder
  - [QTBUG-6498] The word start and word end boundaries detection is now
    unaware of surrounding white space characters.
  - SoftHyphen enum value has been added to specify a line break opportunity
    at a soft hyphen (SHY) character.
  - MandatoryBreak enum value has been added to specify a mandatory (aka "hard") line breaks.
  - Source-incompatible change: Since the behavior of boundaryReasons() method
    has been changed a lot, StartWord/EndWord enum values were intentionally replaced
    with StartOfItem/EndOfItem ones to force the affected code be revised.

* Softkeys API was removed. The following functions and enums were removed:
  - QAction::setSoftKeyRole()
  - QAction::softKeyRole()
  - QAction::SoftKeyRole
  - Qt::WA_MergeSoftkeys
  - Qt::WA_MergeSoftkeysRecursively
  - Qt::WindowSoftkeysVisibleHint
  - Qt::WindowSoftkeysRespondHint

* QLocale
  - [QTBUG-27987] Constructing a QLocale object with the short locale id has been improved.

* QObject
  - Added overloads of connect() to connect using pointers to member function
  - Added QObject::isSignalConnected()

QtGui
-----
* Accessibility has been refactored. The hierachy of accessible objects is implemented via
  proper parent/child functions instead of using navigate which has been deprecated for this purpose.
  Table and cell interfaces have been added to qaccessible2.h

* Touch events and points have been extended to hold additional
  information like capability flags, point-specific flags, velocity,
  and raw positions.

* A new set of enabler classes have been added, most importantly QWindow, QScreen,
  QSurfaceFormat, and QOpenGLContext.

* Most of the useful QtOpenGL classes have been polished and moved into
  QtGui. See QOpenGLFramebufferObject, QOpenGLShaderProgram,
  QOpenGLFunctions, etc.

* QOpenGLPaintDevice has been added to be able to use QPainter to render into
  the currently bound context.

* Behavioral change in QImage::fill() on an image with format Format_RGB888:
  For consistency with RGB32 and other 32-bit formats, function now expects
  image data in RGB layout as opposed to BGR layout.

* Behavioral change in QImage and QPixmap load()/loadFromData() on a non-null image:
  If load() or loadFromData() fails to load the image (returns false) then
  the existent image data will be invalidated, so that isNull() is guaranteed
  to return true in this case.

* Behavioral change regarding QPainter fill rules when not using antialiased
  painting: The fill rules have changed so that the aliased and antialiased
  coordinate systems match. Earlier there used to be an offset of slightly less
  than half a pixel when doing sub-pixel rendering, in order to be consistent
  with the old X11 paint engine. The new behavior should be more predictable and
  gives the same consistent rounding for images / pixmaps as for paths and
  rectangle filling. It's possible to still get the old behavior by setting the
  QPainter::Qt4CompatiblePainting render hint.

* Behavioral change regarding QPen: The default QPen constructors now create a
  1-width non-cosmetic pen as opposed to a 0-width cosmetic pen. The old
  behavior can be emulated by setting the QPainter::Qt4CompatiblePainting
  render hint when painting.

QtWidgets
---------
* A new style QFusionStyle has been introduced, while QPlastiqueStyle, QCleanlooksStyle,
  QCDEStyle and QMotifStyle have been removed. The older styles will be
  made available to applications as a standalone source package.

* QInputContext removed as well as related getters and setters on QWidget and QApplication.
  Input contexts are now platform specific.

* QInputDialog::getInteger() has been obsoleted. Use QInputDialog::getInt() instead.

* In Qt 4, QStyle::standardIconImplementation() and layoutSpacingImplementation()
  were introduced instead of making the corresponding methods virtual due to binary
  compatibility reasons. QStyle::standardIcon() and layoutSpacing() have been made
  (pure) virtual in Qt 5.

* In Qt 4, many QStyleOption subclasses were introduced in order to keep
  binary compatibility -- QStyleOption was designed to be extended this way,
  in fact it embeds a version number. In Qt 5 the various QStyleOption*V{2,3,4}
  classes have been removed, and their members merged into the respective
  base classes. Those classes were left as typedefs to keep existing code
  working. Still, some minor adjustements could be necessary, especially in code
  that uses QStyleOption directly and does not initialize all the members using
  the proper Qt API: due to the version bump, QStyle will try to use the additional
  QStyleOption members, which are left default-initialized.

* QHeaderView has been refactored and the following functions have been obsoleted:

  * void setMovable(bool movable) - use void setSectionsMovable(bool movable) instead.

  * bool isMovable() const - use bool sectionsMovable() const instead.

  * void setClickable(bool clickable) - use void setSectionsClickable(bool clickable) instead.

  * bool isClickable() const - use bool sectionsClickable() instead.

  * void setResizeMode(int logicalindex, ResizeMode mode) -
    use setSectionResizeMode(logicalindex, mode) instead.

  * ResizeMode resizeMode(int logicalindex) const -
    use sectionResizeMode(int logicalindex) instead.

  * setSortIndicator will no longer emit sortIndicatorChanged when the sort indicator is unchanged.

* QDateEdit and QTimeEdit have re-gained a USER property. These were originally removed
    before Qt 4.7.0, and are re-added for 5.0. This means that the userProperty for
    those classes are now QDate and QTime respectively, not QDateTime as they have been
    for the 4.7 and 4.8 releases.

* QGraphicsItem and derived classes - Passing a QGraphicsScene in the items constructor
  is no longer supported. Construct the item without a scene and then call
  QGraphicsScene::addItem() to add the item to the scene.

* QAbstractItemView and derived classes only emit the clicked() signal on left click now,
  instead of on all mouse clicks.

* QProxyModel has been removed. It is deprecated since early Qt 4 versions and replaced
  by QAbstractProxyModel and related classes. A copy of QProxyModel is available
  in the UiHelpers library.

* The virtual methods QApplication::commitData and QApplication::saveState, used for session
  management, no longer exist.
  Connect to the commitDataRequest and saveStateRequest signals instead.
  The new isSessionSaving() method can be used in the cases where the closeEvent of your
  window needs to know whether it is being called during shutdown.

* [QTBUG-20503] QFileSystemModel no longer masks out write permissions from the permissions
  returned from permissions() or data(FilePermissions), even if in read-only mode
  (QFileSystemModel::isReadOnly()).

* [QTBUG-158 QTBUG-428 QTBUG-26501] QComboBox::currentText improvements
  Restored currentText as USER property.
  New setter setCurrentText(), marked as WRITE method, usable by QItemDelegate and QDataWidgetMapper.
  New signal currentTextChanged() marked as NOTIFY method.

QtNetwork
---------
* QHostAddress::isLoopback() API added. Returns true if the address is
  one of the IP loopback addresses.

* QSslCertificate::serialNumber() now always returns the serial number in
  hexadecimal format.

* The openssl network backend now reads the ssl configuration file allowing
  the use of openssl engines.

QtDBus
------
* QtDBus now generates property annotations for the Qt type names
  in the org.qtproject.QtDBus namespace. When parsing such annotations
  both the old and new namespaces are accepted.

* QtDBus error codes have been updated to be on the org.qtproject.QtDBus.Error
  namespace.

QtConcurrent
------------

* QtConcurrent is no longer in QtCore, but forms its own library now.
  QMake-based projects can use
    QT += concurrent
  to include the new library.

* QtConcurrent::Exception has been renamed to QException, and is still in QtCore.
  Ditto QtConcurrent::UnhandledException.

QtOpenGL
--------

* Most of the classes in this module (with the notable exception of QGLWidget)
  now have equivalents in QtGui, along with the naming change QGL -> QOpenGL.
  The classes in QtOpenGL that have equivalents in QtGui can now be considered
  deprecated.
* QGLPixelBuffer is now deprecated and implemented in terms of a hidden
  QGLWidget and a QOpenGLFramebufferObject. It is recommended that applications
  using QGLPixelBuffer for offscreen rendering to a texture switch to using
  QOpenGLFramebufferObject directly instead, for improved performance.
* The default major version of QGLFormat has been changed to 2 to be aligned
  with QSurfaceFormat. Applications that want to use a different version should
  explicitly request it using QGLFormat::setVersion().
* void QGLContext::generateFontDisplayLists(const QFont& font, int listBase)
  and int QGLWidget::fontDisplayListBase(const QFont & fnt, int listBase)
  which were deprecated in Qt 4 have been removed.
* Previously deprecated default value listBase parameter has been removed from
  both QGLWidget::renderText() functions.
* In order to ensure support on more platforms, stricter requirements have been
  introduced for doing threaded OpenGL. First, you must call makeCurrent() at
  least once per swapBuffers() call, so that the platform has a chance to
  synchronize resizes to the OpenGL surface. Second, before doing makeCurrent()
  or swapBuffers() in a separate thread, you must call
  QGLContext::moveToThread(QThread *) to explicitly let Qt know in which thread
  a QGLContext is currently being used. You also need to make sure that the
  context is not current in the current thread before moving it to a different
  thread.

QtScript
--------
* [QTBUG-2124]  Added default conversion for long and unsigned long.
* [QTBUG-6133]  Fixed QScriptContextInfo::functionMetaIndex() for overloaded
  slots.
* [QTBUG-15213] Doc: Added missing properties to the ECMAScript reference.
* [QTBUG-15956] Doc: Removed wrong information about Error .stack properties.
* [QTBUG-17915] Fixed a crash when a JS property descriptor was only partially
  defined.
* [QTBUG-18188] Fixed a regression that caused contexts created by
  QScriptEngine::pushContext() to inherit the parent context's scope.
* [QTBUG-18201] Suppressed 'LEAK' messages on stderr at application exit.
* [QTBUG-20378] Fixed QtScriptTools compilation when some features are disabled.
* [QTBUG-20845] Fixed a precision bug in the calculator example.
* [QTBUG-21548] Fixed a crash in QScriptEngineDebugger when the QScriptEngine
  being debugged was deleted.
* [QTBUG-21760] Fixed a crash when accessing QObject properties through an
  activation object.
* [QTBUG-21896] Fixed a crash when converting an invalid JS value to a string.
* [QTBUG-21993] Fixed a bug that caused QObject wrapper objects created with
  the PreferExistingWrapperObject option to not be garbage collected, even if
  the object was not referenced anywhere in the scripting environment.
* [QTBUG-22152] Fixed build issue on Solaris.
* [QTBUG-23871] Fixed a JIT crash on x86-64 caused by out-of-range branch
  instructions.
* [QTBUG-26261] Fixed a crash when a queued signal handler no longer existed.
* [QTBUG-26590] Fixed a bug that caused QObjects with script connections to
  not be garbage collected as expected.

QTestLib
--------
* [QTBUG-20615] Autotests can now log test output to multiple destinations
  and log formats simultaneously.
* [QTBUG-21645] QSignalSpy now handles QVariant signal parameters more
  intuitively; the QVariant value is copied directly, instead of being
  wrapped inside a new QVariant. This means that calling
  qvariant_cast<QVariant>() on the QSignalSpy item (to "unwrap" the value)
  is no longer required (but still works).

QtSql
-----
QSqlQueryModel/QSqlTableModel/QSqlRelationalTableModel

* The dataChanged() signal is now emitted for changes made to an inserted
record that has not yet been committed. Previously, dataChanged() was
suppressed in this case for OnRowChange and OnFieldChange. This was probably
an attempt to avoid trouble if setData() was called while handling
primeInsert(). By emitting dataChanged(), we ensure that all views are aware
of the change.

* While handling primeInsert() signal, the record must be manipulated using
the provided reference. Do not attempt to manipulate the records using the
model methods setData() or setRecord().

* removeRows() no longer emits extra beforeDelete signal for out of range row.

* removeRows() now requires the whole range of targetted rows to be valid
before doing anything. Previously, it would remove what it could and
ignore the rest of the range.

* removeRows(), for OnFieldChange and OnRowChange, allows only 1 row to be
removed and only if there are no other changed rows.

* setRecord() and insertRecord()
  -The generated flags from the source record are preserved in the model
  and determine which fields are included when changes are applied to
  the database.
  -Require all fields to map correctly. Previously fields that didn't
  map were simply ignored.
  -For OnManualSubmit, insertRecord() no longer leaves behind an empty
  row if setRecord() fails.
  -setRecord() now automatically submits for OnRowChange.

* QSqlQueryModel::indexInQuery() is now virtual. See
QSqlTableModel::indexInQuery() as example of how to implement in a
subclass.

* QSqlQueryMode::setQuery() emits fewer signals. The modelAboutToBeReset()
and modelReset() signals suffice to inform views that they must reinterrogate
the model.

* QSqlTableModel::select() is now a slot.

* QSqlTableModel::selectRow(): This is a new slot that refreshes a single
row in the model from the database.

* QSqlTableModel edit strategies OnFieldChange/OnRowChange QTBUG-2875
Previously, after changes were submitted in these edit strategies, select()
was called which removed and inserted all rows. This ruined navigation
in QTableView. Now, with these edit strategies, there is no implicit select()
done after committing. This includes deleted rows which remain in
the model as blank rows until the application calls select(). Instead,
selectRow() is called to refresh only the affected row.

* QSqlTableModel::isDirty(): New overloaded method to check whether model
has any changes to submit. QTBUG-3108

* QSqlTableModel::setData() and setRecord() no longer revert pending changes
that fail upon resubmitting for edit strategies OnFieldChange and OnRowChange.
Instead, pending (failed) changes cause new changes inappropriate to the
edit strategy to be refused. The application should resolve or revert pending
changes. insertRows() and insertRecord() also respect the edit strategy.

* QSqlTableModel::setData() and setRecord() in OnRowChange no longer have the
side effect of submitting the cached row when invoked on a different row.

* QSqlDriver::subscribeToNotification, unsubscribeFromNotification,
subscribedToNotifications, isIdentifierEscaped, and stripDelimiters
are now virtual. Their xxxImplemenation counterparts have been removed
now that QSqlDriver subclasses can reimplement these directly.

****************************************************************************
*                          Database Drivers                                *
****************************************************************************

sqlite
------
* QVariant::Bool type now mapped to integers 0/1 in SQL instead of strings
'true' and 'false'. Sqlite does not have a boolean column type and it is
customary to use integer. QTBUG-23895

postgres
--------
* the error message returned in QSqlError::text() has the SQLSTATE error code
appended in parantheses.

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

The Qt platform implementations have been rewritten as plugins for the Qt
Platform Abstraction (QPA):

* The platform plugin(s) needs to be bundled when applications are deployed.
* The platform implementations are in large parts rewrites.
* Q_WS_* defines are no longer defined. Q_OS_* is.
* Some platform specific functionality and API is missing from the 5.0
  release and will be added later.
* Platform spesific functionality will be added in separate modules:
  QtMacExtras: http://qt.gitorious.org/qtplayground/qtmacextras


Qt for Linux/X11
----------------


Qt for Windows
--------------
* Accessibility framework uses IAccessible2
* ANGLE can be used to provide Open GL ES 2.0 (see http://code.google.com/p/angleproject/)

Qt for Mac OS X
---------------
* Qt now uses Cocoa, the Carbon port has been removed.
* The minimum supported OS X version is 10.6. PPC is not supported.
* Qt generally supports cross OS X version build and deployment (build
  on any supported version and deploy to any other). One exception is
  QtWebkit, which should be built using the 10.6 SDK if you want to target
  that platform.
* The Qt binary installer has been changed to use the Qt installer framework.
  Qt is now installed into one location instead of being spread out over multiple
  directories.
* The Qt binary installer is built against the 10.7 SDK and does not
  run on 10.6.
* The Clang compiler is used by default. Gcc is available trough the
  macx-g++* mkspecs.
* Build-system support for universal binaries has been removed. The "lipo"
  command-line tool can be used as a workaround.
* Qt now use the raster paint engine on all platforms for drawing widgets.
  CoreGraphics is still used for printing on Mac.
* Support for high-dpi "retina" displays has been added for widgets,
  OpenGL and QtQuick.
* The unified toolbar implementation from Qt 4 has not and will not be ported
  to Qt 5. This means calling QMainWindow::setUnifiedTitleAndToolBarOnMac has
  no effect on Qt 5. A replacement API which wraps NSToolbar is available in
  QtMacExtras.
* MacDeployQt plugin deployment has been improved. It will no longer try to
  deploy all plugins with all dependencies.
* Qt has been updated to be in compliance with the Mac App Store sandbox, and
  will for example no longer try to write settings to files outside the sandbox.
* The "qt_menu.nib" issue preventing static/non-framework builds from working
  has been fixed.


Qt for Embedded Linux
---------------------


Qt for Windows CE
-----------------


****************************************************************************
*                      Compiler Specific Changes                           *
****************************************************************************


****************************************************************************
*                          Tools                                           *
****************************************************************************

- Build System

  * Qt has been split into numerous repositories. Configure covers mostly only qtbase's options.
  * Qt will now install CMake configuration files for all its libraries.

- configure

  * The Mac OS X -dwarf2 configure argument has been removed. DWARF2 is always
    used on Mac OS X now.
  * The following options have been added: (-no)-force-asserts, (-no)-strip, (-no)-gui &
    (-no)-widgets, -device & -device-option, -archdatadir, -libexecdir & -qmldir,
    and numerous changes relating to specific Qt features and dependencies.
  * Configure will no longer call "qmake -recursive" by default, as the subsequent
    build invokes qmake as needed. Use -fully-process to restore the old behavior.

- qmake

  * default_pre.prf is now evaluated per subproject & build pass, symmetrically
    to default_post.prf.
  * .qmake.conf files (.qmake.cache equivalent in source tree) are read now.
  * Project-specific mkspecs/ and features/ directories are supported now.
    QMAKEPATH and QMAKEFEATURES can be set in .qmake.{config,cache} to specifiy their
    location, and qmake will find them in the project's top-level directory automatically.
  * Mixing host and target subprojects is now supported. "default-host" makespec
    was added; option(host_build) enables its use.
  * QMAKE_MOC_OPTIONS variable is now available for passing additional parameters
    to the moc.
  * The CROSS_COMPILE variable and property can be used to parametrize the device
    and mingw makespecs.
  * QMAKE_RPATHLINKDIR (complementary to QMAKE_RPATHDIR) is now understood.
  * The "aux" TEMPLATE was added. Does not work with vcproj and xcode output files.
  * The properties QT_INSTALL_ARCHDATA, QT_INSTALL_LIBEXECS, QT_INSTALL_QML,
    QMAKE_SPEC & QMAKE_XSPEC were added. QT_INSTALL_DEMOS is obsolete.
  * The following functions have been added: $$sort_depends, $$resolve_depends,
    $$enumerate_vars, $$reverse, $$val_escape, $$format_number, $$shadowed,
    $$clean_path, $$system_path, $$shell_path, $$absolute_path, $$relative_path,
    $$system_quote, $$shell_quote, cache, write_file, touch, mkpath & log.
    defined can now query variables; $$cat and $$system support more splitting modes.
    qtCompileTest (available from configure.prf) was added.
  * Removed qttest_p4.prf. Use CONFIG+=testcase and other flags instead.
  * QMAKE_SUBSTITUTES can now copy files verbatim.
  * MSVC desktop builds now use -Zc:wchar_t.
  * The following variables were added: QMAKESPEC, _QMAKE_CONF_ & _QMAKE_SUPER_CACHE_.
  * QDBUSXML2CPP_{INTERFACE,ADAPTOR}_{HEADER,SOURCE}_FLAGS are now understood,
    and DBUS_{INTERFACES,ADAPTORS} support file groups with individual flags now.
  * QT_PRIVATE and PKGCONFIG_PRIVATE (analogous to LIBS_PRIVATE resp. PKGCONFIG) are now understood.
  * INSTALLS entries now support copying with subdirectory (e.g., entry.base = $$dirname(PWD)).
  * Defining QTPLUGIN in dynamically linked projects does not hurt any more.
  * CONFIG+=import_plugins will now cause plugin imports for QTPLUGIN being auto-generated.
  * Debug info generation can now be enabled also for release builds (CONFIG+=force_debug_info).
  * The following CONFIG flags have been deprecated in favor of QT module entries:
    qtestlib, qdbus, help, designer, uitools, qaxserver & qaxcontainer (the leading 'q'
    was stripped from the affected modules).
  * The IN_PWD alias for PWD was deprecated.
  * QMAKE_{DIST,}CLEAN support normalized path separators now.
  * CONFIG+=depend_includepath is on by default now. DEPENDPATH is unnecessary in most projects.
  * Makespecs should be adjusted in the following ways:
    * The QMAKE_INCDIR_QT, QMAKE_LIBDIR_QT, QMAKE_MOC, QMAKE_UIC, QMAKE_IDC, TEMPLATE & QT
      variables should not be defined any more. Furthermore, QMAKE_LIBS_X11SM is obsolete.
    * The qt, warn_on, release, & link_prl CONFIG flags should not be set any more.
    * The QMAKE_PLATFORM & QMAKE_COMPILER variables should be defined now.
      Several other variables should be defined by including files from mkspecs/common/.

- Assistant

- Designer
  * [QTBUG-8926] [QTBUG-20440] Properties of type QStringList now have
    translation attributes which apply to all items.
    They are by default translatable.

- Linguist

  * The integration with Mac OS' document handling was improved
  * lupdate can now treat other .ts files as sources
  * lupdate's CODECFORTR is deprecated and will be removed soon. All source code
    written with Qt is expected to use UTF-8 encoding.

- rcc


- moc

* [QTBUG-20785] The moc now has a -b<file> option to #include an additional
  file at the beginning of the generated file.
* moc is now able to fully understand and expands preprocessor macros.

- uic


- qtconfig


****************************************************************************
*                          Plugins                                         *
****************************************************************************
- The text codecs that were previously plugins are now built into QtCore.
- Code using Q_EXPORT_PLUGIN macros will no longer compile. Use
  Q_PLUGIN_METADATA instead. Note that this requires that the class
  be default-constructible.

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

- QPointer

   * The implementation of QPointer has been changed to use QWeakPointer. The
     old guard mechanism has been removed. This causes a slight change
     in behavior when using QPointer:

     * When using QPointer on a QWidget (or a subclass of QWidget), previously
     the QPointer would be cleared by the QWidget destructor. Now, the QPointer
     is cleared by the QObject destructor (since this is when QWeakPointers are
     cleared). Any QPointers tracking a widget will NOT be cleared before the
     QWidget destructor destroys the children for the widget being tracked.

- QUrl

  * QUrl has been changed to operate only on percent-encoded
    forms. Fully-decoded forms, where the percent character stands for itself,
    are no longer possible. For that reason, the getters and setters with
    "encoded" in the name are deprecated, except for QUrl::toEncoded() and
    QUrl::fromEncoded().

    QUrl now operates in a mode where it decodes as much as it can of the
    percent-encoding sequences. In addition, the setter methods possess a mode
    in which a '%' character not part of a percent-encoding sequence will cause
    the parser to correct the input. Therefore, most software will not require
    changes to adapt, since the getter methods will continue returning the
    components in their most-decoded form as they did before and the setter
    methods will accept input as they did before..

    The most notable difference is when dealing with
    QUrl::toString(). Previously, this function would return percent characters
    in the URL by themselves. Now, it will return "%25", like
    QUrl::toEncoded().

- QLibraryInfo

  * location() always returns paths with normalized separators now.

- QVariant

  * Definition of QVariant::UserType changed. Currently it is the same as
    QMetaType::User, which means that it points to the first registered custom
    type, instead of a nonexistent type.

- QMetaType

  * Interpretation of QMetaType::Void was changed. Before, in some cases
    it was returned as an invalid type id, but sometimes it was used as a valid
    type (C++ "void"). In Qt5, new QMetaType::UnknownType was introduced to
    distinguish between these two. QMetaType::UnknownType is an invalid type id
    signaling that a type is unknown to QMetaType, and QMetaType::Void
    is a valid type id of C++ void type. The difference will be visible for
    example in call to QMetaType::typeName(), this function will return null for
    QMetaType::UnknownType and a pointer to "void" string for
    QMetaType::Void.
    Please, notice that QMetaType::UnknownType has value 0, which previously was
    reserved for QMetaType::Void.

- QWidget

  * No need to set the application name in setWindowTitle() anymore, this is done
    automatically, on Windows and Unix/X11, provided that the (possibly translated)
    application display name is set with QGuiApplication::setApplicationDisplayName().

- QMessageBox

     * The static function QMessageBox::question has changed the default argument
     for buttons. Before the default was to have an Ok button. That is changed
     to having a yes and a no button.

- qmake & configure

  * The project file parser has been rewritten from scratch. Invalid syntax will be
    rejected more aggressively, and interpretation may have changed in some corner cases.
  * Projects which explicitly set an empty TARGET are considered broken now.
  * The makespec and .qmake.cache do not see build pass specific variables any more.
  * load()/include() with a target namespace and infile()/$$fromfile() now start with
    an entirely pristine context.
  * Configure's -sysroot and -hostprefix are now handled slightly differently.
    The QT_INSTALL_... properties are now automatically prefixed with the sysroot;
    the raw values are available as QT_INSTALL_.../raw and the sysroot as QT_SYSROOT.
    The new QT_HOST_... properties can be used to refer to the Qt host tools.
    -no-gcc-sysroot can be used for non-standard sysroot configurations.
  * The QMAKE_MKSPECS property became unavailable at the command line. Query QT_HOST_DATA instead.
  * The TEMPLATE_PREFIX variable is gone. Use contains(TEMPLATE, vc.*) instead.
  * The "default" makespec symlink/directory is gone. Use qmake -query QMAKE_XSPEC instead.
  * DEPENDPATH does not end up in VPATH any more. Some SOURCES may not be found any more.
  * Several functions and built-in variables were modified to return normalized paths.
  * The -(no-)exception flags in configure have been removed. Qt modules are now compiled
    without exceptions by default, as they do not use them and can neither handle them
    properly. Qt Core still has exceptions enabled to correctly throw bad_alloc exceptions
    in our tool classes.
    Whether code should be compiled with exception support enabled or disabled can be
    controlled by a CONFIG += exceptions/exceptions_off setting in the .pro file.
  * The -no/-stl configure options are gone. Qt always uses the STL now.
  * The -no/-fast configure options are gone.
  * The -prefix-install configure option is gone. Use -prefix, etc. instead.
  * The -make option of the Windows configure was renamed to -make-tool.
    -make now complements -no-make, like in the Unix version.
  * The object_with_source CONFIG flag was removed. Use object_parallel_to_source instead.
  * Support for universal binaries on Mac OS has been removed.
  * The processor architecture handling changed significantly. This affects the -arch & -*-endian
    configure options, the QT_ARCH qmake variable, and more.
  * No "make_default" make targets will be generated any more. Use "make_first" instead.
  * The "qmake" make targets are non-recursive now. Use "qmake_all" to recurse.
  * load() with paths relative to the current project is not supported any more.
    Use include() instead.
  * Persistent qmake properties are not versioned any more. Also, the vendor changed to
    "QtProject", so old settings are lost.
  * Support for the Borland toolchain was removed. Numerous obsolete makespecs were culled.
  * setcepaths.bat is gone. QMake-generated Makefiles are self-contained now.
  * moc_dir, rcc_dir and some other tool variables are not defined in Qt's .pc files any more;
    the generic host_bins is defined instead.

