Qt 4.2.2 is a bug-fix release. It maintains both forward and backward
compatibility (source and binary) with Qt 4.2.0.

The Qt version 4.2 series is binary compatible with the 4.1.x and 4.0.x
series. Applications compiled for 4.0 or 4.1 will continue to run with 4.2.

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

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

- Configuration/Compilation

  * Fixed issues with unresolved zlib symbols on aix-g++ resulting from a
    missing "-lz" in gui/Makefile.

  * Fixed compilation when an unsupported version of MySQL is auto-detected
    by the configure script.

  * Fixed QtDBus linking errors when compiling with the Intel C++ Compiler
    for Linux.

  * Fixed compilation when using Q_ARG and Q_RETURN_ARG macros with template
    types.

  * Make Qt compile with QT_NO_TOOLTIP and QT_NO_STATUSBAR

- Documentation

  * Added new overviews and substantially improved Qtopia Core-specific
    documentation.

- Demos / Examples

  * Fixed crash in the Settings Editor example resulting from entering
    certain input to a QTreeWidget using QLineEdit as an inline editor.

  * Fixed crash in the Ported Canvas example that occurred when creating a
    new canvas from one that was shrunk to its minimum size.

- I/O

  * Fixed divide by zero when loading malformed BMP files.

- Qt Assistant

  * Fixed a bug that prevented the view from scrolling to anchors within
    pages.

- Qt Designer

  * Fixed crash that could occur when pasting a QGridLayout into a
    QTabWidget.

  * Fixed the signals & slots connection editor to automatically scroll to 
    the correct items.

  * Fixed blocking behavior that would occur when previewing modal forms.

  * Made OK the default button in the "Promote to Custom Widget" dialog.

  * Ensured that main window forms that include size grips are repainted
    correctly when they are resized.

  * Fixed bug in Form Settings dialog - it wasn't possible to reset the
    "Pixmap Function" field.

- Qt Linguist

  * Fixed bug where lupdate would leave out the namespace part of the context.
  
  * Fixed bug in lupdate where the paths of the generated ts files was not 
    relative to the pro file.

  * Fixed bug in lupdate that caused strings that contained \r\n were not 
    translated.

  * Improved the user interface with some minor layout changes.

  * Improved handling of forms without layouts.

  * Fixed crash caused by navigating to the previous node when the current
    node was the first and topmost node.

  * Fixed bug in the preview translation feature where forms that did not
    have any layout got a height of 0.

  * Fixed bug where "Search and Translate" did not trigger a repaint on the
    items that got translated, leading people to believe that 
    "Search and Translate" did not work.

  * Fixed a layout problem with the "Search and Translate" dialog.

- qmake

  * Fixed crash that could occur when using the LIB_PATH variable if a .libs
    directory is located on one of the paths held by the variable.

  * Improved generation of Xcode projects to avoid problems with qmake
    project files that contain certain Qt-dependent declarations.

  * Improved support for Objective C sources in the Xcode project generator
    to ensure that they are added to the project's target.


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

- libpng

  * Security fix (CVE-2006-5793): The sPLT chunk handling code
    uses a sizeof operator on the wrong data type, which allows
    context-dependent attackers to cause a denial of service (crash)
    via malformed sPLT chunks that trigger an out-of-bounds read.

  * Security fix: Avoid profile larger than iCCP chunk.
    One might crash a decoder by putting a larger profile inside the
    iCCP profile than is actually expected.

  * Security fix: Avoid null dereference.

  * Disabled MMX assembler code for Intel-Mac platforms to work
    around a compiler bug.


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

General improvements
--------------------

- Accessibility

  * Fixed a potential assert when navigating menus while assistive tools are
    running.

  * Fixed a crash when getting accessibility information from an item view
    without a model.

  * Fixed item view accessibility bug where QAccessibleInterface::text()
    would return an empty string for child indexes larger
    than one.

