Qt 4.3 introduces many new features as well as many improvements and
bugfixes over the 4.2.x series. For more details, see the online
documentation which is included in this distribution. The
documentation is also available at http://qt.nokia.com/doc/4.3

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

The Qtopia Core version 4.3 series is binary compatible with the 4.2.x
series except for some parts of the device handling API, as detailed
in Platform Specific Changes below.

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

  http://qt.nokia.com/developer/task-tracker

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

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

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

- Configuration/Compilation
    * Fixed OpenBSD and NetBSD build issues.

- Legal
    * Added information about the OpenSSL exception to the GPL.

- Documentation and Examples
    * Added information about the TS file format used in Linguist.
    * Moved platform and compiler support information from
      website into the documentation.
    * Added an Accessibility overview document.
    * Added new example to show usage of QCompleter with custom tree models.

- Translations
    * Added a Slovak translation of Qt courtesy of Richard Fric.
    * Added a Ukrainian translation of Qt courtesy of Andriy Rysin.
    * Added a Polish translation of the Qt libraries and tools courtesy of
      Marcin Giedz, who also provided a Polish phrasebook for Qt Linguist.
    * [155464] Added a German translation for Qt Designer.

- Added support for the CP949 Korean Codec.

- [138140] The whole Qt source compiles with the QT_NO_CAST_FROM_ASCII
  and QT_NO_CAST_TO_ASCII defines and therefore is more robust when
  using codecs.

- Added support for HP-UX 11i (Itanium) with the aCC compiler

- Changed dialogs to respond much better to the LanguageChange event.
  (i.e. run time translation now works much better.)

- Signals and slots
    * [61295] Added Qt::BlockingQueuedConnection connection type, which
      waits for all slots to be called before continuing.
    * [128646] Ignore optional keywords specified in SIGNAL() and SLOT()
      signatures (struct, class, and enum).
    * Optimize emitting signals that do not have anything connected to them.

- [121629] Added support for the MinGW/MSYS platform.

- [102293] Added search path functionality (QDir::addSearchPath)

- Almost all widgets are now styleable using Qt Style Sheets.

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

- Updated Qt's SQLite version to 3.3.17.

- Updated Qt's FreeType version to 2.3.4.

- Updated Qt's libpng version to 1.2.16.

- Added libtiff version 3.8.2 for the TIFF plugin.

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

- QAbstractButton
    * [138210] Ensured strictly alternating ordering of signals resulting
      from auto-repeating shortcuts. Fixed a repeat timer bug that cause
      cause infinite retriggering to occur.
    * [150995] Fixed bug where non-checkable buttons take focus when
      activating shortcuts.
    * [120409] Fixed bug where the button was set to unpressed when the
      right mouse button was released.

- QAbstractItemView
    * [111503] Ensured that focus is given back to the view when the Tab key
      is pressed while inside an editor.
    * [156290] Use slower scrolling when the ScrollMode is set to
      ScrollPerItem.
    * Ensured that the item view classes use the locale property when
      displaying dates and numbers to allow easy customization.
    * Fixed a repaint issue with the focus rectangle in cases where
      selection mode is NoSelection.
    * [147422] Detect when persistent editors take/lose focus and update the
      view accordingly.
    * [146292] Items are now updated even if they contain an editor.
    * [130168] Auto-scrolling when clicking is now delayed to allow
      double-clicking to happen.
    * [139247] Fixed bug where clicking on a partially visible item was
      triggering a scroll and the wrong item was then clicked.
    * [137729] Use dropAction() instead of proposedAction() in
      QAbstractItemView::dropEvent().
    * Fixed a bug that prevented keyboardSearch() from ignoring disabled
      items.
    * [151491] Ensured that we pass a proper MouseButtonPress event in
      QAbstractItemView::mouseDoubleClickEvent().
    * [147990] Ensured that double-clicking does not open an editor when
      the edit trigger is set to SelectedClicked.
    * [144095] Ensured that sizeHintForIndex() uses the correct item
      delegate.
    * [140180] Ensured that clicking a selected item clears all old
      selections when the view is using the ExtendedSelection selection mode
      and SelectedClicked as an edit trigger.
    * [130168] Fixed bug where double clicking on partially visible items
      would not activate them.
    * [139342] Allow editing to be started programatically, even if there
      are no edit triggers.
    * [130135] Added public slot, updateIndex(const QModelIndex &index).

- QAbstractProxyModel
    * [154393] QAbstractProxyModel now reimplements itemData().

- QAbstractSlider
    * [76155] Fixed bug where the slider handle did not stop under the
      mouse.

- QAbstractSocket
    * [128546] Fixed bug where an error was emitted with the wrong type.

- QAccessible
    * Added preliminary support for the upcoming IAccessible2 standard.
    * Made improvements to most of the accessible interfaces.
    * [154534] Ensured that our accessible interfaces honour
      QWidget::setAccessibleName() and QWidget::setAccessibleDescription().
    * Avoid crash if QAccessibleInterface::object() returns 0.
      (It is absolutely legal to return a null value.)

- QApplication
    * Added a flash() method for marking windows that need attention.
    * [86725] Allow the -style command line argument to override a
      style set with QApplication::setStyle() before QApplication
      construction.
    * [111892] Fixed a bug that caused Qt to steal all input when
      connecting the QAction::hovered() signal to a slot that called
      QMainWindow::setEnabled(false).
    * [148512] Fixed QApplication::keyboardModifiers() to update
      correctly when minimizing the window when Qt::MetaModifier is held
      down.
    * [148796] Fixed a bug that prevented Qt from detecting system font
      changes.
    * [154727] Prevent a crash when a widget deletes itself in an key
      event handler without accepting the event.
    * [156484] Fixed a bug where lastWindowClosed() was emitted for each
      top-level window when calling QApplication::closeAllWindows().
    * [157667] Ensured that widgets with the Qt::WA_DeleteOnClose property
      set are properly deleted when they are closed in the dropEvent()
      handler following a drag that was started in the same application.
    * [156410] Implemented QEvent::ApplicationActivate and
      QEvent::ApplicationDeactivate on all platforms. Note that
      QEvent::ApplicationActivated and QEvent::ApplicationDeactivated are
      now deprecated.

- QAtomic
    * [126321] Fixed several flaws in the inline assembler implementations
      for several architectures (ARM, i386, PowerPC, x86-64).
    * [133043] Added support for atomic fetch-and-add.

- QAuthenticator
    * New Class. Needed for authentication support in the Network module.
      Currently supports the Basic, Digest-MD5 and NTLM authentication
      mechanisms.

- QBitArray
    * [158816] Fixed crash in operator~().

- QCalendarWidget
    * Don't set maximum width for month/year buttons.
    * Ensured that the QPalette::Text role is used for default text.
    * Added a date editor which can be configured with the dateEditEnabled
      and dateEditAcceptDelay properties.
    * [137031] Ensured that grid lines are drawn properly when headers are
      not visible.
    * [151828] Ensured that the language can be set with
      QCalendarWidget::setLocale().

- QChar
    * Updated the Unicode tables to Unicode 5.0.
    * Added foldCase() and toTitleCase() methods.
    * Added public API to handle the full Unicode range.

- QCleanlooksStyle
    * [129506] Sliders now look and behave correctly in both reversed and
      inverted appearance modes.
    * [131490] Group boxes no longer reserve space for their titles when no
      title is set.
    * [134344] A sunken frame is now used to indicate checked menu items
      with icons.
    * [133691] Improved the appearance of spin boxes and buttons when used
      against dark backgrounds.
    * [154499] Fixed a rendering issue with disabled, checked push buttons.
    * [154862] Fixed an issue causing combo boxes to sometimes show clipped
      text.
    * Slider appearance is now based on Clearlooks Cairo and the performance
      on X11 has been improved.
    * The appearance of tab bars when used with Qt::RightToLeft layout
      direction has been improved.
    * Dock widget titles are now elided if they are too long to fit in the
      available space.

- QClipboard
    * Ensured that calling clear() on the Mac OS X clipboard really clears
      its data.
    * [143927] Don't drop alpha channel information when pasting pixmaps on
      Mac OS X.
    * The Mac OS X clipboard support now understands TIFF information and
      can export images as TIFF as well.
    * [145437] Fixed crash that could occur when calling setMimeData() twice
      with the same data.
    * QMacMime now does correct normalization of file names in a URL list
      from foreign applications.

- QColor
    * [140150] Fixed bug where QColor::isValid() would return true for
      certain invalid color strings.
    * [120367] Added QColor::setAllowX11ColorNames(bool), which enables
      applications to use X11 color names.
    * Fixed internal errors in toHsv() due to inexact floating point
      comparisions.

- QColorDialog
    * [131160] Enabled the color dialog to be used to specify an alpha color
      on Mac OS X.

- QColumnView
    * A new widget that provide a column-based implementation of
      QAbstractItemView.

- QComboBox
    * Significantly reduced the construction time of this widget.
    * [155614] Speeded up addItem() and addItems().
    * [150768] Ensured that inserting items doesn't change the current text
      on editable combo boxes.
    * [150902] Ensured that only the left mouse button can be used to open
      the popup list.
    * [150735] Fixed pop-up hiding behind top-level windows on Mac OS X.
    * [156700] Fixed bug where the popup could be closed when pressing the
      scroll arrows.
    * [133328] Fixed bug where disabled entries were not grayed out.
    * [134085] Fixed bug where the AdjustToContents size policy had no
      effect.
    * [152840] Fixed bug where QComboBox would not automatically scroll to
      the current item.
    * [90172] Fixed bug where the sizeHint() implementation iterated over
      all icons to detect their availability.

- QCompleter
    * Significantly reduced the construction time of this widget.
    * Added support for lazily-populated models.
    * [135735] Made QCompleter work when used in a QLineEdit with a
      QValidator.
    * Added the wrapAround property to allow the list of completions to
      wrap around in popup mode.
    * Added support for sharing of completers, making it possible for the
      same QCompleter object to be set on multiple widgets.
    * [143441] Added support for models that sort their items in descending
      order.

- QCoreApplication
    * Added support for posted event priorities.
    * [34019] Added the QCoreApplication::removePostedEvents() overload
      for removing events of a specific type.
    * Documented QCoreApplication::processEvents() as thread-safe;
      calling it will process events for the calling thread.
    * Optimized delivery of QEvent::ChildInserted compatibility events.
    * [154727] Enabled compression of posted QEvent::DeferredDelete events
      (used by QObject::deleteLater()) to prevent objects from being deleted
      unexpectedly when many such events are posted.
    * Ensured that duplicate entries in library paths are ignored.

- QCryptographicHash
    * New Class. Provides support for the MD4, MD5 and SHA1 hash functions.

- QCursor
    * [154593] Fixed hotspot bug for cursors on Mac OS X.
    * [153381] Fixed crash in the assignment operator in cases where the
      cursor was created before a QApplication instance.

- QDataWidgetMapper
    * [125493] Added addMapping(QWidget *, int, const QByteArray &) and
      mappedPropertyName(QWidget *) functions.

- QDateTime
    * [151789] Allow passing of date-only format to QDateTime::fromString()
      (according to ISO 8601).
    * [153114, 145167] Fixed bugs that could occur when parsing strings to
      create dates.
    * [122047] Removed legacy behavior which assumed that a year between 0
      and 99 meant a year between 1900 and 1999.
    * [136043] Fixed the USER properties.

- QDateTimeEdit
    * [111557, 141266] Improved the behavior of the widget with regard to
      two-digit years. Made stepping work properly.
    * [110034] Don't change current section when a WheelEvent is received.
    * [152622] Don't switch section when a FocusInEvent is received if the
      reason is Popup.
    * Fixed a bug that would cause problems with formats like dd.MMMM.yyyy.
    * [148522] Ensured that the dateRange is valid for editors that only
      show the time.
    * [148725] Fixed a bug with wrapping and months with fewer than 31 days.
    * [149097] Ensured that dateTimeChanged() is emitted, even if only date
      or time is shown.
    * [108572] Fixed the behavior to ensure that typing 2 into a zzz field
      results in a value of 200 rather than 002.
    * Ensured that the next field is entered when a separator is typed.
    * [141703] Allow empty input when only one section is displayed.
    * [134392] Added a sectionCount property.
    * [134392] Added sectionAt(), currentSectionIndex(), and
      setCurrentSectionIndex() functions.
    * Added a NoButtons value for the buttonSymbols property.

- QDesktopWidget
    * [135002] Ensured that the resized() signal is emitted after the
      desktop is resized on Mac OS X.

