Qt 4.7.2 is a bug-fix release. It maintains both forward and backward
compatibility (source and binary) with Qt 4.7.0.  For more details,
refer to the online documentation included in this distribution. The
documentation is also available online:

  http://qt.nokia.com/doc/4.7

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

Some of the changes listed in this file include issue tracking numbers
corresponding to tasks in the Qt Bug Tracker or the Merge Request queue
of the public source repository.

Qt Bug Tracker: http://bugreports.qt.nokia.com
Merge Request:  http://qt.gitorious.org

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

QtCore
------

 - QMutex
    * [QTBUG-16115] Fixed deadlock when calling tryLock repeatedly.
 - QStateMachine
    * [QTBUG-14491] Fixed compilation on AIX 5.3 with gcc.
 - QThread
    * [QTBUG-15378] QThread::exec returaed immediately if QThread::exit had
      been called when event loop was not running.

QtGui
-----

 - Painting
    * [QTBUG-14907] Fix OpenVG painting artifacts after restoreState().
    * [QTBUG-15320] QPainter::drawRect crashed when drawing a null QRectF 
      with OpenGL.
    * [QTBUG-15693] Prevent crash in drawhelper code when the cpu has MMXEXT
      but no SSE.
 - QDoubleValidator
    * [QTBUG-14935] With some locales, QDoubleValidator would not accept "C"
      locale valid numbers.
 - QFileDialog
    * [QTBUG-17298] QFileDialog::getOpenFileNames didn't show any file.
 - QGraphicsView
    * [QTBUG-16063] Fix precision loss when querying micro focus rectangle
      in QGraphicsView.
 - QPainterPath
    * [QTBUG-16377] Prevent QPainterPath::connectPath() returning incorrect
      path, which caused OpenGL paint engine to crash.
 - QTableWidget
    * [QTBUG-15973] Resizinag a QTableWidget column where a cell contains a
      QProgressBar made it crash.
 - QTextDocument
    * [QTBUG-15777] Fxied crash in QTextDocument::markContentsDirty.
 - QTextLayout
    * [QTBUG-15823] Fixed crash in QTextLayout when drawing full width
      selection spanning multiple QTextLine's.
 - QWidget
    * [QTMOBILITY-645] Send WinIdChange event when winId is set to zero.
      The window handle of a native widget may be set to zero in two
      situations: (i) temporarily, during reparenting and (ii) during
      widget destruction.  Previously, no WinIdChange event was sent in
      either of these cases; now, it is sent in both cases.

QtNetwork
---------

 - Bearer Management
    * [QTBUG-15276] Fixed possible crash when parsing new connection.
 - QUrl
    * [QTBUG-16425] QUrl::setUrl() did not call detach().

QtQuick
-------

 - [QTBUG-14374] Fixed broken alignment of rich text.
 - [QTBUG-14727] QML Text element did not play nice with transformations.
 - [QTBUG-14761] Fixed memory leak in QDeclarativeComponent.
 - [QTBUG-14830] Fixed crash when adjusting width inside onWidthChanged.
 - [QTBUG-15710] Ensure header is considered when positioning content with
   snapping.
 - [QTBUG-16365] When using a PathView with a VisualDataModel which in turn
   used a Tree model (DirModel, for example), nothing was shown.
 - [QTBUG-16769] QML BorderImage failed if .sci file contained a URL.

QtScript
--------

 - General
    * [QTBUG-17166] Fix ScopeChainNode memory leak in JavaScriptCore.
 - QScriptContext
    * [QTBUG-17137] Fix crash when generating backtrace involving a
      built-in (ECMA) function.
 - QScriptEngine
    * [QTBUG-16987] Ensure QScriptProgram objects are invalidated
      when engine is destroyed.
    * [QTBUG-16828] Fix alignment issue causing crashes on platforms
      with only 4-byte-aligned malloc'ed memory (e.g. Symbian debug
      builds).
    * [QTBUG-15144] Fix GC-related crash in QScriptValue::setData().
    * [QTBUG-15079] Fix crash when QScriptClass property getter
      returns an invalid value.
    * [QTBUG-13440] Fix bug that caused Math.random() not to
      produce random values.
  - QScriptValue
    * [QTBUG-14801] Fix crash in QScriptValue::construct() when
      the function throws a non-Object value.