- Item views

  * Fixed QHeaderView and QTableView overflow issues when the length
    of all the rows or columns went over the maximum allowed integer value.

  * When reset is emitted by a QAbstractItemModel, QHeaderView will now
    always update the header count().

  * Fixed incorrect scrolling in QHeaderView when items are hidden.

  * Fixed bug where QHeaderView would disappear if the sections were moved
    and the model was reset.

  * QDataWidgetMapper::mappedWidgetAt() now always returns the right
    mapped index for a widget no matter in which order they were inserted

  * Fixed crash due to incorrect update of persistent model indexes in
    QSortFilterProxyModel::layoutChanged().

  * Fixed bug that could cause QSortFilterProxyModel::removeRows() and
    QSortFilterProxyModel::removeColumns() to remove the wrong source model
    items.

  * Fixed bug in QSortFilterProxyModel that caused stale proxy mappings to
    remain when source model items were removed and later reinserted,
    resulting in an incorrect proxy model.

  * Fixed bug in QSortFilterProxyModel that caused items to not appear
    in a QTreeView when adding children to a formerly childless source item.

  * Fixed painting bug for spanning cells in QTableView when the item
    background is transparent.

  * Fixed regression in QListWidget and QTreeWidget that caused persistent
    indexes to not be updated when sorting items.

  * Enter key can now be used to start item editing when the edit trigger
    is AnyKeyPressed.

  * Fixed regression where QAbstractItemView::setRootIndex() wasn't
    always updating the view, causing possibly painting errors.

  * Fixed regression that caused incorrect propagation of Enter key press
    from a QAbstractItemView in editing mode.

  * Date and time editors are now initialized correctly with the current
    date and time.

  * QTableView tab focus handling has been improved. Although tab key
    navigation is enabled by default, you can tab out of a view if the
    model is either missing or unable to handle the key (e.g., an empty
    model).

  * Fixed bug in QItemDelegate that would scale decoration pixmaps.

  * Fixed buge that would not let the column delegate create the editor
    for an edited item.

  * Fixed bug where the QTableCornerButton would ignore the view
    selectionMode.

  * Fixed compatibility issue with QTreeWidgetItem serialization
    between Qt 4.2.x and Qt 4.(0/1).x.

  * Made sure the QTableWidget::cellEntered() signal is emitted
    correctly.

  * Made sure that commitData() uses the row/column delegate
    when these are set.

  * Fixed incorrect QTableView scrollbar ranges when rows were hidden.

  * Fixed QItemDelegate to let text be bottom aligned.

- Graphics View

  * The background cache in QGraphicsView is now properly initialized to
    the full viewport.

  * Fixed incorrect cursor updates when moving between items.

  * QGraphicsItem::setMatrix() now properly clears the original item before
    repainting.

  * QGraphicsEllipseItem is now only drawn as a full ellipse at angles that
    are multiples of 360 degrees (..., -720, -360, 360, 720, ...).

  * Fixed a crash when selecting one selectable item, then moving another
    movable item.

  * Fixed a crash during item construction caused by a pure virtual function
    call in QGraphicsItem.

  * Fixed mouse grabber book-keeping problems in QGraphicsScene which fell out
    of sync when opening modal dialogs or popups from within a mouse event
    handlers.

  * QGraphicsScene now forwards unhandled events to QObject, allowing the use
    of timers in QGraphicsScene subclasses.

- Meta-Object Compiler (moc)

  * Split long string literals in the generated code to work around
    limitations in MSVC.

  * Fixed crash on *BSD that could occur on invalid input.