- QDial
    * [151897] Ensured that, even with tracking disabled, the signal
      sliderMoved() is always emitted.
    * [70209] Added support for the inverted appearance property.

- QDialog
    * [131396] Fixed a crash in QDialog::exec() that could occur when the
      dialog was deleted from an event handler.
    * [124269] Ensured that the size grip is hidden for extended dialogs.
    * [151328] Allow the use of buttons on the title bar to be explicitly
      specified on Mac OS X.

- QDialogButtonBox
    * [154493] Moved the Action role before the Reject role on Windows to
      conform with platform guidelines.

- QDir
    * [136380] QDir's permission filters on Unix now behave the same as on
      Windows (previously the filters' behavior was reversed on Unix).
    * [158610] Passing QDir::Unsorted now properly bypasses sorting.
    * [136989] Ensured that removed dirs are reported as non-existent.
    * [129488] Fixed cleanPath() for paths with  the "foo/../bar" pattern.

- QDirIterator
    * New class. Introduced to provide a convenient way to examine the
      contents of directories.

- QDockWidget
    * [130773] Ensure that dock widgets remember their undocked positions
      and sizes.
    * Added support for vertical title bars, which can be used to save space
      in a QMainWindow.
    * Added support for setting an arbitrary widget as a custom dock widget
      title bar.
    * [141792] Added the visibilityChanged() signal which is emitted when
      dock widgets change visibility due to show or hide events, or when
      being selected or deselected in a tabbed dock area.
    * Added the dockLocationChanged() signal which is emitted when dock
      widgets are moved around in a QMainWindow.
    * [135878] Titlebars now support mnemonics properly.
    * [138995] Dock widget titlebars now correctly indicate their activation
      state.
    * [145798] Ensured that calling setWindowTitle() on a nested, docked
      dock widget causes the title in the tab bar to be updated.

- QDomDocument
    * [128594] Ensured that comment nodes are indented correctly when
      serializing a document to a string.
    * [144781] Fixed crash that would occur when the owner document of new
      attributes was not adjusted.
    * [107123] Ensured that appendChild() does not erroneously add two
      elements to document nodes in certain cases.

- QDoubleSpinBox
    * [99254] Allow higher settings for decimals.

- QDrag
    * [124962] Added QDrag::exec() to allow the default proposed action to
      be changed.

- QFile
    * [128352] Refactored the backend on Windows with major performance
      improvements; in particular line and character reading is now much
      faster.
    * [146693] Fixed a lock-up in copy().
    * [148447] QFile now supports large files on Windows where support is
      available.
    * Generally improved support for stdin.
    * Byte writing performance has improved on all platforms.
    * [151898] Added support for reading lines with an embedded '\0'
      character.

- QFileDialog
    * Updated the dialog to use native icons.
    * Made general improvements to the dialog's performance.
    * Added a sidebar to show commonly used folders.
    * [134557] Added the ability to use a proxy model.
    * Added dirEntered() and filterSelected() signals, previously found in
      Qt 3's file dialog.
    * [130353] Fixed Qt/Mac native file dialog pattern splitting
    * [140332] Made the dialog respond much better to the LanguageChange
      event.
    * [154173] Fixed a memory deallocation error.
    * Made the selected filter argument work for native Mac OS X file
      dialogs.

- QFileInfo
    * Ensured that the value of Mac FS hidden flag is returned for symbolic
      links and not their targets; i.e., hidden links are not followed.
    * [128604] Introduced isBundle() for Mac OS X bundle types.
    * [139106] Fixed bug that could cause drives to be reported as hidden
      on Windows.

- QFileSystemWatcher
    * [155548] Reliability fixes.
    * When in polling mode, send change notification when file permissions
      change.
    * [144049, 149637] Fixed a bug that prevented watching a directory
      for notification on Windows.
    * [143381] Fixed bug that caused addPath() and removePath() to fail when
      passing an empty string.

- QFocusFrame
    * [128713, 129126] Made the focus frame visible in more situations on
      Mac OS X.

- QFont
    * X11: Add a method to retrieve the FreeType handle from the QFont.

- QFontComboBox
    * [132826] Fixed a bug that could cause the popup list to be shown
      off-screen.
    * [155614] Speeded up addItem() and addItems().
    * [160110] Fixed crash that could occur when setting a pixel size for
      the fonts.

- QFontMetrics
    * [152013] Fixed bug where boundingRect() gave sizes that were too large
      when compiled using Visual Studio 6.
    * [145980] Added tightBoundingBox() method.

- QFrame
    * [156112] Fixed bug where the default frame was not correct when
      created without a parent and reparented afterwards.
    * [150995] Fixed bug where setting the frame style did not invalidate
      the size hint

- QFSFileEngine
    * Fixed bug in fileTime() on Win98 and WinME
    * Ensured that the working directory of a Windows shortcut is set when
      a link is created.
    * Improved the reliability of buffered reads on platforms that cache
      their EOF status.

- QFtp
    * [107381] Greatly improved LIST support; QFtp now supports more server
      types.
    * [136008] Improved tolerance for servers with no EPRT/EPSV support.
    * [150607] Fixed a race condition when using ActiveMode for uploading.

- QGL
    * [158971] Fixed a resource leak in the GL texture cache.

- QGLFramebufferObject
    * Made it possible to configure the depth/stencil buffer in a
      framebuffer object.
    * Added support for floating point formats for the texture in a
      framebuffer object.

- QGLPixelBuffer
    * [138393] Made QGLPixelbuffer work under Windows on systems without the
      render_texture extension.

- QGLWidget
    * [145621] Avoided a QGLFormat object copy when checking the buffer
      format with the doubleBuffer() function.
    * [100519] Rewritten renderText(). It now supports Unicode text, and it
      doesn't try to overwrite previously defined display lists.

- QGraphicsItem
    * [151271] Fixed crash that could occur when calling update on items
      that are not fully constructed.
    * Ensured that the selected state no longer changes state twice
      for each mouse click.
    * [138576] setParent() now correctly adds the child to the parent's
      scene.
    * [130263] Added support for partial obscurity testing with the
      isObscured(QRectF) function.
    * [140725] QGraphicsTextItem is now also selectable when editable.
    * [141694] QGraphicsTextItem now calls ensureVisible() if it has input
      focus.
    * [144734] Fixed bugs in unsetCursor().
    * [144895] Improved bounding rectangle calculations for all standard
      items.
    * Added support for QTransform.
    * [137055] Added QGraphicsItem::ItemPositionHasChanged and
      ItemTransformHasChanged.
    * Added several convenience functions.
    * [146863] Added ItemClipsToShape and ItemClipsChildrenToShape clipping
      flags.
    * [139782] Greatly improved hit and selection tests.
    * [123942] Added the ItemIgnoresTransformations flag to allow items to
      bypass any inherited transformations.
    * All QGraphicsItem and standard item classes constructors have now had
      their scene arguments obsoleted.
    * [150767] Added support for implicit and explicit show and hide.
      Explicitly hidden items are no longer implicitly shown when their
      parent is shown.
    * [151522] Fixed crash when nesting QGraphicsItems that enabled child
      event handling.
    * [151265] Cursors now change correctly without mouse interaction.
    * Added deviceTransform() which returns a matrix that maps between item
      and device (viewport) coordinates.
    * Added the ItemSceneChange notification flag.
    * [128696] Enabled moving of editable text items.
    * [128684] Improved highlighting of selected items.

- QGraphicsItemAnimation
    * [140522] Fixed special case interpolation bug.
    * [140079] Fixed ambiguity in the position of insertions when multiple
      items are inserted for the same step in an animation.

- QGraphicsScene
    * [130614] Added the invalidate() function for resetting the cache
      individually for each scene layer.
    * [139747] Fixed slow memory leaks caused by repeatedly scheduling
      single-shot timers.
    * [128581] Added the selectionChanged() signal which is emitted when
      the selection changes.
    * Introduced delayed item reindexing which greatly improves performance
      when moving items.
    * The BSP tree implementation has undergone several optimizations.
    * Added new bspTreeDepth property for fixating the BSP tree depth.
    * Optimization: Reduced the number of unnecessary index lookups.
    * [146518] Added the selectionArea() function.

- QGraphicsSceneWheelEvent
    * [146864] Added wheel orientation.

- QGraphicsView
    * [136173] Hit-tests are now greatly improved for thin items.
    * [133680] The scroll bars are now shown at their maximum extents
      instead of overflowing when the transformed scene is larger than
      the maximum allowed integer range.
    * [129946] Changing the viewport no longer resets the acceptsDrops()
      property.
    * [139752] ScrollHandDrag is now allowed also in non-interactive mode.
    * [128226] Fixed rubber band rendering bugs (flicker and transparency).
    * [144276] The selection is no longer reset by scroll-dragging.
    * Added support for QTransform.
    * [137027] Added new viewportUpdateMode() property for better control
      over how QGraphicsView schedules updates.
    * Several convenience functions have been added.
    * [146517] Added rubberBandSelectionMode() for controlling how items are
      selected with the rubber band.
    * [150344] Fixed the scroll bar ranges to prevent the scroll bars from
      hiding parts of the scene.
    * [150321] Added new optimizationFlags() property, allowing individual
      features to be disabled in order to speed up rendering.
    * The level of detail algorithm has been changed to improve support for
      transformations that change the view's aspect ratio.
    * [154942] Fixed background rendering in render().
    * [156922] render() now properly supports all transformations, source
      and target rectangles.
    * [158245] Calling setScene(0) now implicitly calls update().
    * [149317] Added NoViewportUpdate to the set of modes that can be set
      for updating a view.

- QGridLayout
    * [156497] Fix a one-off error that could cause the bottom button in
      a QDialogButtonBox to be cropped.

- QHeaderView
    * This widget now uses Qt::NoFocus as its default focus policy.
    * [99569] Improved performance, providing up to a 2x speed increase for
      some cases.
    * [146292] Fixed bug that made it impossible to resize the last section
      under certain circumstances.
    * [144452] Fixed bug that caused setDefaultAlignment() to have no
      effect.
    * [156453] Fixed column resizing bug that could cause branches in one
      column to be drawn in the next.
    * [142640] Ensured that the Qt::SizeHintRole is used when available.
    * [142994] Hidden items are now restored to their original size when
      shown.
    * [127430] Added saveState() and restoreState().
    * [105635] Added support for drag selecting.

- QHostInfo
    * [141946] No longer stops working after QCoreApplication is destroyed.
    * [152805] Now periodically reinitializes DNS settings on Unix.

- QHttp
    * [139575] Fixed state for servers that use the "100 Continue" response.
    * Added support for the HTTPS protocol.
    * Improved proxy support.
    * Added support for server and proxy authentication.

- QIcon
    * Added cacheKey() as a replacement for serialNumber().
    * Fixed the streaming operators.

- QImage
    * [157549] Fixed a crash that could occur when calling copy() with
      negative coordinates.
    * Added cacheKey() as a replacement for serialNumber().
    * [131852] Optimized rotations by 90 and 270 degrees.
    * [158986] Fixed painting onto an images with the Format_RGB16 image
      format.
    * Fixed rotations by 90 and 270 degrees for images with the Format_RGB16
      image format.
    * [152850] Fixed bugs in text() and setText().
    * Fixed a crash that could occur when passing a 0 pointer to the
      constructor that accepts XPM format image data.
    * [150746] Added a constructor that accepts an existing memory buffer
      with non-default stride (bytes per line).

- QImageReader
    * [141781] Fixed support for double byte PPM files (>256 colors).

- QImageWriter
    * Added support to enable compression if a plugin supports it.

- QInputDialog
    * [115565] Disabled OK button for non-acceptable text (getInteger() and
      getDouble()).
    * [90535] Input dialogs now have a size grip

- QIntValidator, QDoubleValidator
    * Validators now use the locale property to recognize numbers
      formatted for various locales.

- QItemDelegate
    * [145142] Ensured that text is not drawn outside the bounds of a cell.
    * [137198] Fixed handling of cases where the decoration position is set
      to be at the bottom of an item to prevent the text from being
      incorrectly positioned.
    * [142593] Take word wrap into account when calculating an item's size
      hint.
    * [139160] Ensured that the focus rectangle is shown, even for empty
      cells.

- QItemSelectionModel
    * Made optimizations for some common cases.
    * [143383] Fixed incorrect behavior of hasSelection().

- QLabel
    * [133589] Fixed performance problems with plain text labels.
    * Fixed support for buddies with rich text labels.
    * [136918] Fixed setText() to not turn off mouse tracking when the text
      used is plain text.
    * [143063] Ensured that the mouse cursor is reset when a link is
      clicked.
    * [156912] Fixed bug where the mouse cursor shape was changed to the
      pointing hand cursor, but would not be correctly cleared afterwards.

- QLayout
    * Added new features to Qt's layout system to enable:
      - independent values for all of the four margins,
      - independent horizontal spacing and vertical spacing in QGridLayout,
      - non-uniform spacing between layout items,
      - layout items to occupy parts of the margin or spacing when required
        by the application or style.

- QLibrary
    * Fixed bug that caused QLibrary::load() to discard the real error
      message if the error was something else than ERROR_MOD_NOT_FOUND.
      (Win32)
    * Fixed bug that prevented QLibrary::load() from loading a library with
      no suffix (because LoadLibrary automagically appended the .dll suffix
      on Win32).
    * Corrected behavior of fileName() to ensure that, if we loaded a
      library without specifying a suffix and the file found had the .dll
      suffix, the fileName found is returned instead of the fileName
      searched for (as was previously the case).
    * [156276] Fixed behavior of unload() to return true only if the library
      could be unloaded.

- QLineEdit
    * [156104] Ensured that input methods are disabled when not in the
      Normal edit mode.
    * [157355] Fixed drag and drop bug on Mac OS X that could occur when
      dragging inside the widget.
    * [151328] Ensured that the caret is removed when text is selected on
      Mac OS X.
    * [136919] Ensured that fewer non-printable characters are replaced
      with spaces.

- QList
    * Fixed a race-condition in QList::detach() which could cause an
      assertion in debug mode.

- QListView
    * [136614] Fixed the behavior of Batched mode to ensure that the last
      item of the batch is displayed.
    * Fixed some issues with jerky scrolling in ScrollPerItem mode if the
      grid size was different to the delegate's size hint.
    * [113437] Prevent noticeable flicker on slow systems in Batched mode
      by laying out the first batch immediately.
    * [114473] Added a new property to QListView: selectionRectVisible.
    * Fixed a bug that could cause too many items to be selected.
    * Fixed issue that could cause list views to have incorrect scroll bar
      ranges if their grid sizes differed from their item sizes.
    * [144378] Improved navigation for cases where an item is taller than
      the viewport.
    * [148846] Fixed an issue that prevented scroll bars from being updated
      correctly when items were moved programmatically.
    * [143306] Improved support for keyboard navigation and selection.
    * [137917] Shift-click extended mode selection in icon mode now selects
      the correct items.
    * [138411] Fixed bug where hidden items would cause drawing problems
      when pressing Ctrl+A.

- QListWidget
    * [146284] Ensured that the effect of SingleSelection mode is also taken
      into account when setSelected() is called on items.
    * [151211] Added removeCellWidget() and removeItemWidget() functions.

- QLocale
    * Updated the locale database to CLDR 1.4: more locales supported;
      numerous fixes to existing locales.

- QMacStyle
    * [159270] Fixed drawing of icons on buttons with no text.
    * [146364] Fixed drawing of multi-line text for items in a QToolBar.
    * [145346] Removed unwanted wrapping of text in a QPushButton.
    * Fixed drawing of "Flat" group boxes.
    * [113472] Fixed drawing of text on vertical headers when resizing.
    * [148509] Ensured that the correct font is used for buttons and labels
      when the application is not configured to use the desktop settings.
    * [106100] Improved the look of push buttons with menus.
    * Made fixes to Qt's layout system that enable more native-looking
      forms.
    * [151739] Buttons with an icon are now centered correctly.
    * [142672] Fixed font size bug on the drop down box for QComboBox.
    * [148832] The button on a combo box is now showing as pressed when the
      drop down menu is shown.
    * [147377] Ensured that combo boxes now scale correctly on Mac OS X.
    * [143901] Fixed the highlight color for widgets such as QComboBox so
      that it follows the system settings on Mac OS X.
    * [151852] Fixed size calculation for QPushButton with an icon.
    * [133263] Removed the coupling of text size and button kind, enabling
      them to be set independently.
    * [133263] Ensured that QPushButton respects calls to setFont().
    * [141980] Text with small font sizes is now centered vertically correct
      inside push buttons.
    * [149631] Ensure that beveled button types are chosen if text doesn't
      fit inside a button instead of cutting the text.
    * [151500] Fixed incorrect QPushButton text clipping behavior.
    * [147653] Fixed bug that caused the sort indicator to be drawn on top
      of the text in QHeaderView.
    * [139149] Fixed issues with CE_SizeGrip in right-to-left mode.
    * [139311] Improved drawing of the title in QGroupBox.
    * [128713] Ensured that drawing of the focus frame now follows pixel
      metrics.
    * [142274] Made QSlider tickmark drawing more like Cocoa.
    * focusRectPolicy() is now obsolete. This is now controlled by the
      Qt::WA_MacShowFocusRect attribute.
    * widgetSizePolicy() is now obsolete. This is now controlled by the
      Qt::WA_Mac*Size attribute.
    * [129503] Ensured that a group box without a title no longer allocates
      space for it.
    * Ensured that a more appropriate width is used for push buttons.
    * [132674] Ensured that tab bar drawing is correct when the tab's font
      isn't as tall as the default.
    * [126214] Ensured that the QSizeGrip is drawn correctly in brushed
      metal windows.
    * Improved styling of docked QDockWidgets.

- QMainWindow
    * [145493] Fixed a crash that could occur when calling setMainWindow(0)
      on X11.
    * [137013, 158094] Fixed bugs relating to the handling of size hints,
      minimum/maximum sizes and size policies of QDockWidgets in main
      windows.
    * [147964] Animated tool bar areas adjust dynamically when a QToolBar is
      dragged over them.
    * Added the dockOptions property. This makes it possible to:
        - specify that tabbed dock areas should have vertical tab bars,
        - disable tabbed docking altogether,
        - force tabbed docking, disallowing the placement of dock widgets
          next to each other.
    * Fixed bugs in saving and restoring main window state.
    * [143026] Fixed support for hiding and showing toolbars on Mac OS X.
    * [131695] Add unified toolbar support on Mac OS X.

- QMdiArea
- QMdiSubWindow
    * New classes. QMdiArea is a replacement for QWorkspace.

- QMenu
    * The addAction() overloads that accept a slot argument now honor the
      slot's bool argument correctly.
    * [129289] Added support for handling context menus from within a menu.
    * [144054] Fixed scrolling logic.
    * [132524] Allow setVisible() of separator items on Mac OS X native
      menu items.
    * [131408] Torn-off menus now have fixed sizes to prevent the window
      system from resizing them.
    * [113989] Added some fuzziness to the "snap to" detection.
    * [155030] Do not disable command actions when merge is disabled.
    * [131702] Tear-off menus no longer appear only once.
    * [138464] Ensured that, if a popup menu does not fit on the right-hand
      side of the screen, it is aligned with the right side of the parent
      widget instead of the left side.
    * [130343] Ensured that only the left mouse button triggers menu actions
      on Windows.
    * [139332] Fixed an issue that caused submenus to close when moving the
      mouse over a separator.
    * [157218] Ensured that torn-off menus are not closed when Alt is
      pressed.
    * [135193] Ensured that the size hint, maximum size and minimum size are
      taken into account for each QWidgetAction.
    * [133232] Improved handling of menus that are opened at specified
      positions.
    * [141856] Fixed bug where exec() would return NULL if the user pressed
      a mnemonic shortcut.
    * [133633] Fixed focus problem with keyboard navigation between menus
      and widget actions.
    * [134560] Fixed bug that prevented status tips from being shown for
      actions in tool button menus.
    * [150545] Fixed memory leak on Mac OS X.
    * [138331] Fixed bug that could cause menus to stay highlighted after
      the closing of a dialog.
    * Menu shortcuts are now cleared if the corresponding QAction is cleared
      on Mac OS X.
    * Fixed bug that could cause changes to shortcut to not take effect on
      Mac OS X.
    * [12536] Don't allow Tab to be used to navigate menus on Mac OS X.
    * [108509] Prevented shortcuts from stealing keyboard navigation keys.
    * [134190] Added support for Shift+Tab to enable backwards navigation.

- QMenuBar
    * [135320] Make show() a no-op on Mac OS X to prevent the menu bar from
      being visible at the same time as a native Mac menu bar.
    * [115471] Fixed torn-off menu behavior to ensure that mouse events
      are propagated correctly on second level tear-offs.
    * [126856] Fixed an issue that could cause several menus to be open at
      the same time.
    * [47589] The position of the menu is now shifted horizontally when
      there is not enough space (neither above nor below) to display it.
    * [131010] Fixed bug where adding an action and setting its menu would
      prevent the action from being triggered through its shortcut.
    * [142749] Fixed bug where setEnabled(false) had no effect on Mac OS X.
    * [141255] Made it possible to make an existing menu bar an application-
      wide menu bar with setParent(0) on Mac OS X.

- QMessageBox
    * [119777] Ensured that pressing Ctrl+C in message boxes on Windows
      copies text to the clipboard.
    * Added setDefaultButton(StandardButton) and
      setEscapeButton(StandardButton) functions.

- QMetaObject
    * Optimized invokeMethod() to avoid calling type() unnecessarily.

- QMetaType
    * [143011] Fixed isRegistered() to return false when the type ID does
      not correspond to a user-registered type.

- QModelIndex
    * [144919] Added more rigorous identity tests for model indexes.

- QMotifStyle
    * [38624] Fixed the behavior when clicking on a menu bar item a
      second time; the menu will now close in the same way that native
      Motif menus do.

- QMutex
    * [106089] Added tryLock(int timeout), which allows a thread to specify
      the maximum amount of time to wait for the mutex to become available.
    * [137309] Fixed a rare deadlock that was caused by compiling with
      optimizations enabled.
    * Optimized recursive locking to avoid two unnecessary atomic operations
      when the current thread already owns the lock.
    * Optimized non-recursive mutexes by avoiding a call to pthread_self()
      on Unix.

- QNetworkInterface
    * [146834] Now properly generates broadcast addresses on Windows XP.

- QNetworkProxy
    * Added support for transparent HTTP CONNECT client proxying.
    * Added support for complex authenticators through QAuthenticator.

- QObject
    * Added a compile time check to ensure that the objects passed to
      qobject_cast contain a Q_OBJECT macro.
    * [133901] Improved the run time warnings from setParent() that is
      output when trying to set a new parent that is in a different thread.
    * [140106] Fixed a deadlock that could occur when deleting a QObject
      from the destructor of a QEvent subclass.
    * [133739] Fixed compiler warnings from g++ in findChildren<T>().
    * Documented the QEvent::ThreadChange that is sent by moveToThread().
    * [130367] Improved the run time warning that is output when creating
      a QObject with a parent from a different thread.
    * [114049] Made dumpObjectInfo() also dump connection information.

- QPageSetupDialog
    * [136041] Margins are now saved and used properly when printing.

- QPainter
    * Fixed stroking of non-closed polygons with non-cosmetic pens in the
      OpenGL paint engine.
    * [133980] Fixed stroking bug for RoundJoin and MiterJoin with paths
      containing successive line segments with a 180 degree angle between
      them.
    * [141826] Fixed stroking with MiterJoin of paths with duplicated
      control points.
    * [139454, 139209] Fixed problem with SmoothTransformation that caused
      images to fade out toward the edges in raster paint engine.
    * Added the HighQualityAntialiasing render hint to enable pixel shaders
      for anti-aliasing in the OpenGL paint engine.
    * [143503] Fixed broken painting when using a QPainter on a
      non-top-level widget where the world matrix is disabled then
      re-enabled.
    * [142471] Fixed dashed line drawing of lines that are clipped against
      the device rectangle.
    * [147001] Fixed bug with drawing of polygons with more than 65536
      points in the raster paint engine.
    * [157639] Calling drawPolygon() from multiple threads no longer causes
      an assertion.
    * Optimized line and rectangle drawing in the raster paint engine.
    * [159047] Fixed case where fillRect() would ignore the brush origin.
    * [143119] Fixed bug where drawing a scaled image on another image would
      cause black lines to appear on the edges of the scaled image.
    * [159894] Fixed X11 errors when using brush patterns on multiple
      screens.
    * [148524] Fixed X11 errors when drawing bitmaps containing a color
      table with alpha values.
    * [141871] Optimized and fixed drawing of extremely large polygons.
    * [140952] Fixed transformed text drawing on X11 setups that used
      fontconfig without Xrender.
    * [139611] Fixed smooth transformation of pixmaps for X11.
    * [132837] Fixed text drawing on images with certain fonts on Mac OS X.
    * [147911] Use font anti-aliasing when rotating small fonts on Windows.
    * [127901] Optimized gradient calculations.
    * [139705, 151562] Optimized clipping algorithms in the raster paint
      engine.
    * Optimized blending operations in the raster paint engine using MMX,
      3DNOW and SSE2.
    * Optimized fillRect() for opaque brushes.
    * Made general speed optimizations, especially in the OpenGL and raster
      paint engines.

- QPainterPath
    * [136924] Correctly convert Traditional Chinese fonts (e.g., MingLiu)
      to painter paths.

- QPicture
    * [142703] QPicture now correctly preserves composition mode changes.
    * Fixed QPicture text size handling on devices with non-default DPI.
    * [133727] Fixed text alignment handling when drawing right-to-left
      formatted text into a QPicture.
    * [154088] Fixed bugs that could occur when reading QPicture files
      generated with Qt 3.

- QPixmap
    * Added cacheKey() as a replacement for serialNumber().
    * [97426] Added a way to invert masks created with createMaskFromColor().
    * Fixed a crash that could occur when passing a 0 pointer to the
      constructor that accepts XPM format image data.

- QPixmapCache
    * [144319] Reinserting a pixmap now moves it to the top of the Least
      Recently Used list.

- QPlastiqueStyle
    * [133220] Fixed QProgressBar rendering bugs.

- QPrintDialog
    * [128964] Made "Print" the default button.
    * [138924] Ensured that the file name is shown in the file dialog when
      printing to a file
    * [141486] Ensured that setPrintRange() correctly updates the print
      dialog on X11.
    * [154690] Ensured that "Print last page first" updates the QPrinter
      instance on X11.
    * [149991] Added support for more text encodings in the PPD subdialog.
    * [158824] Disable the OK button in the dialog if no printers are
      installed.
    * [128990] X11: Don't immediately create an output file when a file name
      is entered in the print dialog.
    * [143804] Ensured that the default printer is set to the one specified
      by the PRINTER environment variable.

- QPrinter
    * Added the supportedPaperSources() function.
    * [153735] Significantly speeded up generation of PDF documents with Asian
      characters.
    * [140759] Documented that the orientation cannot be changed on an active
      printer on Mac OS X (native format).
    * [136242] PostScript generator: Don't generate huge PostScript files for
      pattern brushes.
    * [139566] Added support for alpha blending when printing on Windows.
    * [151495] Fixed image scaling problems when printing on Windows.
    * [146788] Optimized drawTiledPixmap() on Windows.
    * [152637] PDF generator: Ensured that the pageRect property is set up
      correctly.
    * [152222] PDF generator: Fixed bug that lead to fonts being too small on
      Mac OS X.
    * [151126] Ensured that ScreenResolution is respected on Mac OS X.
    * [151141] PDF generator: Make PDFs using the default font on Mac OS X
      searchable.
    * [129297, 140555] PS/PDF generator: Drastically reduced the sizes of
      generated files and speeded up generation when using simple pens.
    * [143803] Correctly set the default printer name on X11.
    * [134204] PDF generator: Ensured that the correct output is generated
      when drawing 1-bit images
    * [152068] PS generator: Ensured that the correct PostScript is generated
      when embedding TrueType fonts with broken POST tables.
    * [143270] X11: Ensure that sigpipe is ignored when printing to an
      invalid printer using the PDF generator.

- QProcess
    * [97517] Added suport for specifying the working directory of detached
      processes as well as retrieving the PID of such processes.
    * [138770] Greatly improved the performance of stdin and stdout handling
      on Windows.
    * [154135] Fixed crashes and lock-ups due to use of non-signal-safe
      functions on Unix.
    * [144728] Fixed race conditions on Windows that would occur when
      calling bytesWritten() while using the waitFor...() functions.
    * [152838] Ensured that finished() is no longer emitted if a process
      could not start.

- QProgressBar
    * [146855] Ensured that setFormat() now calls update() if the format
      changes.
    * [152227] Improved support for wide ranges across the entire integer
      range.
    * The setRange() function is now a slot.
    * [137020] Ensured setValue() forces a repaint for %v.

- QProgressDialog
    * The setRange() function is now a slot.
    * [123199] Ensured that the Escape key closes dialog even when the
      cancel text is empty.

- QPushButton
    * [114245] Fixed some styling issues for push buttons with popup menus.
    * [158951] Buttons with icons now center their content to be more
      consistent with buttons that do not have icons in most styles.
    * [132211] Fixed setDefault() behavior.

- QReadWriteLock
    * [106089] Added the tryLockForRead(int) and tryLockForWrite(int)
      functions which allow a thread to specify the maximum amount of time
      to wait for the lock to become available.
    * [131880] Added support for recursive write locking.

- QRectF
    * [143550] Added the QRectF(topRight,bottomLeft) constructor.

- QRegion
    * Added several optimizations for common operations on X11 and Qtopia
      Core.

- QResource
    * Allow a QByteArray to be used for run time resource registration.

- QScrollArea
    * [140603] Fixed flickering when the scroll widget is right-aligned.

- QSemaphore
    * Add the tryAcquire(int n, int timeout) function which allows a thread
      to specify the maximum amount of time to wait for the semaphore to
      become available.

- QSettings
    * [153758] Fixed various bugs that could occur when writing to and
      reading from the Windows registry.

- QSizeGrip
    * Added support for size grips in TopLeftCorner/TopRightCorner on Windows.
    * Added support for size grips on subwindows.
    * [150109] Fixed bug where the position could change during resize.
    * [156114] Fixed incorrect size grip orientation on X11.

- QSlider
    * Prevent the widget from getting into infinite loops when extreme
      values are used.

- QSocketNotifier
    * [148472] Mac OS X now prevents the file descriptor from being closed
      when a socket notifier is deregistered.
    * [140018] Mac OS X will now invalidate the backing native socket
      notifier upon deregistration.
    * Optimized performance by avoiding some debugging code in release
      builds.

- QSortFilterProxyModel
    * [151352] Ensured that the dataChanged() signal is emitted when
      sorting.
    * [154075] Added support to handle the insertion of rows in the source
      model.
    * [140152] Added a property to force the proxy model to use QString's
      locale-aware compare method.

- QSpinBox
    * [141569] Disallow typing -0 in a QSpinBox with a positive range.
    * [158445] Add the keyboardTracking property. When set to false, don't
      send valueChanged() with every key press.
    * [143504] Made undo/redo work correctly.
    * [131165] Fixed highlighting according to the native look on Mac OS X.

- QSplashScreen
    * [38269] Added support for rich text.

- QSplitter
    * [139262] Fixed bug that caused the splitter to snap back and forth in
      certain situations.

- QSql
    * Added NumericalPrecisionPolicy to allow numbers to be retrieved as
      double or float.

- QSqlDriver
    * [128671] Added SimpleLocking to DriverFeature.

- QSqlQueryModel
    * [155402] Fixed bug where the rowsAboutToBeRemoved() and rowsRemoved()
      signals were emitted when setQuery() was called on an already empty
      model.
    * [149491] Fixed bug where blank rows were inserted into the model if
      the database driver didn't support the QuerySize feature and the
      result set contained more than 256 rows.

- QSqlRelationalTableModel
    * [142865] Fixed support for Interbase and Firebird by not using 'AS' in
      generated SQL statements.

- QSqlTableModel
    * [128671] Ensured that the model has no read locks on a table before
      updating it. Fixes parallel access for in-process databases like
      SQLite.
    * [140210] Fixed bug where setting a sort order for a column caused no
      rows to be selected with PostgreSQL and Oracle databases due to
      missing escape identifiers in the generated SQL statement.
    * [118547] Don't issue asserts when inserting records before calling
      select() on the model.
    * [118547] Improved error reporting.

- QSslCertificate
- QSslCipher
- QSslError
- QSslKey
- QSslSocket
    * New classes. Added support for SSL to QtNetwork.

- QStandardItemModel
    * Reduced the construction time when rows and columns are given.
    * [133449] Improve the speed of setData()
    * [153238] Moving an item will no longer cause that item to lose its
      flags.
    * [143073] Calling setItemData() now triggers the emission of the
      dataChanged() signal.

- QStatusbar
    * [131558] Increased text margin and fixed a look and feel issue on
      Windows.

- QString
    * fromUtf8() now discards UTF-8 encoded byte order marks just like the
      UTF-8 QTextCodec.
    * [154454] Fixed several UTF-8 decoder compliance problems (also affects
      the UTF-8 QTextCodec).
    * Removed old compatibility hack in fromUtf8()/toUtf8() to allow round
      trip conversions of invalid UTF-8 text.
    * Added support for full Unicode case mappings to toUpper() and
      toLower().
    * Correctly implemented case folding with the foldCase() method. (Also
      for QChar.)
    * [54399] Added more overloads (taking up to 9 arguments) for arg().

- QStringListModel
    * Made it possible for items to be dropped below the other visible items
      on a view with a QStringListModel.

- QStyle
    * Added the SP_DirHomeIcon standard pixmap to provide the native icon
      for the home directory.
    * Added documentation to indicate that pixel metrics are not necessarily
      followed for all styles.
    * standardPixmap() has been obsoleted. Use standardIcon() instead.
    * Added SP_VistaShield to support Vista UAC prompts on Windows Vista.
    * [103150] Added SH_FocusFrame_AboveWidget to allow the focus frame to
      be stacked above the widget it has focus on.
    * The default password character is now a Unicode circle, the asterisk
      is still used for QMotifStyle and its subclasses.
    * [127454] CE_ToolBoxTab now draws two parts, CE_ToolBoxTabShape and
      CE_ToolBoxTabLabel. This should make QToolBox more styleable.
    * [242107] Added a QStyleOptionToolBoxV2 with tab position and selected
      position enums.

- QStyleOption
    * [86988] Added an initializeFromStyleOption() function for the many
      widgets that need to create a QStyleOption subclass for style-related
      calls.

- QSyntaxHighligher
    * [151831] Fixed bug where calling rehighlight() caused highlighBlock()
      to be called twice for each block of text.

- QSystemTrayIcon
    * [131892] Added support to allow messages to be reported via AppleScript
      on Mac OS X.
    * [151666] Increased the maximum tool tip size to 128 characters on the
      Windows platforms that support it.
    * [135645] Fixed an issue preventing system tray messages from working
      on some Windows platforms.
    * Addded the geometry() function to allow the global position of the
      tray icon to be obtained.
	
- QTabBar
    * [126438] Added the tabAt(const QPoint &pos) function.
    * [143760] Fixed a bug where scroll buttons were shown even when
      disabled.
    * [130089] Ensured that the tool tip help is shown on disabled tabs.
    * [118712] Enabled auto-repeat on scroll buttons.
    * [146903] Ensured that the currentChanged() signal is emitted when a
      tab is removed
    * Ensured that corner widgets are taken into account when calculating
      tab position in the case where the tab bar is centered.
    * [132091] Re-introduced the Qt 3 behavior for backwards scrolling of
      tabs.
    * [132074] Ensured that currentChanged() is always emitted when the
      current tab is deleted.

- QTableView
    * No longer allow invalid spans to be created.
    * [145446] Fixed bug where setting minimum height on horizontal header
      caused the the table to be rendered incorrectly.
    * [131388] Fixed case where information set using setRowHeight() was
      lost on a subsequent call to insertRow().
    * [141750] Fixed issue where spanned table items were painted twice per
      paint event.
    * [150683] Added property for enabling/disabling the corner button.
    * [135727] Added the wordWrap property.
    * [158096] resizeColumnToContents(int i) now has the same behavior that
      resizeColumnsToContents() uses for individual columns.

- QTableWidget
    * [125285] Ensured that dataChanged() is only emitted once when
      setItemData() is used to set data for more than one role.
    * [151211] Added removeCellWidget() and removeItemWidget().
    * [140186] Fixed bug where calling setAutoScroll(false) would have no
      effect.

- QTabWidget
    * Tab widgets now take ownership of their corner widgets and allow
      corner widgets to be unset.
    * [142464] Fixed incorrect navigation behavior that previously made it
      possible to navigate to disabled tabs.
    * [124987] Ensured that a re-layout occurs when a corner widget is set.
    * [111672] Added the clear() function.

- QtAlgorithms
   * [140027] Improved the performance of qStableSort() on large data sets.

- QTcpSocket
    * Added several fixes to improve connection reliability on Windows.
    * Made a number of optimizations.
    * Improved detection of ConnectionRefusedError on Windows and older
      Unixes.
    * Added support for proxy authentication.

- QTemporaryFile
    * [150770] Fixed large file support on Unix.

- QTextBrowser
    * [126914] Fixed drawing of the focus indicator when activating links.
    * [82277] Added the openLinks property to prevent QTextBrowser from
      automatically opening any links that are activated.

- QTextCodec
    * Improved the UTF-8 codec's handling of large, rare codepoints.
    * [154932] The UTF-8 codec now keeps correct state for sequence
      f0 90 80 80 f4 8f bf bd.
    * [154454] Fixed several UTF-8 decoder compliance problems also
      affecting QString::fromUtf8().
    * Fixed the UTF-8 codec's handling of incomplete trailing UTF sequences
      to be the same as QString::fromUtf8().

- QTextCursor
    * The definition of the block character format (obtained using the
      blockCharFormat() and QTextBlock::charFormat() functions) has been
      changed to be the format used only when inserting text into an empty
      block.
      If a QTextCursor is positioned at the beginning of a block and the
      text block is not empty then the character format to the right of the
      cursor (the first character in the block) is returned.
      If the block is empty, the block character format is returned.
      List markers are now also drawn with the character format of the first
      character in a block instead of the invisible block character format.

- QTextDecoder
    * Added the hasFailure() function to indicate whether input was
      correctly encoded.

- QTextDocument
    * [152692] Ensured that the print() function uses the document's default
      font size.
    * Added the defaultTextOption property.
    * Setting a maximum block count implicitly now causes the undo/redo
      history to be disabled.
    * Made numerous fixes and speed-ups to the HTML import.
    * [143296] Fixed HTML import bug where adding a <br> tag after a table
      would cause two empty lines to be inserted instead of one.
    * [144637, 144653] Ensured that the user state property of QTextBlock is
      now preserved.
    * [140147] Fixed layout bug where the document size would not be updated
      properly.
    * [151526] Fixed problem where the margins of an empty paragraph above a
      table would be ignored.
    * [136013] The "id" tag can now be used to specify anchors.
    * [144129] Root frame properties are now properly exported/imported.

- QTextDocumentFragment
    * QTextDocumentFragment no longer stores the root frame properties,
      the document title or the document default font when it is created
      from a document or from HTML. Use QTextDocument's toHtml() and
      setHtml() function if you want to propagate these properties to and
      from HTML.

- QTextEdit
    * [152208] Ensured that the undo/redo enabled state is preserved across
      setPlainText() and setHtml() calls.
    * [125177] Added a print() convenience function that makes it possible
      to support QPrinter::Selection as selection range.
    * [126422] Fixed bug in copy/paste which could cause the background
      color of pasted text to differ from that of the copied text.
    * [147603] Fixed various cases where parts of a text document would be
      inaccessible or hidden by the scroll bars.
    * [148739] Fixed bug where setting the ensureCursorVisible property
      would not result in a visible cursor.
    * [152065] Fixed cases where currentCharFormatChanged() would not be
      emitted.
    * [154151] The undoAvailable() and redoAvailable() signals are no longer
      emitted too many times when entering or pasting text.
    * [137706] Made the semantics of the selectionChanged() signal more like
      QLineEdit::selectionChanged().

- QTextFormat
    * [156343] Fixed crash that could occur when streaming QTextFormat
      instances.

- QTextLayout
    * Fixed support for justified Arabic text.
    * [152248] Fixed assert in sub/superscript handling of fonts specified
      in pixel sizes.
    * Optimized text layout handling for pure Latin text.
    * Ensured that OpenType processing is skipped altogether if a font does
      not contain OpenType tables.
    * Fixed some issues in the shaper for Indic languages.
    * Upgraded the line breaking algorithm to the newest version
      (http://www.unicode.org/reports/tr14/tr14-19.html).
    * [140165] Changed boundingRect() to report the actual position of the
      top left line instead of incorrectly reporting (0, 0) for the top-left
      corner in every case.
    * Fixed various problems with text kerning.

- QTextStream
    * [141391] Fixed bug that could occur when reusing a text stream with
      the setString() method.
    * [133063] atEnd() now works properly with stdin.
    * [152819] Added support for reading and writing NaN and Inf.
    * [125496] Ensured that uppercasebase and uppercasedigits work as
      expected.

- QTextTable
    * [138905] Fixed bug where merging cells in a QTextTable would cause
      text to end up in the wrong cells.
    * [139074] Fixed incorrect export of cell widths to HTML when exporting
      tables containing column spans.
    * [137236] Fixed bug where a text table would ignore page breaks.
    * [96765] Improved handling of page breaks for table rows spanning
      several pages.
    * [144291] Fixed crash that could occur when using setFormat() with an
      old format after inserting or removing columns.
    * [143501] Added support for vertical alignment of table cells.
    * [136397, 144320, 144322] Various border styles and border brushes are
      now properly supported.
    * [139052] Made sure that empty text table cells get a visible
      selection.

- QtGlobal
    * Added Q_FUNC_INFO, a macro that expands to a string describing the
      function it is used in.
    * [132145] Fixed Q_FOREACH to protect against for-scoping compiler bugs.
    * Fixed a race condition in the internal Q_GLOBAL_STATIC() macro.
    * [123910] Fixed crashes on some systems when passing 0 as the
      message to qDebug(), qWarning(), and qFatal().

- QThread
    * [140734] Fixed a bug that prevented exec() from being called more than
      once per thread.
    * Optimized the currentThread() function on Unix.
    * Added the idealThreadCount() function, which returns the ideal number
      of threads that can be run on the system.

- QThreadStorage
    * [131944] Refactored to allow an arbitrary number of instances to be
      created (not just 256 as in previous versions).
    * Updated documentation, as many caveats have been removed in Qt 4.2 and
      Qt 4.3.

- QTimeEdit
    * [136043] Fixed the USER properties.

- QTimeLine
    * [145592] Fixed the time line state after finished() has been emitted.
    * [125135] Added the resume() function to allow time lines to be resumed
      as well as restarted.
    * [153425] Fixed support for cases where loopCount >= 2.

- QTimer
    * Added the active property to determine if the timer is active.

- QToolBar
    * [128156, 138908] Added an animation for the case where a tool bar is
      expanded to display all its actions when its extension button is
      pressed.

- QToolBox
    * [107787] Fixed rendering bugs in reversed mode.

- QToolButton
    * [127814] Ensured that the popup delay respects style changes.
    * [130358] Ensured that Hover events are sent to the associated QAction
      when the cursor enters a button.
    * [106760] Fixed bug where the button was drawn as pressed when using
      MenuButtonPopup as its popup mode.

- QToolTip
    * [135988] Allow tool tips to be shown immediately below the cursor
    * [148546] The usage of tool tip fading now adheres to the user settings
      on Mac OS X.
    * [145458] Tool tip fading now looks native on Mac OS X (fading out
      rather than in).
    * [145557] Fixed bug that caused tool tips to remain visible if the
      cursor left the application quickly enough on Mac OS X.
    * [143701] Fixed bug that caused tool tips to hide behind stay-on-top
      windows on Mac OS X.
    * [158794] Fixed bug on Mac OS X where isVisible() returned true even
      if the tool tip was hidden.

- QTreeView
    * [158096] Added checks to prevent items from being dropped on their own
      children.
    * [113800] When dragging an item over an item that has child items,
      QTreeView will now automatically expand after a set time.
    * [107766] Added a style option (enabled in the Windows style) to
      select the first child when the right arrow key is pressed.
    * [157790] It was possible to get in a state where clicking on a branch
      (+/- in some styles) to expand an item didn't do anything until
      another location in the view was clicked.
    * Made it possible to create a selection with a rectangle of negative
      width or height.
    * [153238] Ensured that drops on branches are interpreted as drops onto
      the root node.
    * [152868] Fixed setSelection() so that it works with negative
      y-coordinates.
    * [156522] Fixed repaint errors for selections in reversed mode.
    * [155449] Prevented the tree from having huge columns when setting the
      alignment before it is shown.
    * [151686] Hidden rows are now filtered out of the user selection range.
    * [146468] Fixed bug where the indexRowSizeHint could be incorrect in
      the case where columns were moved.
    * [138938] Fixed an infinite loop when calling expandAll() with no
      column.
    * [142074] Scroll bars are no longer shown when there are no items.
    * [143127] Fixed bug that prevented the collapsed() signal from being
      emitted when the animated property was set to true.
    * [145199] Fixed crash that could occur when column 0 with expanded
      items was removed and inserted.
    * [151165] Added the indexRowHeight(const QModelIndex &index) function.
    * [151156] Add support for hover appearance.
    * [140377] Add the expandTo(int depth) function.
    * Clicking in the empty area no longer selects all items.
    * [135727] Added the wordWrap property.
    * [121646] setSelection() now selects the item within the given
      rectangle.
    * Added the setRowSpanning(int row, const QModelIndex &parent) and
      isRowSpanning(int row, const QModelIndex &parent) functions.

- QTreeWidget
    * [159078] Fixed drag and drop bug on Mac OS X that could occur when
      dragging inside the widget.
    * [159726] Fixed crash that could occur when dragging a QTreeWidgetItem
      object with an empty last column.
    * [154092] Fixed case where the drag pixmap could get the wrong position
      when dragging many items quickly.
    * [152970] Hidden items are no longer returned as selected from the
      selectedItems() function.
    * [151211] Added the removeCellWidget() and removeItemWidget()
      functions.
    * [151149] Made the header text left-aligned instead of center-aligned
      by default.
    * [131234] Made it possible to do lazy population by introducing the
      QTreeWidgetItem::ChildIndicatorPolicy enum.
    * [134194] Added the itemAbove() and itemBelow() functions.
    * [128935] The disabled state of an item is now propagated to its
      children.
    * [103421] Added the QTreeWidgetItem::setExpandable() function.
    * [134138] Added the QTreeWidgetItem::removeChild() function.
    * [153361] Ensured that items exist before emitting itemChanged().
    * [155700] Fixed a crash in QTreeWidget where deleted items could still
      be referenced by a selection model.

- QUdpSocket
    * [142853] Now continues to emit readyRead() if the peer temporarily
      disappears.
    * [154913] Now detects datagrams even when the sender's port is invalid.

- QUndoStack
    * [142276] Added the undoLimit property which controls the maximum
      number of commands on the stack.

- QUrl
    * [134604] Fixed the behavior of the obsolete dirPath() function on
      Windows.

- QValidator
    * [34933] Added support for scientific notation.

- QVariant
    * [127225] Unloading a GUI plugin will no longer cause a crash in
      QVariant in a pure QtCore application.

- QWaitCondition
    * [126007] Made the behavior of wakeOne() consistent between Windows and
      Unix in the case where wakeOne() is called twice when exactly 2
      threads are waiting (the correct behavior is to wake up both threads).

- QWidget
    * [139359] Added the locale property to make it easy to customize how
      individual widgets display dates and numbers.
    * [155100] Fixed a regression that could cause Qt::FramelessWindowHint
      to be ignored for frameless windows.
    * [137190] Ensured that windows with masks are now rendered correctly
      with respect to window shadows on Mac OS X.
    * [139182] Added the render() function to allow the widget to be
      rendered onto another QPaintDevice.
    * [131917] Fixed bug where minimum and maximum sizes were not respected
      when using X11BypassWindowManagerHint.
    * [117896] Fixed setGeometry() to be more consistent across Mac OS X,
      Windows, X11 and Qtopia Core.
    * [132827] Allow the focus to be given to a hidden widget; it will
      receive the focus when shown.
    * Reduced the overhead of repainting a widget with lots of children.
    * Clarified the documentation for the Qt::WA_AlwaysShowToolTips widget
      attribute.
    * [154634] Ensured that the Qt::WA_AlwaysShowToolTips widget attribute
      is respected for all widgets.
    * [151858] Improved the approximation returned by visibleRegion().
    * [129486] Ensured that calling setLayout() on a visible widget causes
      its children to be shown, making its behavior consistent with the
      QLayout::addWidget() behavior.

- QWindowsStyle
    * [110784] Scroll bar and spin box arrows now scale with the widget size.
    * Given certain panel and button frames a more native appearance.
    * [142599] Ensured that a QDockWidget subclass is not required when
      using the style to draw a CE_DockWidgetTitle.

- QWindowsXPStyle
    * [150579] Fixed the use of the wrong background color for QSlider.
    * [133517] Fixed styling of the unused area in header sections.
    * [48387] Fixed styling of MDI/Workspace controls.
    * [109317] Fixed a rendering issue with tab widgets in the Silver color
      scheme.
    * [114120] Ensured that the frame property for combo boxes is respected.
    * [138444] Fixed crash that could occur when passing 0 as the widget
      argument to drawComplexControl().

- QWizard
- QWizardPage
    * New classes. Based on QtWizard and QtWizardPage in Qt 4 Solutions.
      Redesign of QWizard from Qt 3.

- QXmlParseException
    * [137998] Fixed incorrect behavior where systemId/publicId was never
      reported.

- QXmlSimpleReader
    * QXmlSimpleReader no longer reads entire files into memory, allowing
      it to handle large XML files.

- Q3DateEdit
    * [131577] Fix a bug that could occur when entering out-of-range years
      in a Q3DateEdit.

- Q3DockWindow
    * [125117] Fixed some style issues with Windows XP and Plastique styles.

- Q3GroupBox
    * Added FrameShape, FrameShadow, lineWidth, and midLineWidth properties.

- Q3ListView
    * [150781] Fixed a crash in setOpen() (previously fixed in Qt 3).

- Q3ScrollView
    * [125149] Mouse events should not be delivered if the Q3ScrollView is
      disabled.
      This fixed the case where items were still selectable when Q3ListView
      was disabled using the setEnabled() function.

- Q3SqlCursor
    * [117996] Improved support for tables and views that have fields with
      whitespace in their names.

- Q3TextEdit
    * [136214] Fixed invalid memory reads when using undo/redo
      functionality.

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

- Interbase driver

    * [127724] Added support for OUT values from stored procedures. (See the
      SQL Database Drivers documentation for details.)
    * [159123] Fixed crash that could occur when fetching data from
      Interbase 2007 databases.
    * [143474] Added support for SQL security-based roles.
    * [134608] Fixed bug where queries in some cases returned empty VARCHAR
      fields if they contained non-ASCII characters.
    * [143471] Fixed bug that caused fetching of multisegment BLOB fields to
      fail in some cases.
    * [125053] Fixed bugs where NUMERIC fields were corrupted or returned as
      the wrong type in some cases.

- MySQL driver
    * [156342] Fixed bug where BINARY and VARBINARY fields were returned as
      QString instead of QByteArray.
    * [144331] Fixed bug where a query would become unusable after executing
      a stored procedure that returns multiple result sets.

- OCI driver

    * Added support for low-precision retrieval of floating point numbers.
    * [124834] Fixed bug where the binding strings failed on certain
      configurations.
    * [154518] Fixed bug where connections were not properly terminated,
      which lead to resource leaks and connection failures.

- ODBC driver

    * Increased performance for iterating a query backwards.
    * [89844] Added support for fetching multiple error messages from an
      ODBC driver.
    * [114440] Fixed bug where binding strings longer that 127 characters
      failed with Microsoft Access databases.
    * [139891] Fixed bug where unsigned ints were returned as ints.

- SQLite driver
    * [130799] Improved support for attatched databases when used with
      QSqlTableModel.
    * [142374] Improved error reporting in cases where fetching a row fails.
    * [144572] Fixed the implementation of escapeIdentifier() to improve
      support for identifiers containing whitespace and reserved words when
      used with the model classes.

- PostgreSQL driver

    * [135403] Properly quote schemas in table names ("schema"."tablename").
    * [138424] Fixed resource leak that occurred after failed connection
      attempts.

- DB2 driver

    * [110259] Fixed bug where random characters were prepended to BLOB
      fields when fetched.
    * [91441] Fixed bug where binding strings resulted in only parts of the
      strings being stored.

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

  * [138388] Floating point numbers are now printed in printf's "%g" format.
  * [145643] QEXPECT_FAIL does not copy or take ownership of "comment"
    pointer.
  * [156346] Gracefully handle calls to qFatal().
  * [154013] Don't count skips as passes.
  * [145208] Display QByteArrays in convenient ways.
  * Output well-formed XML.

****************************************************************************
*                               QDBus                                      *
****************************************************************************

- Library

    * Added support for QList<QDBusObjectPath> and QList<QDBusSignature>
      to allow them to be used without first having to register the types.

    * Added support for using QtDBus from multiple threads.

    * Made it possible to marshal custom types into QDBusArgument.

    * qdbuscpp2xml:
        * [153102] Ensure that Q_NOREPLY is ignored.
        * [144663] Fixed problems with executing qdbuscpp2xml on Windows.
        * Don't require moc to be on a path listed in the PATH environment
          variable.

    * QDBusInterface:
	* Changed asserts in the QDBusInterface constructor to QDBusErrors.
    * QDBusConnection:
	* Added a separate slot for delivering errors when calling
          callWithCallback().


- Viewer

    * Moved QDBusViewer from demos to QDBus tools.
    * Added ability to get and set properties.
    * Added support for demarshalling D-Bus variants.
    * Added a property dialog for entering arguments.
    * Made QDBusObjectPath clickable in the output pane.

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

X11
---
    * [153346] Ensured that tablet events are not delivered while a drag and
      drop operation is in progress.
    * [141756] Ensured that the Plastique or Cleanlooks styles are not used
      as default styles when Xrender is not available.
    * [139455] Fixed QX11EmbedContainer race causing sudden unembedding of
      clients.
    * [96507] Added support for using _POSIX_MONOTONIC_CLOCK as the
      timer source (also affects Qtopia Core).
    * [128118] Fixed garbage output when calling QPixmap::grabWindow()
      on a window on a non-default screen.
    * [133119] Ensured that X11 color names are detected in the
      RESOURCE_MANAGER property.
    * [56319] Added support for _NET_WM_MOVERESIZE to QSizeGrip, which
      cooperates with the window manager to do the resizing.
    * Fixed QWidget::isMaximized() to return false when the window is
      only maximized in a single direction.
    * [67263] Fixed a bug that could cause applications to freeze while
      querying the clipboard for data.
    * [89224] Fixed the behavior of minimized Qt applications to show the
      correct icon (instead of the standard OpenWindows icon) on Solaris.
    * [116080] Ensured that the TIMESTAMP clipboard property is set using
      XA_INTEGER (as defined in the ICCCM).
    * [127556] Refactored timer accounting code to be more efficient and
      less cumbersome to maintain.
    * [132241] Add support for DirectColor visuals. Qt will now create and
      initialize a colormap when using such visuals.
    * [140737] Fixed QEventDispatcherGlib::versionSupported() to be much
      simpler.
    * Fixed a bug where QWidget::windowFlags() would not include
      Qt::X11BypassWindowManagerHint for Qt::ToolTip and Qt::Popup windows.
    * [146472] Fixed a bug where QWidget::setWindowFlags() would disable
      drag and drop operations from outside Qt applications.
    * [150352] Fixed painting errors after show(), hide(), then show()
      under GNOME.
    * [150348] Fixed a bug that would incorrectly set the Qt::WA_SetCursor
      attribute on top-level windows.
    * [135054] Fixed system palette detection code to use contrast that is
      more similar to the desktop settings.
    * [124689] Documented potential QDrag::setHotSpot() inefficiency on X11.
    * [121547] Fixed QWidget::underMouse() to ensure that the value it
      returns is correctly updated after the mouse button is released.
    * [151742] Improved robustness when executing in an X11-SECURITY
      reduced ssh-forwarded session.
    * [142009] Fixed a bug that caused an application using the Qt Motif
      Extension to freeze when trying to copy text into a QTextEdit.
    * [124723] Fixed PseudoColor detection to correctly handle cases where
      the colormap is not sequential.
    * [140484] Don't use the GLib event dispatcher if GLib version is too
      old.
    * Fixed a bug where a window would get an incorrect size after the
      second call to show().
    * [153379] Fixed shortcuts where the modifier also includes Mode_switch
      in the modifier mask; for example, Alt+F on HP-UX.
    * [154369] Fixed drag and drop to work properly after re-creating a
      window ID.
    * [151778] Fixed mouse enter/leave event platform inconsistencies.
    * [153155] Added the QT_NO_THREADED_GLIB environment variable, which
      tells Qt to use Glib only for the GUI thread.
    * Fixed restoreGeometry() to ensure that full-screen windows are moved
      to the correct position.
    * [155083] Don't use legacy xlfd fonts if we have fontconfig available
      on Solaris.
    * [150348] Fixed bug where setCursor() would not work properly after a
      setParent() call.
    * Made Plastique the default style on X11.

Windows
-------
    * Added an experimental DirectX-based paint engine.
    * [141503] Ensured that clicks inside tool windows won't cause them to
      be activated if there is no child widget to take focus.
    * [153315] Improved handling of Synaptic touchpad wheel messages.
    * [150639] Added support for CF_DIBV5 format and improved support for
      transparent images on the clipboard.
    * [146862] Improved readability of progress bar text when shown in
      the Highlight palette color.
    * [146928] Fixed issue where shortcut events were discarded when auto-
      repeat was disabled.
    * [141079] Ensured that wheel events contain button information.
    * [149367] Ensured that QMimeData::formats() returns all the available
      formats in the object.
    * [135417] Ensured that WM_SYSCOLORCHANGE does not trigger resetting of
      fonts.
    * [137023] Fixed a crash that could occur while translating mouse
      events.
    * [138349] Fixed incorrect focus handling with multiple top-level
      widgets.
    * [111211] Ensured that tool windows don't steal focus from their
      parents while opening.
    * [143812] Fixed a bug which can break the widget's ability to maximize
      after saving and restoring its state.
    * [111501] Ensured that SPI_SETWORKAREA messages trigger calls to
      QDesktopWidget::workAreaResized().
    * [141633] Fixed command line parsing for GUI applications.
    * [134984] Ensured that SockAct events are not triggered from
      processEvents(ExcludeSocketNotifiers).
    * [134164] Ensured that top-level widgets configured with
      MSWindowsFixedSizeDialogHint are centered properly.
    * [145270] Fixed mapFromGlobal() and mapToGlobal() for minimized or
      invisible widgets.
    * [132695] Fixed a potential crash that could occur when changing the
      application style after the system theme had been changed.
    * [103739] Workspace title bars now respect custom title bar heights in
      the Windows XP style.
    * [48770] Improved size grip behavior in top-level widgets.
    * [113739] Fixed an issue that could occur when using QWidget::scroll()
      with on-screen painting.
    * [129589] Added support for moving the mouse cursor to the default
      button in dialogs.
    * [139120] Added support for resolving native file icons through
      QFileIconProvider.
    * [129927] Added the QWindowsVista style to support native look and feel
      on Windows Vista.
    * [106437] Removed the Windows XP style from the list of keys supplied
      by QStyleFactory::keys() on platforms where it is not available.
    * [109814] Improved UNC path support.
    * [157261] Fixed crash that could occur when using Alt keycodes with
      text handling widgets.
    * [116307] Ensured that QEvent::WindowActivate is sent for tool windows.
    * [150346] Fixed a bug that would cause an application to exit when its
      last window (a modal dialog) was closed and a new window shown
      immediately afterwards.
    * [90144] Fixed a bug that caused QApplication::keyboardModifiers() to
      return modifiers even after they had been released.
    * [142767] Fixed a bug that allowed a QPushButton to become pressed even
      though its mousePressEvent() handler function was never called.
    * [151199] Usage of blocking QProcess API in a thread no longer hangs
      the desktop.
    * [144430] Made the shortcut system distinguish between Key_Return and
      Key_Enter.
    * [144663] Made sure qdbuscpp2xml can parse moc output on Windows.
    * [126332] Made QDBus compile on Windows platforms.
    * [133823, 160131] Fixed bug in the QWidget::scroll() overload that
      accepts a rectangle argument.

- ActiveQt
    * Ensured that, when loading a typelib file to obtain information about
      a control, the typelib is processed correctly.
    * [158990] Ambient property change events are now emitted regardless of
      the container's state.
    * [150327] ActiveQt based controls will now return the correct Extents
      depending on the size restrictions set on the widget.
    * [141296] Ensured that the ActiveQt DLL is unloaded from the same
      thread which loaded it.

- Qt Style Sheets
    * Added support for background clipping using the border-radius
      property.
    * Almost all widgets are now styleable using style sheets.
    * Added support for the -stylesheet command line option to QApplication.
    * Added support for styling through SVG.
    * Added support to allow colors and brushes to be specified as
      gradients.

Mac OS X
--------

    * qtconfig is no longer available on Mac OS X. All settings are read
      from the system's configuration.
    * [156965] Always offers a 'TEXT' type flavor for non-Pasteboard-aware
      Mac Application pastes.
    * [158087] Fixed various mouse event propagation bugs.
    * Introduced Q_WS_MAC32/Q_WS_MAC64 for 64 vs. 32-bit detection compile
      time infrastructure.
    * [156431] Introduced WA_MacAlwaysShowToolWindow to allow windows to
      behave as utility windows as opposed to floating windows.
    * [155651] Qt will now follow the HIView focus chain to allow wrapped
      HIViewRef's to take focus when appropriate.
    * [149753] Qt will not deliver mouse release events to widgets that do
      not process mouse press events (including widgets with the
      WA_MacNoClickThrough attribute set).
    * Introduced support for 64-bit Mac OS X builds. Only available on
      Mac OS X 10.5 (Leopard).
    * [145166] Ensured that CoreGraphics high quality interpolation is used
      when using SmoothPixmapTransform.
    * [134873] Ensured that the widget hierarchy is used to find a widget
      with a cursor rather than using the frontmost widget.
    * [132178] Enforced the requirement for double click detection that the
      second click must be near the previous click to prevent false double
      clicks being reported.
    * [131327] Fixed mouse propagation for top-level widgets with the
      WA_MacNoClickThrough attribute set.
    * Now entirely QuickDraw clean.
    * [155540] Ensured that asymmetic scales work with cosmetic pens.
    * [141300] Fixed an issue that prevented QFontDatabase/QFontDialog from
      showing all fonts installed on the system.
    * Fixed writing system detection in QFontDatabase.
    * [148876] Fixed bug that caused characters to be committed twice in the
      Chinese Input method.
    * Removed the use of an extra setFocus() in the event loop when a window
      is activated.
    * [152224] Fixed bug in QWidget's window state.
    * [156431] Added the WA_MacAlwaysShowToolWindow widget attribute to
      allow Mac users to create utility-window-style applications.
    * [144110] Fixed resizing of sheets on Panther.
    * [140014] Made it possible to drag QUrls on Panther.
    * [155312] Fixed bug that could occur when dragging several URLs to
      Finder and certain other applications.
    * [155244] Fixed bug that could occur when dragging a URL to Finder.
    * [153413] Fixed bug that could occur when dragging URLs between Qt applications.
    * [152450] Fixed bug that could occur when dragging URLs to applications
      such as the trash can.
    * [151158] Fixed an issue that prevented widgets from receiving drag
      events if a move event was ignored.
    * [145876] Ensured that a drag move event is always received directly
      after a drag enter event (according to the documentation).
    * [156365] Fixed event bug when dragging URLs to receivers that only
      refer to a drop location.
    * [119251] Tool tips and dialogs no longer cause full-screen windows to
      show their menu bar and the dock.
    * [147640] Fixed QScrollArea scrolling behavior when showing regions
      with dimensions between 2^15 and 2^16 pixels.
    * [158988] Ensured that a mouse enter event is now sent before a mouse
      press event upon window activation.
    * [157313] Fixed hanging bug that could occur if the system clock was
      adjusted backwards while using sockets.
    * [151411] Fixed window switching bug (Cmd + ~) that could occur when
      showing a modal dialog with a popup.
    * Ensured that changing a shortcut containing a cursor movement key now
      works correctly.
    * [143912] Fixed focus problem caused by mouse hovering over widgets
      with modal sheets.
    * [141456] Fixed activation bug exhibited by minimized windows upon
      being shown.
    * [155394] Fixed issue where a widget's move and resize state were not
      set correctly upon widget initialization.
    * [254325] Fixed sheet transparency bug.
    * [152481] Fixed crash that could occur when clicking in a window when a
      modal print dialog is showing.
    * [143835] Removed unnecessary window updates for active windows.
    * [145552] A mouse up event is now sent when a window drag has finished
      after a mouse press.
    * [146443] Ensure that, if a window is moved before it is shown for the
      first time, it is placed correctly when it is shown.
    * [141387] Fixed bug that caused two near-simultaneous mouse presses on
      different widgets to be interpreted as a single click.
    * [139087] Fixed activation for some types of shortcuts, such as
      QKeySequence(Qt::CTRL | Qt::Key_Plus).
    * Only use Roman for determining with System Fonts since Mac OS X will
      perform the necessary translation.
    * When using OpenGL, ensured that the 32-bit accumulation buffer is used
      in preference to the 64-bit accumulation buffer by default.
    * [123467] Fixed bug where the event loop would spin and not emit
      aboutToBlock() when popup menus were shown.
    * [137677] QString::localAwareCompare() now respects the sorting order
      set in the system preferences.
    * [139658] Mac OS X accessibility no longer requires that
      QApplication::exec() is called.
    * [118814, 126253, 105525] Fixed several QCombobox look and feel issues.
    * [145075] Fixed aliased line drawing bug.
    * [122826] Fixed QScrollBar painting error.
    * [131794] PixelTool and QWidget::grabWindow() now work on non-primary
      monitors.
    * [160228] The Quartz 2D-based paint engine now respects the font style
      strategy.
    * Made miscellaneous changes to make wrapping non-Qt HIViews easier.
    * Qt is now built with MACOSX_DEPLOYMENT_TARGET set to 10.3 (since Qt
      can only be run on Mac OS X 10.3 and above).
    * QSound now uses NSSound for its implementation instead of the
      deprecated C QuickTime API. This means that the QtGui library is no
      longer dependant on the QuickTime framework.
    * Added a -dwarf-2 configure option to allow people to turn on DWARF2
      debugging symbols when that is not the default.
      The ability to use DWARF2 debugging symbols was added in later version
      of the Xcode 2.x series.
    * Fixed many assertions when running against Carbon_debug.
    * Renamed the Qt::WA_MacMetalStyle attribute to WA_MacBrushedMetal.
    * Changing the Qt::WA_MacBrushedMetal attribute will now cause a
      StyleChange event to be sent.
    * The Qt translations and Qt Linguist phrase books have been added to
      the binary package.
    * [134630] Fixed loading of plugins in the case where universal plugins
      are used but the wrong architecture is accidentally read first,
      instead of returning an architecture mismatch.
    * QCursor now uses NSCursor internally instead of the deprecated
      QuickDraw functions.
    * Corrected the encoding and decoding functions for QFile to handle
      different Unicode normalization forms.

Qtopia Core
-----------

 - New font system
    * A new font subsystem has been implemented that, by default, allows
      glyphs rendered at run time to be shared between applications. A new
      pre-rendered font format (QPF2) has also been implemented together
      with a new "makeqpf" tool to generate them.
    * Support for custom font engine plugins has been added through
      QAbstractFontEngine and QFontEnginePlugin.
    * The default font family has been changed to DejaVu Sans.

- OpenGL ES
    * [126421, 126424] Added QGLWindowSurface and QGLScreen framework for
      OpenGLES (and others) on Qtopia Core. A sample implementation can be
      found in the examples/qtopiacore directory.

 - Accelerated graphics API
    * [150564] API changes in QWSWindowSurface. New functions include
      QWSWindowSurface::move() to enable accelerated movement of top-level
      windows.
    * [152755] API clarification: The windowIndex parameter to
      exposeRegion() now always refers to the window that is being changed.
    * [150569, 139550] Made API additions to QWSWindow to give QScreen
      information about the window state, window flags, and window dirty
      region
    * [150746] Added QScreen::pixelFormat() and QScreen::setPixelFormat() to
      enable drawing optimizations for some formats.

 - General fixes
    * Improved support for compiling a LSB (Linux Standard Base) compliant
      Qtopia Core library.
    * [133365] Added the QWSServer::setScreenSaverBlockLevel() function to
      make it possible to block the key/mouse event that stops the screen
      saver at a particular level.
    * Fixed QFontDatabase::addApplicationFont() for Qtopia Core.
    * [131714] Fixed performance problems with drag and drop operations.
    * [96507] Added support for using _POSIX_MONOTONIC_CLOCK as the timer
      source (also effects Qt/X11).
    * [132346] Fixed a performance bug causing unnecessary screen copies
      when using a hardware cursor.
    * [121496] Made lots of performance improvements in the VNC driver.
    * [138615] Fixed color conversion for cases where the VNC server is
      running on a big-endian machine.
    * [131321] Optimized text drawing.
    * [136282] Fixed a bug preventing QWidget::setCursor() and
      QWidget::unsetCursor() from taking effect immediately.
    * [139318] Fixed a performance bug that would cause non-visible regions
      to receive paint events.
    * [139858] Implemented acceleration for the 'pc' mouse handler.
    * [140705, 140760] Improved release of used resources (e.g, shared
      memory and hardware resources) when the application exits
      unexpectedly.
    * [144245] Fixed a problem with some cross-compilers triggered by using
      math.h functions taking a double argument when using float data.
    * Optimized QSocketNotifier activation.
    * [156511] Implemented QDirectPainter::ReservedSynchronous which makes
      a QDirectPainter object behave as a QDirectPainter region allocated
      using the static functions.
    * [94856] Fixed console switching when using the Tty keyboard driver.
    * [157705] Ensured that device parameters are passed to keyboard and
      mouse plugins.
    * [156704] Fixed QPixmap::grabWindow() for 18 and 24-bit screens.
    * [154689] Fixed the -no-gfx-multiscreen configure script option.
    * [160404] Fixed 4-bit grayscale support in QVFb and QScreen.
    * Optimized QCop communication.
    * Fixed bug in QWidget::setMask() for visible widgets.
    * [152738] Allow transparent windows to be shown on top of unbuffered
      windows.
    * [154244] Fixed bug where a client process would not terminate when
      server closed.
    * [152234] No longer send key events for one client to other client
      processes for security and performance reasons.
    * [148996] Added checks in the server to avoid buffer overruns if
      clients send malformed commands
    * [154203] Fixed mouse calibration bug with mirrored/180-degree-rotated
      touch screens.

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

- MinGW
    * [119777] Removed the dependency on mingwm.dll when compiled with the
      -no-exceptions option.

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

- Build System
    * Auto-detect Xoreax IncrediBuild with XGE technology, and enable
      distribution of moc and uic.
    * Shadow builds are now supported by nmake/mingw-make of the Qt build
      system.
    * [151184] Separated the -make options for demos and examples
    * [150610] Fixed the build system to take into account that fvisibility
      requires gcc on Unix builds.
    * [77152] Ensured that, at "make install" time, all meta-information
      files will be cleaned up to remove reference to source code path.
    * [139399] Ensured that the environment CC/CXX on Unix are taken into
      account when running the build tests.
    * [145344] Ensured that "make confclean" will remove all files
      generated by configure.
    * [145659] Added ability to disable SSE.
    * Added DWARF2 detection and support into the build system to reduce
      the debug library size.
    * Added macx-g++-64 meta-spec for Qt configuration purposes.
    * [127840] The pkgconfig files (.pc) are now placed into lib/pkgconfig.
    * [135547] Allow Windows line endings on UNIX and vice versa in
      .qt-license files.
    * [133068] GIF support is now enabled by default.
    * [137728] Fixed failed build on Mac OS X and Solaris when using the
      -separate-debug-info command line option for the configure script.
    * [137819] Added support for precompiled headers with the Intel C++
      Compiler for Linux.
    * Re-used qplatformdefs.h from linux-g++ in the linux-icc mkspec.
    * [121633] Added linux-icc-64 mkspec which is needed for building on
      some 64-bit hosts.
    * Removed cd_change_global from win32-msvc's qmake.conf file.
    * [116532] Keep intermediate manifest file in object directory instead
      of the destination directory.
    * Added a configuration type to qconfig.pri on Windows.
    * Corrected paths in Makefile generation when configuring with the
      -fast command line option.
    * Added tests to auto-detect a suitable TIFF library.
    * [152252] Fixed auto-detection of MSVC.NET 2005 Express Edition in
      configure.exe.
    * [151267] Ensured that the manifest tool does not get forward slashes
      when writing paths to manifest files.
    * [153711] Ensured that the directory separators used in .qmake.cache
      are correct for normal MinGW and Cygwin MinGW.
    * [154192] Fixed a problem with configure.exe executing non-existing
      scripts.
    * [128667] Added a confclean build target on Windows for the top-level
      project file.


- Assistant
    * [99923] Added a context menu for the tabs in the tab bar. Right click
      on a tab to get a list of common options.
    * Assistant now uses the "unified toolbar" look on Mac OS X.

- Designer
    * [151376] Added a context menu to the tab order editor.
    * [39163] Added a tab order editor shortcut - using Ctrl with the left
      mouse button makes it possible to start ordering from the selected
      widget.
    * [159129] Fixed a crash in the tab order editor.
    * Improved snapping behavior for multi-selections and negative
      positions.
    * [126671] Made it possible to move widgets by using the cursor keys
      without modifiers. The Shift modifier enables resizing, the Control
      modifier enables snapping behavior.
    * [111093] Added a file tool bar.
    * [156225] Fixed the delete widget command for cases where the deleted
      widget is a child of a QSplitter widget.
    * [101420] Improved the WYSIWYG properties of forms with respect to the
      background colors used.
    * [112034] Enabled Ctrl + drag as a shortcut for copying actions in
      menus and tool bars.
    * [128334] Double clicking on a widget now invokes the default action
      from its task menu.
    * [129473] Fixed bug in the handling of default tab orders.
    * [131994] Made it possible to set the tab order for checkable group
      boxes.
    * Added new cursor shapes.
    * [137879] Improved the editor for key sequence properties.
    * [150634] Improved refreshing behavior of all properties after property
      changes.
    * [147655] Fixed shadow build issues.
    * [151567, 149966] Ensured that object names are unique.
    * [80270] Fixed bug with saving icons taken from resources which are
      specified with aliases.
    * [152417] Fixed loading/saving of header labels of Q3Table widgets.
    * Added the QColumnView widget to the widget box.
    * Added support for new margin (left, top, right and bottom) and spacing
      (horizontal and vertical) properties of the layout classes.
    * [146337] Ensure that the margin and spacing properties are not saved
      if they have the default values.
    * Fixed layout handling in Q3GroupBox
    * [124680] Ensured that the correct pages are displayed when selecting a
      QStackedWidget page in the object inspector.
    * [88264] Ensured that breaking a nested layout doesn't break the parent
      container's layout.
    * [129477] Added support for dynamic properties via the context menu in
      the property editor.
    * [101166] Added an "Add separator" action to the standard context menu.
    * [132238] Added a "Recent files" button to the New Form dialog.
    * [107934] Updated the font anti-aliasing property from a boolean
      property to a property with 3 values.
    * [155464] Added a German translation.
    * [146953] Enabled support to allow widgets to be dragged onto the
      object inspector.
    * [152475] Ensured that the widget box saves and restores its state.
    * [111092] Added support to allow images to be dragged from the resource
      editor and dropped onto the action editor or icon properties in the
      property editor.
    * [111091] By default, icon dialogs now open to show the resource
      browser.
    * [152475] Added a button to load newly found custom widget plugins to
      the plugin dialog.
    * [151122] Added warnings for custom widget plugin issues such as load
      failures and class name mismatches.
    * [138645] Improved the form preview on Mac OS X, provided a close
      button and a menu entry.
    * [103801] Made buddy editing possible for custom widgets derived from
      QLabel.
    * [148677] Added a font chooser for tool windows.
    * [107233] Made the grid customizable, provided default and per-form
      grid settings.
    * [149325] Provided a form editor context menu in the object inspector.
    * [147174] Changed the elide mode and improved column resizing behavior
      of property editor and object inspector.
    * [147317] Improved handling for switching user interface modes,
      preventing the geometries of form window from being changed.
      Made 'Bring to front' deiconify windows.
    * [146629] Fixed never ending loop on Linux triggered by scrolling
      quickly through the pages of a QStackedWidget.
    * [145806] Enabled KDialog to be used as a template.
    * [142723] Enabled the pages of QStackedWidget, QTabWidget and QToolBox
      to be promoted.
    * [105916] Enabled QMenuBar to be promoted.
    * [147317] Improved the New Form dialog.
    * [95038] Fixed handling of layout defaults.
    * [103326] Made it possible to make connections to form signals.
    * [145954] Added a new dialog for promoted widgets with the ability to
      specify global include files.
      Added promotion candidates to the form's context menu.
    * [127232] Ensured that global include files returned by
      QDesignerCustomWidgetInterface::includeFile() are handled correctly.
    * [139985] Improved handling of layouts for custom widgets.
    * [99129] Made custom implementations of QDesignerMemberSheetExtension
      work correctly.
    * [87181] Added support for setting properties on items in a multi-
      selection.
      Added support for sub-properties. For example, changing the font size
      of a multi-selection does not overwrite other font settings.
      Added undo-support for property comments.
    * [135360] Added tooltips to the property editor, action editor and
      object inspector.
    * [103215] Added handling of escaped newline characters for text
      properties.
      Added support for validators and syntax highlighting for style sheets.
    * [135468] Added support for tool bar breaks.
    * [135620] Fixed several issues concerning handling of properties of
      promoted widgets.
    * [109077] Provided multi-selection support in the object inspector.
    * [133907] Made in-place editing of plain label texts possible.
    * [134657] Fixed table widget editor.
    * [90085] Made the resource editor consume a little less horizontal
      screen real estate.
    * [105671] Added support to allow main windows to be maximized while
      being previewed.
    * Added a style sheet editor.

- Linguist
    * Translations can be exported to and imported from XLIFF files.
    * [136633] Fixed "Find" so that it searches in comments.
    * [129163] Fixed bug that prevented "Next Unfinished" from working if
      there was no selected item.
    * [125131] Made the translation loading behavior consistent with
      Assistant and Designer.
    * [125130] Added the -resourceDir command line argument for consistency
      with Assistant and Designer, to allow the path of translation files
      to be specified.
    * [124932] XML files (.ts and .xlf) are now written with platform-
      specific line endings.
    * [128081] Ensure that the tree view does not lose focus when the up
      and down cursor keys are used for navigation.
      Use Shift+Ctrl+K and Shift+Ctrl+L instead if you really want this
      behavior.
    * [139079] Added a DTD to document the TS file format.

- lupdate
    * Made some small improvements in lupdate's .pro file parser.
      Fixed bug in inclusion of relative .pri files.
    * [140581] Improved namespace/context parsing.
    * [142373] Fixed bug when running lupdate on a SUBDIRS .pro file that
      prevented TS files from being created.
    * [135991] Ensure that .pro file comments are handled correctly when
      they occur within a list of several variable assignments.
    * [154553] Fixed bug with CODECFORTR that caused saving of incorrect
      characters.

- rcc
    * [158522] By default compression is now set to the zlib default
      (normally level 6).
    * [133837] Allow absolute paths in .qrc files (accessible through the
      original filesystem path).
    * [146958] No longer returns error when a .qrc is empty. A (mostly)
      empty file is generated instead.

- moc
    * [149054] Fixed parsing of old-style C enums.
    * [145205] Ensured that a warning is given when a known interface
      (marked with Q_DECLARE_INTERFACE) is subclassed that is not mentioned
      in Q_INTERFACES.
    * [97300] Allow @file to be given as the options input file to handle
      command lines larger than allowed by the operating system.

- uic
    * [144383] Added checks to prevent generated code from calling
      ensurePolished() before each constructor is finished.
    * [138949] Ensured that font and size policy instances are reused in
      generated code.
    * [141350] Ensured that color brushes are reused in generated code.
    * [141217] Improved handling of include files of Qt 3 classes.
    * [144371] Ensure that each form's objectName property is not set in
      setupUi() to avoid problems in cases where the name was already set.
    * Added support for the QWidget::locale property.
    * [141820] Fixed generation of connections in the form.
    * [137520] Ensured that code to set toolTip, statusTip and whatsThis
      properties is not generated when the corresponding QT_NO_*
      preprocessor macros are defined.
    * [128958] Ensured that static casts are not used in generated code.
    * [116280] Added support for qulonglong and uint types.

-uic3
    * [137915] Added functionality to extract images via the -extract
      command line option.
    * [129950] Added the -wrap command line option which specifies that a
      wrapper class which is Qt 3 source compatible should be generated.

- qmake
    * [121965] Implemented DSW (Workspace files) generation for MSVC 6.0
      users.
    * [132154] Added support for /bigobj option in the vcproj generator.
    * Fixed crash with dependency analysis.
    * Ensure that cleanup rules are not added for extra compilers with no
      inputs.
    * LEX/YACC support has been moved into .prf files.
    * [156793] Introduced PRECOMPILED_DIR for PCH output (defaults to
      OBJECTS_DIR).
    * [257985] Fixed qmake location detection bug.
    * Ensured that empty INCLUDEPATH definitions are stripped out.
    * Allow QMAKE_UUID to override qmake deteremined UUID in the vcproj
      generator.
    * [151332] Ensured that .pc files are terminated with an extra carriage
      return.
    * [148535] Introduced QMAKE_FRAMEWORKPATH and used it internally.
    * [127415] Fixed object_with_source.
    * [127413] Introduced QMAKE_FILE_IN_PATH placeholder for extra
      compilers.
    * [95975] Replaced QMAKE_FILE_IN for custom build steps in DSP
      generator.
    * [141749] Added checks to prevent cyclical dependencies.
    * [146368] Ensured that GNUmake .d files are removed upon distclean.
    * Improved extensibility of the precompiled header support to allow icc
      precompiled headers.
    * [147142] Short-circuit previously seen library paths to avoid
      cyclical .prl processing.
    * [144492] Ensured that INSTALL_PROGRAM is set for INSTALLS in
      macx-xcode projects.
    * [143720] Extra compilers will now depend upon the input file
      automatically.
    * Introduced QMAKE_DISTCLEAN for extra files to be removed upon
      invocation of "make distclean".
    * [133518] Reduced the noise created by qmake warnings.
    * [108012] Brought macx-xcode into line with macx-g++ with regards to
      custom bundle types.
    * [128759] Added support for spaces in paths to linked libraries.
    * [83445] Made sure that "make distclean" in a library with a DESTDIR
      really does remove the destination symbolic links.
    * The subdir generator will now use - to separate target words and _ to
      separate internally appended words.
    * [125557] Fixed broken generation of dependencies for extra compilers.
    * Ensured that the QMAKE_QMAKE variable is given a reasonable default
      before parsing and evaluating project files.
    * For Unix/Mac OS X, configure now has an -optimized-qmake option that
      allows people to build qmake with optimizations.
      This is disabled by default as older versions of some compilers take
      a long time to build an optimized qmake. qmake is already built with
      optimizations on Windows.
    * [130979] Made the incremental link option case-insensitive.
    * Ensured that paths for custom build steps in vcproj files have the
      correct seperators.
    * Avoid duplicate dependency paths, reduce file stats.
    * [91313] Ensured that multiple commands in the DSP generator are
      separated with \n\t characters.
    * [108681] Added checks to avoid problems with uic3 files having
      dependencies on themselves.
    * [130977] Added support for non-flat output for vcproj files with
      single configuration.
    * [134971] Added support for more compiler and linker options for
      vcproj files, and added catch-all cases which add options to
      AdditionalOptions variables.
    * [140548] Fixed escaping of the custom build step for image
      collections.
    * [114833] Ensured that paths in vcproj always have native filing
      system separators.
    * [144020] Only allow CONFIG+=staticlib for TEMPLATE==lib.
    * [97300] Handle large number of include paths on Windows for moc by
      using temporary files. (See moc changes.)
    * [150519] Ensured that qmake is compiled with the correct mkspec on
      Windows.
    * [148724] Added manifest files to project clean up.
    * [123501] Added /LIBPATH to AdditionalLibraryPaths in vcproj files.
    * [80526] Made sure that extra compiler commands are not corrupted due
      to path separator fixing.
    * [109322] Moved hardcoded extra compilers, yacc and lex, into the PRF
      (feature) system.
    * [101783] Added a _DEBUG to Resource Tool for debug builds on Windows.
    * [145074] Added a custom build step on input files, for extra compiler
      files with built-in compilers for the output files.
    * [150961] Added support for QMAKE_PRE_LINK in the DSP and VCPROJ
      generators.
    * Added checks to avoid double escaping of DESTDIR_TARGET file paths in
      Windows Makefiles.
    * Ensured that file paths for COPY_FILE and QMAKE_BUNDLE are escaped.
    * [83765] Ensured that input files instead of output files are added to
      extra compiler steps under certain conditions.
    * [101482] Fixed relative path handling for RC_FILE.

****************************************************************************
*                          Plugins                                         *
****************************************************************************

- QTiffPlugin
    * [93364] Added support for the TIFF image format.