QtSql
-----

 - [QTBUG-14132] Fix errors in Oracle (xe) stored procedures with bind
   variables.
 - [QTBUG-14831] Fix regression in dynamic sorting of a QSortFilterProxyModel
   on a QSqlTableModel with OnManualSubmit.
 - [QTBUG-17076] Fix plugins/sqldrivers/oci compile error when using
   QT_NAMESPACE.


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

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

 - [QTBUG-15008] Fix broken prefix setting in configure when EPOCROOT shell
   variable is set.

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

 - QtQuick
    * [QTBUG-16885] QDeclarativeEngine::addImportPath() did not work if the
      drive letter is in lowercase.
    * [QTBUG-17360] Make sure $QTDIR/plugins/qmldebugging/tcpserver.dll is
      found in windows release builds.

Qt for Mac OS X
---------------

 - [QTBUG-13772] Returning form fullscreen mode causes assertion failure.
 - [QTBUG-14023] Added missing plugins to debug-libs package.
 - [QTBUG-14420] Switching from an application with undocked widgets hid the
   application.
 - [QTBUG-15638] Fixed incorrect QComboBox drop-down menu Z-ordering.
 - [QTBUG-15666] Fixed crash when closing QFontDialog::getFont() dialog before
   its event loop finished.
 - [QTBUG-16279] Fixed deadlock in QSyntaxHighlighter::highlightBlock.