- Painting

  * Improved numerical stability in the path stroker, fixing a crash when
    stroking paths containing curve segments whose control points are
    approximately on the same line.

  * Fixed raster paint engine memory corruption in QBitmap when source buffer
    was smaller than the destination buffer.

  * Avoid rounding errors when drawing parts of a pixmap using the Quartz 2D
    engine.

  * Added caching of QGradient's color table for the raster paint engine.
    This means that if a gradient with the same stops and colors is used
    again, it will be quickly fetched from the cache, avoiding the
    expensive calculations of the color lookup table.

  * Fixed a crash on Windows and with QImage caused by specifying
    Qt::CustomDashLine without an actual pattern.

  * Fixed a bug in the raster paint engine which would occasionally cause
    pixel errors when drawing polygons.

  * Fixed memory corruption in the OpenGL paint engine when drawing complex
    polygons with a cosmetic pen.

  * Fixed rendering of transformed brushes when drawing linear gradients
    with the OpenGL paint engine where the transformations used were not
    angle-preserving.

  * Improved handling of OpenGL errors.

  * Fixed bug in the raster paint engine where extra lines would be drawn
    when drawing a path partially outside the viewport using a dashed pen.

  * Fixed an assert in QImage that was triggered when reading PNG files
    with certain palettes.

  * Fixed an issue where stroking and drawing aliased QPainterPaths with a
    non-cosmetic pen would produce incorrect results.

  * Fixed an issue where text was cut off when drawn onto a QImage.

  * Fixed an issue where text would be drawn onto a QPicture with an
    incorrect position.

  * Fixed an issue where enabling/disabling clipping when drawing into a
    QImage did not have any effect.

  * Fixed bug in QImage::createHeuristicMask where the color table was not 
    initialized properly.

- Qt Resource Compiler (rcc)

  * Improved handling of relative paths in .qrc files.

- Style Sheets

  * Made general performance improvements.

  * Fixed crash that could occur when a widget with a style sheet was
    reparented into a widget with no style sheet.

  * Ensured that a widget's custom palette is not overwritten when not styled
    using a style sheet.

  * Added support to allow colors to be specified with alpha components.

  * Added support for group box styling.

  * Removed broken support for automatic image scaling.

- SQL plugins

  * Fixed incorrect translation of error strings in the Oracle plugin.
  
  * Made sure PQfreemem is called to free allocated buffers in PostgreSQL.

  * Fixed regression from Qt 4.1.4 behavior that prevented tables in schemas
    from working correctly in the SQL data models.

  * Prevented possible trailing garbage for TEXT fields in the MySQL plugin.

- Text handling

  * Fixed a bug in the Bidi algorithm.

- QAbstractItemView

  * Made commitData() more robust by ignoring cases in which no valid index
    is associated with the editor.

  * Ensured that the itemEntered() signal is emitted consistently on all
    platforms.

- QBrush

  * Ensured that transformations are correctly copied when brushes are copied.

- QCalendarWidget

  * Fixed setting the text format, correcting repainting and date resetting
    issues.

- QComboBox

  * Fixed wrong scroll arrows for the popup menu.

- QCompleter

  * Fixed issue where the highlighted() signal was emitted twice if
    setModel() was called twice.

  * Made completers usable inside dialogs.

- QDataStream

  * Fixed streaming of qreal on (embedded) platforms where qreal values are
    not equivalent to double values; i.e., sizeof(qreal) != sizeof(double).

- QDateTime/QDateTimeEdit

  * Fixed a bug that allowed you to type in larger numbers than 12 in 12-hour
    fields.

  * Fixed a bug that occurred when QDate::shortMonthName() was longer than
    3 characters.

  * Improved the handling of left-to-right languages.

- QDialogButtonBox

  * QDialogButtonBox now sets the default button to the first button with
    the Accept role if no other button has explicitly been set as the
    default when it is shown. This is to stop a regression where using the
    autoDefault property with the Mac and Cleanlooks styles would set the
    Cancel button as the default.

- QDir

  * Fixed an assert in QDir::entryList() when reading file entries with
    names containing invalid Unicode encodings.

- QFileDialog
  * Fixed bug that showed a non-existing folder for every space the user typed 
    after a dot (.) in the lineedit.

- QFileSystemWatcher

  * Fixed compilation on Linux/HPPA.

- QFSFileEngine

  * Fixed broken UNC path support.

- QIODevice

  * Fixed a data corruption bug when reading large blocks from devices
    opened in Text mode.

  * Fixed seeking to positions larger than the maximum allowed integer value.

- QLineEdit

  * Fixed scrolling in line edits with custom paddings.

  * Fixed crash on Linux when the text contains QChar::LineSeparator.

- QListView/QListWidget

  * Fixed bug with cursor navigation in cases where a grid size has been
    set.

  * Ensured that the drop indicator is not shown in icon view mode to avoid
    painting artifacts.

- QLocale

  * Fixed crash on Mac OS X and Windows caused when one of the separator
    strings was an empty string.

  * Fixed double to string conversion bug on embedded architectures.

- QMainWindow

  * Fixed bug allowing non-floatable dock widgets to be floated when the
    DockWidgetMoveable option is set.

  * Fixed several bugs in laying out docked QDockWidgets which have
    minimumSize() and/or maximumSize() set.

  * Improved saving and restoring of the state of main windows and their dock
    widgets when using saveState() and restoreState().

  * Fixed handling of dock widgets that are non-closable to the user so that
    they can be programmatically closed.

  * Fixed regression from Qt 4.1.4 behavior to ensure that palette changes
    to main windows are also propagated to their children.

- QMenuBar

  * Improved event handling to avoid sending events when a menu bar has no
    parent widget.

- QObject

  * Fixed memory leak when calling QObject::moveToThread(0).

- QPainter

  * Fixed reentrancy issue that would otherwise lead to crashes if more than
    one QImage is deleted at the same time (from different threads).

- QPalette

  * Improved handling of the palette obtained from QApplication::palette()
    in cases where QApplication::setStyle() has been called before a
    QApplication instance has been constructed (as recommended by the
    documentation).

- QPluginLoader

  * Fixed a potential crash that could occur when calling staticInstances()
    from a global destructor.

- QProgressBar

  * Document that drawing of text in vertical progress bars is style-dependent.

- QSqlRelationalTableModel

  * Ensured that the internal cache is correctly cleared when reverting
    inserted rows.

- QSvg

  * Improved parser robustness and parsing speed.

- QTextCodec

  * Fixed race-condition in QTextCodec::codecForLocale().

  * Fixed potential off-by-one string handling bug.

- QTextDocument

  * Fixed support for pixel font sizes in imported HTML.

- QTextOption

  * Ensured that the textDirection property is respected.

- QTextStream

  * Ensured that readLine() no longer treats "\r\n" as being two lines if
    called after QTextStream::pos().

- QToolButton

  * Fixed an issue where tool button popup menus were positioned incorrectly
    on multi-screen setups.

- QTreeView/QTreeWidget

  * Fixed possible assert when painting if there were layouts pending.

  * Fixed possible segfault when a model emits layoutChanged().

  * Fixed erroneous expanding/collapsing of items when the user
    double-clicked in the checkbox area of an item.

  * Fixed a crash in setRowHidden() caused by hiding then un-hiding items
    in a hierarchy.

  * Fixed setSortingEnabled() which could could cause incorrect painting.

- QVariant

  * Fixed behavior where conversion of invalid variants to integers would be
    incorrectly reported as successful.

  * Fixed a crash in the compatibility function QVariant::asByteArray()
    when called on a null variant.

- QWidget

  * Made setWindowTitle() work on hidden widgets that are never shown.
    (Fixing a bug in QtSingleApplication on Windows.)

  * Made QWidget::restoreGeometry() restore windows to the correct screen
    on multi-screen systems.

  * Fixed a bug where the stacking order of widgets would get out of sync
    and cause entire widgets, or parts of them, not to be updated properly.

  * Fixed QWidget::setParent() to not recreate the native window ID of
    all child widgets when reparenting the parent to top-level.

  * Fixed incorrect resize handling of dock widgets that are resized to the
    extent of the screen or to their maximum defined sizes.