Qt for Symbian
--------------

 - Multimedia
    * [QTBUG-17040] Prevent menu and native title pane area popping up when
      setting fullscreen mode off during video playback.
 - Packaging changes
    * [QTBUG-17399] Remove sqlite3 from Qt SIS for S60 3.2 and 5.0 to allow
      Nokia Content Signing, which doesn't permit sis files to have other
      sis files embedded inside.
 - Paging changes
    * [QT-3503] Remove PAGED keyword from all Qt-based binaries for
      MMP-based build systems (abld, SBSv2 (a.k.a. Raptor)).
      This changes the code paging field in the Symbian (E32Image) header
      from "paged" to "default".  Thus it is left to the configuration
      of the particular device whether paging is used for the binary or
      not.  All devices that support code paging should have it turned
      on (the value is stored in the HAL, so can be checked using eg.
      fshell); data paging may or may not be turned on depending on the
      device characteristics.  Leaving both code and data paging as
      "default" means that any limitations in the device (eg. around
      flash wear) can be controlled by that device by disabling the
      appropriate types of paging rather than being forced by the binary
      (which may be deployed to several different devices with different
      characteristics).
 - Phonon MMF backend
   * [QTBUG-11436] Added a MediaObject property which allows the client to
     specify which Internet Access Point should be used for streaming.
 - QApplication
   * [QTBUG-15915] Fix crash when creating more than one QApplication in single
     test case.
   * [QTBUG-16065] QApplication object with QApplication::GuiServer type caused
     crash on Symbian devices.
 - QDesktopWidget
   * [QTBUG-16095] Resize event for QDesktopWidget was sent too early.
 - QDialog
   * [QTBUG-16277] Fix fullscreen/Maximized dialog misplacement in Symbian.
   * [QTBUG-16110] QMessageBox softkeys were dimmed when application returned
     to foreground.
 - QEventDispatcherSymbian
   * [QTBUG-16380] Fix leaking of RTimer handles.
 - QFileDialog
   * [QTBUG-16204] Fix using QFileDialog statics in Symbian.
 - QFontDatabase
   * [QTBUG-16514] Avoid collision of application fonts.
 - QGraphicsView
   * [QTBUG-16932] Fix rendering errors on QGraphicsView with OpenVG engine.
 - QLineEdit
   * [QTBUG-16238] Fix one character displacement for cursor in line edits.
 - qmake & mkspecs
   * [QT-4193] Only add ICON for application projects in symbianpkgrules.pri
   * [QTBUG-13159] Allow pkg_prerules and pkg_postrules to be targeted to separate
     files.
   * [QTBUG-13367] Make default application deployment removable & added .flags
     modifier support for DEPLOYMENT items in Symbian.
   * [QTBUG-14280] Implement support for DEPLOYMENT.display_name in Symbian.
   * [QTBUG-13917] Localize .loc and .pkg content based on TRANSLATIONS.
   * [QTBUG-15159] Use include(original mkspec) instead of copying of mkspec to
     default.
   * [QTBUG-15393] Resolve EPOCROOT in qt.conf using same logic as in .pro.
   * [QTBUG-15501] Fix symbian-mmp.conf include path.
   * [QTBUG-15539] Use parent class function to generate Makefile headers.
   * [QTBUG-14472] Add NetworkServices capability automatically for network apps.
   * [QTBUG-14736] Add libinfix support for QML plugins in Symbian.
   * [QT-4375] Fix incorrect file name case for OpenGL libraries in
     symbian.conf.
   * [QTBUG-16172] Use relative include instead of absolute in default
     qmake.conf.
   * [QTBUG-16221] Fix libinfixed usage in Symbian when def files are used.
   * [QTBUG-16261] Fix infinite loop in qmake when reading malformed .ts files.
   * [QTBUG-16298] Ignore static_and_shared in Symbian builds.
   * [QTBUG-16477] Fix compile error when QT_NO_BEARERMANAGEMENT is defined.
   * [QTBUG-13769] Generate freeze targets in Symbian.
   * [QTBUG-16691] Remove toolcheck from generic clean targets for
     symbian-sbsv2.
   * [QT-4476] Fixed UTF-8 application names in device application menu.
   * [QTBUG-16753] Improved QMAKE_POST_LINK support in symbian-sbsv2.
   * [QTBUG-16881] Fix QMAKE_POST_LINK for targets with special characters.
   * [QTBUG-16888] No longer replace dash and dot in TARGET with underscore.
   * [QTBUG-17187] Ensure that package generated against Symbian^3 SDK has no
     Symbian^1 platforms as dependencies.
   * Fix partial upgrade package UID for libinfixed Qt.
   * Cleaned up sis_targets.prf.
 - QNetworkProxyFactory
   * [QTBUG-13857] Added systemProxyForQuery() for Symbian, allowing
     network proxies configured on the device to be used by applications.
 - QPaintEngine
   * [QTBUG-16008] Fixed broken constant alpha blending on ARMV6.
   * [QTBUG-16240] Fix blurry text in word-wrapped, center-aligned text items
     with OpenVG.
 - QSystemSemaphore
   * [QTBUG-16615] Fix QSystemSemaphore handle management issues in Symbian.
 - qtmain.lib
   * [QTBUG-14735] Use qtmain.lib to provide entry point for all applications.
 - QtQuick
   * [QTBUG-15405] QML Plugins were not loaded when installed on different
     drives.
 - QtScript
   * [QTBUG-14293] Enhanced JavaScript heap allocator.
   * [QTBUG-15800] Creating QScriptEngine on the heap caused app crash.
   * [QTBUG-15847] Add compiler optimizations.
   * [QTBUG-16685] Fix crash in JavaScript stack allocator.
 - QWidget
   * [QTBUG-16578] In cases where the widget was created from the event loop
     instead of main(), the middle three softkeys would not get the right
     visibility and would leave a "hole" in the application where one could
     see what was beneath it.
   * [QT-4416, QTBUG-17288] On devices which lack support for transparency
     in EGL surfaces, setting Qt::WA_TranslucentBackground on a widget
     whose windowType() is Qt::Window causes that widget to be rendered
     using the raster graphics system.
 - Tool scripts
   * [QTBUG-13886] Disallow patching capabilities of executables.
   * [QTBUG-13891] Add Location as self signable capability in patch_capabilities.pl.
   * [QTBUG-15561] Only patch package content that is necessary for self-signing.
   * Fix epocroot handling in createpackage.pl script.
   * Unify epocroot usage in createpackage and patch_capabilities scripts.

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

 - qmake
   * [QTBUG-14357] Make qmake to pass all UTF-8 characters unchanged through parser.