- QWorkspace

  * Fixed memory corruption that caused crashes inside Visual Studio.

- QMessageBox

  * Made QMessageBox::setText() adjust the size of the text area
    when setting a new text. 

- QXmlInputSource

  * Ensured that QXmlInputSource does not read in the whole document at once,
    enabling arbitrarily large files to be parsed with QXmlSimpleReader.

- Qt3 support

  * Fixed QPainter::xForm() and QPainter::xFormDev().

  * Fixed crash in Q3IconView when selecting several items without releasing
    the left mouse button, then clicking the right mouse button.

  * Fixed incorrect behavior of setLabel() to replace labels rather than
    inserting more of them.

  * Ensured that Q3IconView is included in the Desktop Light package.

  * Fixed regression of a feature in Qt 4.1.4 by reintroducing support for
    Q3Accel.

- QDBus

  * Fixed getting and setting of invalid properties
    so the don't cause errors in in libdbus-1.

  * Fixed bug where QtDBus could generate invalid XML in some cases.

  * Fixed bug where QtDBus can sometimes generate names that break
    the standard.

  * Fixed crash in QtDBus when connecting a signal to a slot with
    less parameters.


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

X11
---

  * Fixed positioning of text with stacking diacritics.

  * Added fixes for Indic text rendering.

  * Fixed rendering of Greek and other latin scripts with XLFD fonts.

  * Fixed encoding detection of XLFD fonts.

  * Fixed crash in QX11EmbedContainer.

  * Ensured that QPrinter doesn't generate PDF when printing to raw CUPS
    printers.

  * Improved behavior of QPrintDialog so that, if CUPS is not installed or
    reports that no printers are available, it falls back to the printers
    set up for lpr/lprng.

  * Fixed paper size selection when printing with CUPS.

  * Suppressed/avoided the generation of floating point exceptions in the
    X11 paint engine.

  * Fixed an endianess issue when drawing QImages.

  * Fixed X errors when scaling/copying null pixmaps.

  * Fixed an issue where bitmap/XLFD fonts where drawn garbled.

  * Fixed X error when resizing to its minimum size.

  * Fixed widgets painted all black if the system palette contains X11
    color names.

  * Fixed loading plugins built in debug mode and linked against the
    default (release) build.

  * Fixed input of non-ascii chars in Qt widgets when application was
    run with empty LANG environment variable.

  * Fixed QApplication::hasPendingEvents() returning true even if no
    events were pending when using the Glib event dispatcher.

  * Fixed rare event loop dead-lock when posting many custom events to
    a receiver in another thread.

- QPlastiqueStyle

  * Disabled checked radio buttons and checkboxes are now rendered correctly.


Windows
-------

  * Fixed drawing of the 0xad character with symbol fonts.

  * Fixed stacking order of dialogs when a child is created before its
    parent.

  * Fixed printing to PDF when no printers are installed.

  * Fixed "print to file" dialog only showing once after it has been canceled.

  * Fixed name clashes in enum values when running dumpcpp (ActiveQt).

  * Fixed a lock-up in QNetworkInterface for machines with multiple network
    interfaces.

  * Fixed a lock-up in QAbstractSocket::waitForReadyRead() when 0 was passed
    as a timeout value.

  * Fixed "Invalid HANDLE" exception when a non-Qt thread that owns Qt
    objects terminates.

  * Fixed potential crash when calling QCoreApplication::applicationFilePath().

  * Fixed compilation problem with precompiled headers in qt3support. PCH is
    now disabled for qt3support.

  * Fixed issues with low-level keyboard handling for certain (international)
    keyboard layouts where input of accented characters would only work
    inconsistently.

  * Fixed bug in QWidget::setGeometry() caused by incorrectly taking the
    geometry of the window decoration into account.

  * Made it possible to load files in a Japanese environment.

  * Improved the appearance of dock widgets on Windows XP.

  * Fixed the appearance of the window menu when triggered with Alt-Space.

- QAxServer

  * Ensured that characters that some IStorage implementations don't support
    are removed from stream names.

  * Fixed regression that prevented ActiveQt controls from being activated
    once they had been closed.

- QSettings

  * Fixed potential deadlocks that could occur when saving settings,
    particularly if an error occurs while settings are being written.

Mac OS X
--------

  * Fixed a regression that made it impossible to drag images from non-Qt
    application to Qt applications.

  * Fixed an issue with flickering/disappearing widgets when the
    Qt::WA_MacMetalStyle attribute is set.

  * Updated the documentation to clarify QActionWidget behavior with regard
    to adding a QActionWidget to a menu in the menu bar and using the same
    menu as a popup.

  * Ensured that the correct QList<QUrl> is returned when dragging Finder
    items to Qt applications.

  * Documented how to debug with debug frameworks.

  * Fixed text selection in the PDF generator.

  * Fixed a bug where the cursor would not switch to the arrow cursor over
    child widgets with that cursor set.

  * Fixed incorrect handling of FramelessWindow modal dialogs to ensure that
    they do not have title bars and cannot be moved.

  * Fixed a crash that could occur when enabling "Accessibility for assistive
    devices" in System Preferences while a Qt application was running.

  * Fixed a painting error where a one-pixel border at the bottom-right
    corner of widgets wasn't being (re)painted correctly.

  * Fixed an item view scrolling bug where cell widgets were scrolled
    incorrectly.

  * Made handling of popup behavior depend on the window type to ensure that
    they are raised above other windows correctly.

  * Fixed crashes caused by incorrect pointer handling for contexts.

  * Ensured that the resize cursor shape is shown when the mouse cursor is
    positioned over the edges of floating dock widgets.

  * Fixed issue that caused menus to be opened behind widgets with the
    WindowStaysOnTopHint hint set.
    
  * Fixed handling of the QAssistantClient class for framework builds.

- QMacStyle

  * Fixed a crash that occurred when an invalid rectangle was given for an
    inactive button.
      
	  * Improved performance when rendering vertical gradients.
	
- QSystemTrayIcon

  * Ensured that the enable state of actions are properly handled and that
    aboutToShow() is emitted when appropriate.


- Qtopia Core

  * Fixed delivery of mouse events to overlapping popups.

  * VNC: Fixed use of the VNC driver with the Multi driver.

  * Fixed cursor state when switching between different screens.

  * Improved performance when using an accelerated mouse cursor.

  * Optimized linear gradient drawing using fixed point math for use on
    platforms without floating point hardware.

  * QCustomRasterPaintDevice::metric(): Fixed default values of PdmWidth and
    PdmHeight.

  * Fixed bug in QWidget::setMask().

  * Fixed incorrect line edit editing behavior where the contents would be
    cleared even for read-only line edits in certain situations.

  * Fixed calibration of rotated screens in the Mouse Calibration example.

  * Fixed setMode() in the LinuxFb, VNC and Transformed screen drivers.

  * Fixed crash when using QWSCalibratedMouseHandler with filter size < 3.

  * Fixed QScreen::alloc() for non-default color maps.

  * Fixed a bug preventing a QWSEmbedWidget from being displayed if the
    remote widget was hidden before it was embedded.

  * Fixed screen area reservation when using the QDirectPainter class.

  * Fixed compilation of the MySQL driver when using the minimum
    configuration.

  * Fixed left-to-right positioning for menu items in XP style.

- QVFb

  * Fixed crash that could occur when switching between certain skins.

  * Fixed crash that could occur when recording.

  * Enabled saving of animations in locations other than in /tmp.

- QWhatsThis

  * Fixed the unintentional double shadow effect for "What's This?" help.


****************************************************************************
*                             QTestLib                                     *
****************************************************************************

   * Added missing documentation for the QVERIFY2 macro.
