Qt 4.2 introduces many new features as well as many improvements and
bugfixes over the 4.1.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/

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

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


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


New features
------------

- QCalendarWidget provides a standard monthly calendar widget with date
  selection features.

- QCleanlooksStyle provides the new Cleanlooks style, a clone of the GNOME
  ClearLooks style, giving Qt applications a native look on GNOME desktops.

- QCompleter provides facilities for auto completion in text entry widgets.

- QDataWidgetMapper can be used to make widgets data-aware by mapping them
  to sections of an item model.

- QDesktopServices provides desktop integration features, such as support
  for opening URLs using system services.

- QDialogButtonBox is used in dialogs to ensure that buttons are placed
  according to platform-specific style guidelines.

- QFileSystemWatcher enables applications to monitor files and directories
  for changes.

- QFontComboBox provides a standard font selection widget for document
  processing applications.

- QGraphicsView and related classes provide the Graphics View framework, a
  replacement for Qt 3's canvas module that provides an improved API, enhanced
  rendering, and more responsive handling of large numbers of canvas items.

- QGLFramebufferObject encapsulates OpenGL framebuffer objects.

- QMacPasteboardMime handles Pasteboard access on Qt/Mac. This obsoletes
  QMacMime as the underlying system has changed to support Apple's new
  Pasteboard Manager. Any old QMacMime objects will not be used.

- QNetworkInterface represents a network interface, providing information
  about the host's IP addresses and network interfaces.

- QResource provides static functions that control resource lookup and
  provides a way to navigate resources directly without levels of
  indirection through QFile/QFileEngine.

- QSystemTrayIcon allows applications to provide their own icon in the
  system tray.

- QTimeLine gives developers access to a standard time line class with which
  to create widget animations.

- The QtDBus module provides inter-process communication on platforms
  that support the D-BUS protocol.

- The QUndo* classes in Qt's Undo framework provide undo/redo functionality
  for applications.

- Support for the Glib event loop to enable integration between Qt and non-Qt
  applications on the GNOME desktop environment.

- Improved Accessibility for item-based views and QTextEdit.

- Support for main window animations and tabbed dock widgets.

- Added an SVG icon engine to enable SVG drawings to be used by QIcon.

- Widgets can now be styled according to rules specified in a style sheet,
  using a syntax familiar to users of Cascading Style Sheets (CSS). Style
  sheets are set using the QWidget::styleSheet property.

- Introduced a new key mapper system which improves the shortcut system by
  only testing the real possible shortcuts, such as Ctrl+Shift+= and Ctrl++
  on an English keyboard.

- Improved and enhanced QMessageBox to support native look and feel on many
  common platforms.

- Experimental support for Qt usage reporting ("metered licenses") on Linux,
  Windows and Mac OS X. Reporting is disabled by default.

- A screen magnification utility, pixeltool, is provided. It is designed to help
  with the process of fine-tuning styles and user interface features.

- New qrand() and qsrand() functions to provide thread safe equivalents to
  rand() and srand().


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

- Item views

      * Selections are maintained when the layout of the model changes
        (e.g., due to sorting).

      * Convenience views can perform dynamic sorting of items when the data
        in items changes.

      * QStandardItem provides an item-based API for use with
        QStandardItemModel and the model/view item view classes.

      * QStandardItemModel API provides a classic item-based approach to
        working with models.

      * Single selection item views on Mac OS X cannot change their current
        item without changing the current selection when using keyboard
        navigation.

- Plastique style has improved support for palettes, and now requires
  XRender support on X11 for alpha transparency.

- Tulip containers

      * Added typedefs for STL compatability.

      * Added function overloads to make the API easier to use.

- Added the Q3TextStream class for compatiblity with Qt 3 and to assist with
  porting projects.

- OpenGL paint engine

      * Added support for all composition modes of QPainter natively using
        OpenGL.

      * Fixed a case where very large polygons failed to render correctly.

      * Ensured that glClear() is only called in begin() if the
        QGLWidget::autoFillBackground() property is true.

      * Ensured that a buffer swap is only performed in end() if
        QGLWidget::autoBufferSwap() is true.

      * Improved text drawing speed and quality.

- Raster paint engine

      * Fixed blending of 8 bit indexed images with alpha values.

      * Fixed drawing onto QImages that were wider than 2048 pixels.

      * Fixed alpha-blending and anti-aliasing on ARGB32 images.

      * Improved point drawing performance.

      * Fixed issue where lines were drawn between coordinates that were
        rounded instead of truncated.

      * Ensured that setClipRegion(QRegion()) clips away all painting
        operations as originally intended.


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

- Dropped support for MySQL version 3.

- Updated Qt's SQLite version to 3.3.6.

- Updated Qt's FreeType version to 2.2.1.

- Updated Qt's libpng version to 1.2.10.


Build System
------------

- Auto-detect PostgreSQL and MySQL using pg_config and mysql_config on UNIX
  based systems in the configure script

- Added "-system-sqlite" option to configure to use the system's SQLite
  library instead of Qt's SQLite version.

- Added QT_ASCII_CAST_WARNINGS define that will output a warning on implicit
  ascii to Unicode conversion when set. Only works if the compiler supports
  deprecated API warnings.

- Added Q_REQUIRED_RESULT to some functions. This macro triggers a warning
  if the result of a function is discarded. Currently only supported by gcc.


- Qt/X11, Qt/Mac and Qtopia Core only:

     * Added all QT_NO_* defines to the build key.


- Qt/X11 and Qtopia Core only:

     * As in Qt 3, the configure script enables the -release option by
       default, causing the Qt libraries to be built with optimizations. If
       configured with the -debug option, the debug builds no longer result
       in libraries with the _debug suffix.

       On modern systems, flags are added to the Qt build to also
       generate debugging information, which is then stored in a
       separate .debug file. The additional debug information does not
       affect the performance of the optimized code and tools like gdb
       and valgrind automatically pick up the separate .debug
       files. This way it is possible to get useful backtraces even
       with release builds of Qt.

     * Removed the last vestiges of the module options in the configure
       script, previously they were available but did not function.

     * Implemented a -build option in the configure script to conditionally
       compile only certain sections of Qt.

     * Made it possible to build Qt while having "xcode" set as your
       QMAKESPEC on OSX.


- Windows only:

     * Populated the build key, as done on all the other platforms.

     * Fixed dependency generation in Visual Studio Solutions (.sln)
       created by qmake.

     * Added missing platforms to the Visual Studio project generator (X64,
       SH3DSP and EBC).

     * Made UIC3 use a temporary file for long command lines.

     * Removed the object file (.o) conflicts with MinGW that appeared when
       embedding a native resource file which was named the same as a normal
       source file.

     * Fixed mkspec detection when generating project files outside of QTDIR.

     * Removed compiler warnings with MinGW g++ 3.4.5.



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


- QAbstractButton

      * Returns QPalette::Button and QPalette::ButtonText for
        backgroundRole() and foregroundRole(), respectively, rather than
        QPalette::Background and QPalette::Foreground.

      * Ensured that nextCheckState() is called only when there is a state
        change.

- QAbstractItemModel

      * When dropping rows only insert rows that were actually dropped, not
        the continuous row count from first to last.

      * Added a supportedDragActions property to be used by
        QAbstractItemView when starting a drag.

      * When updating changed persistent indexes, ignore those that haven't
        actually changed.

      * Fixed endian issue with createIndex().

      * Added FixedString matching for match().

      * Changed the sorting algorithm to use a stable sort.

      * Added persistentIndexList() function.

- QAbstractItemView

      * Added possibility to copy elements to clipboard on read-only views.

      * Improved handling of QAbstractItemModel::supportedDropActions().

      * Ensured that the current item is selected when using keyboard
        search.

      * Ensured that the view starts with a valid current index.

      * Ensured that data is only committed in currentChanged() if the
        editor is not persistent.

      * Fixed crash that occurred when a modal dialogs was opened when
        closing an editor.

      * Added verticalScrollMode and horizontalScrollMode properties.

      * Added setItemDelegateForRow() and setItemDelegateForColumn().

      * Ensured that existing models are disconnected properly when
        replaced.

      * Ensured that the doubleClicked() signal is only emitted when the
        left button has been double-clicked.

      * Changed setSelection(...) to work when given a non-normalized
        rectangle.

      * Fixed regression for shift-selections in ExtendedSelection for
        all views.

      * Added dragDropMode property and implemented move support in all of
        the views and models.

      * For edit triggers SelectedClicked and DoubleClicked, only trigger
        editing when the left button is clicked.

      * Trigger SelectedClicked editing on mouse release, not mouse press.

      * Suppressed the doubleClicked() signal in cases where the clicks
        happened on two different items.

      * Enabled keyboard search to be programmatically reset by calling
        keyboardSearch() with an empty string as argument.

      * Don't allow drops on items that don't have the Qt::ItemIsDropEnabled
        flag set.

      * Added modelAboutToBeReset() and layoutAboutToBeChanged() signals.

      * Suppressed assertion in dropMimeData() for cases where mimeTypes()
        returns an empty list.

      * Ensured consistent behavior of drag and drop when rootIndex() is a
        valid model index.

      * Made it possible to check a checkbox with only a single click when
        using the CurrentChanged edit trigger.

      * Ensured that WhatsThis events are propagated when the relevant item
        doesn't have a valid "What's This?" value.

      * Added PositionAtCenter scrollHint.

      * Added support to allow items to be checked and unchecked using the
        keyboard.

      * Added support for keypad navigation.

- QAbstractProxyModel

      * Added default implementations for data(), headerData() and flags()

- QAbstractScrollArea

      * Added ability to set a corner widget.

      * Added ability to set scroll bar widgets.

      * Added support for custom scroll bars.

- QAbstractSpinBox

      * Added a hasAcceptableInput() property.

      * Ensured that fixup/validate are called for third party subclasses of
        QAbstractSpinBox as well.

      * Fixed geometry issues when toggling frames on and off for spinboxes.

      * Added a property for correctionMode.

      * Added a property for acceleration.

- QAbstractPrintDialog

      * Fixed handling of existing printer options so that storage of page
        ranges using setFromTo() works as expected when printing in PDF format.

- QAction

      * Added the setAutoRepeat(bool) function to disable auto-repeating
        actions on keyboard shortcuts.

- QApplication

      * Added saveStateRequest() and commitDataRequest() signals so that
        QApplication does not need to be subclassed to enable session
        management in an application.

      * Added the styleSheet property to get/set the application style sheet.

      * Support sending key events to non-widget objects.

      * Ensured that argc and argv as passed to the QApplication constructor
        will always be zero-terminated on all platforms after QApplication
        consumes command line options for itself.

- QBrush

      * Added a constructor that accepts a QImage.

- QButtonGroup

      * Added pressed() and released() signals.

      * Fixed a bug caused by removing buttons from button groups. Removed the
        internal mapping as well.

      * Ensured that checkedButton() returns the correct value with
        non-exclusive groups.

- QClipboard

      * Added support for find text buffer.

- QColor

      * Fixed corruption in setRed(), setGreen() and setBlue() for HSV/CMYK
        colors.

- QComboBox

      * Fixed drawing issues related to certain FocusPolicy values.

      * Ensured that the ItemFlags of an Item (ItemIsEnabled,...) are
        respected.

      * Fixed cases where the popup could be shown completly on screen, but
        weren't.

      * Added the InsertAlphabetically insert policy.

      * Fixed case where a QPixmap could not be displayed using a QIcon.

      * Fixed the type of the modelColumn property from bool to int.

      * Updated documentation to clarify the differences between activated(),
        highlighted() and currentIndexChanged(), and describe what they
        actually mean.

      * Updated the behavior to ensure that, if the combobox isn't editable,
        the Qt::DisplayRole rather than the Qt::EditRole is used to query the
        model.

- QCoreApplication

      * Added flags to enable/disable application-wide features such as
        delayed widget creation.

- QCursor

      * Added support for the newly added Qt::OpenHandCursor and
        Qt::ClosedHandCursor enum values.

- QDate

      * Support dates all the way down to Julian Day 1 (2 January 4713 B.C.)
        using the Julian calendar when appropriate.

- QDateTime

      * Fixed parsing issue in fromString(const QString &, Qt::DateFormat).

- QDateTimeEdit

      * Added the calendarPopup property to enable date selection using the
        new QCalendarWidget class.

      * Added a setSelectedSection() function to allow the currently selected
        section to be programmatically set.

- QDesktopWidget

      * Remove a potential out-of-bounds read.

- QDialog

      * Improved stability in cases where the default button is deleted.

- QDir

      * Improved support for i18n file paths in QDir::tempPath().

      * Improved support for UNC paths when the application is run from a
        share.

      * Ensured that mkpath() properly supports UNC paths.

      * Obsoleted QDir::convertSeparators().

      * Introduced QDir::toNativeSeparators() and QDir::fromNativeSeparators().

      * Added a QDebug streaming operator.

- QDirModel

      * Fixed conversion from bytes to larger units in QDirModel in the file
        size display.

      * Remove hardcoded filtering of the '.' and '..' entries.

- QErrorMessage

      * Made qtHandler() work in cases where the message handler is invoked
        from threads other than the GUI thread.

- QEvent

      * Added the KeyboardLayoutChange event type which is sent when the
        keyboard layout changes.

- QFile

      * Improved support for UNC paths when the application is run from a
        share.

      * Added support for physical drives (e.g., "//./Physical01").

      * Ensured that QFile::error() and QIODevice::errorString() are set
        whenever possible when errors occur.

      * Renamed readLink() to symLinkTarget().

- QFileDialog

      * Fixed a case where view mode got disabled.

- QFileInfo

      * Improved support for UNC paths when the application is run from a
        share.
        
      * Improved support for drive-local relative paths, such as "D:".

      * Renamed readLink() to symLinkTarget().

- QFlags

      * Added the testFlag() convenience function.

- QFont

      * Added NoFontMerging as a flag to QFont::StyleStrategy.

- QFontDatabase

      * Added functions for handling application-local fonts at run-time:
        addApplicationFont(), removeApplicationFont(),
        applicationFontFamilies(), etc.

- QFontDialog

      * Enabled support for custom window titles.

- QFontMetrics/QFontMetricsF

      * Added the elidedText() function.

      * Added the averageCharWidth() function.

- QFrame

      * Fixed a rendering issue when showing horizontal and vertical lines
        created using Designer.

- QFtp

      * Improved parsing of the modified date in list().

      * Ensured that all data has been received when downloading, before the
        data connection is closed.

      * Added support for FTP servers that reject commands with a 202 response.

- QGLFormat

      * Added the openGLVersionFlags() function.

      * Added support for setting the swap interval for a context
        (i.e., syncing to the vertical retrace).

      * Added support for setting red, green and blue buffer sizes.

- QGLWidget

      * Fixed a resource leak that could occur when binding QImages with the
        bindTexture() function.

      * Fixed renderText() to produce proper output when depth buffering is
        enabled.

      * Fixed bindTexture() to respect premultiplied QImage formats.

      * Ensured that the updatesEnabled property is respected.

- QGradient

      * Added default constructors and setter functions for all gradients and
        their attributes.

- QGridLayout

      * Do not segfault if cellRect() is called before setGeometry(), 
        even though the result is documented to be undefined.

      * Fixed maximum size handling when adding spacing.

- QGroupBox

      * Activating a group box by a shortcut will now show the focus rectangle.

      * Added the clicked() signal

- QHash

      * Prevent conversion of iterator or const_iterator to bool
        (e.g., if (map->find(value))) because the conversion always returned
        true. Qt 4.1 code that doesn't compile because of this change was most
        probably buggy.

      * Added the uniqueKeys() function.

- QHeaderView

      * Use the current resize mode to determine section sizes when
        new rows are inserted.

      * Recover the internal state if other widgets steal the mouse release
        event.

      * Ensure that moved sections can be removed without asserting.

      * Be more robust with regards to arguments sent to the rowsInserted slot.

      * Let the stretchLastSection property override the globalResizeMode in
        the resizeSections() function.

      * Renamed ResizeMode::Custom to ResizeMode::Fixed.

      * Added the swapSections() convenience function.

      * Added a more "splitter-like" resize mode.

      * Added the possibility for the user to turn off stretch mode by
        resizing the header section. This includes the stretchLastSection
        property.

      * Added the minimumSectionSize property.

      * Get the section size hint from the Qt::SizeHintRole, if set.

      * Added the ResizeToContents resize mode.

      * Ensure that all header contents are centered by default.

      * Improved the internal structure to be more memory efficient.

- QHostAddress

      * Added QDataStream streaming operators.

- QHttp

      * Support percent-encoded paths when used with a proxy server.

      * Improved handling of unexpected remote socket close.

- QHttpHeader

      * Improved support for case-insensitive header searching.

- QIcon

      * Fixed issue where actualSize() might return a larger value than the
        requested size.

      * Fixed improper pixmap caching

      * Added QDataStream operators for QIcon.

      * Added the Selected mode.

- QImage

      * Added support for 16 bit RGB format.

      * Added QPoint overloads to various (int x, int y) functions.

      * Added support for faster/better rotation of images by 90/180/270
        degrees.

      * convertToFormat() now supports the color lookup table.

      * Improved algorithm for smooth scaling to produce better results.

- QImageReader

      * Ensured that size() returns an invalid QSize if the image I/O handler
        does not support the QImageIOHandler::Size extension.

      * Added support for reading negative BMP images.

      * Improved handling of invalid devices.

      * Added optimizations to ensure that the most likely formats and plugins
        are tested first when reading unknown image formats.

      * Improved reading of BMP images from sequential QIODevices.

      * Support for scaledSize() with JPEG images.

      * It is now possible to query the supported options of an image by
        calling supportedOptions().

      * Stability fixes for the built-in XBM reader.

- QImageWriter

      * Ensured that an error is reported when attempting to write an image
        to a non-writable device.

      * It is now possible to query the supported options of an image by
        calling supportedOptions().

- QIODevice

      * Fixed a casting bug in QIODevice::getChar().

      * Improved reading performance significantly by using an internal buffer
        when a device is opened in buffered mode.

      * Some behavioral differences have been introduced:

        + The following functions now need to call the base implementation
          when reimplemented: atEnd(), bytesAvailable(), size(), canReadLine().

        + pos() should return the base implementation directly.

        + QIODevice now handles the device position internally. seek() should
          always end up calling the base implementation.

- QItemDelegate

      * Use a widget's USER property to set and get the editor data.

      * Removed unnecessary assertions.

      * Added the clipping property to enable clipping when painting.

      * When the model specifies a font, resolve the font over the existing
        one rather than replacing it.

      * Fixed issue with rendering of selected pixmaps.

      * Ensured that QItemEditorFactory is called with the variant's
        userType() so that the factory can distinguish between multiple user
        types.

      * Ensured that Key_Enter is propagated to the editor before data is
        committed, so that the editor has a chance to perform custom input
        validation/fixup.

      * Let the line edit grow to accomodate long strings.

      * Made it easer to subclass the item delegate.

      * Added support for keypad navigation.

- QItemSelectionModel

      * Improved overall speed, particularly when isSelected() is used.

      * Added functions for getting the selected rows or columns.

      * Ensured that the current index is updated when it is being removed.

      * Ensure that QAbstractItemView::clearSelection() only clears the
        selection and not the current index.

      * Added the hasSelection() function.

      * Fixed some connection leaks (connections were not disconnected) when
        an QItemSelectionModel was deleted. This should also speed up some
        special cases.

- QKeySequence

      * Added a set of platform-dependent standard shortcuts.

      * Fixed incorrect parsing of translated modifiers.

- QLabel

      * Added support for text selection and hyperlinks.

      * Improved handling of scaled pixmaps.

      * Made handling of QMovie safer to avoid object ownership issues.

- QLibrary

      * Added support for hints to control how libraries are opened on UNIX
        systems.

      * Added errorString() to report the causes of errors when libraries
        fail to load.

      * Added easier way to debug plugin loading: Setting QT_DEBUG_PLUGINS=1
        in the environment will enable debug message printing on the
        console.

      * Increased the number of acceptable file name suffixes used to
        recognize library files.

- QLineEdit

      * Ensured that the Unicode context menu gets shown if language
        extensions are present.
        
      * Ensured that editingFinished() is not emitted if a validator is set
        and the text cannot be validated.

      * Ctrl+A now triggers select all on all platforms.

      * Call fixup on focusOut() if !hasAcceptableInput().

      * Added auto-completion support with the setCompleter() function.

      * Fixed painting errors when contents margins were set.

      * Invalid text set using setText() can now be edited where previously
        it had to be deleted before new text could be inserted.

      * Use SE_LineEditContents to control the contents rect of each
        QLineEdit.

- QListView

      * Added the batchSize property.

      * Don't un-hide currently hidden rows when new rows are inserted.

      * Fixed partial repainting bug that occurred when alternatingRowColors
        was enabled.

      * Ensured that the resize mode is not reset in setViewMode() if it was
        already set.

      * Fixed crash that occurred when the first item was hidden and
        uniformItemSizes was set.

      * Added the wordWrap property for wrapping item text.

      * Allow the user to select items consecutively when shift-selecting.

      * Ensured that only the top item is selected when the user clicks on
        an area with several items are stacked on top of each other.

      * Optimized hiding and showing of items.

      * Fixed issue where dragging an item in Snap mode did not respect the
        scroll bar offsets.

      * Fixed issue in Snap mode where a (drag and) drop did not always
        query the item that existed in the corresponding cell for an enabled
        Qt::ItemIsDropEnabled flag. 

- QListWidget/QTreeWidget/QTableWidget

      * Ensured the dataChanged() signal is emitted when flags are set on an
        item.

      * Removed unnecessary assertions.

      * Added more convenience functions in QListWidget, QTableWidget and
        QTreeWidget for selecting, hiding, showing, expanding and collapsing
        nodes.

      * Ensured that changes to items are reported.

- QLocale

      * Fixed bug in the string-to-number functions which sometimes caused
        them to fail on negative numbers which contained thousand-
        separators.

      * Implemented the numberOptions property for specifying how
        string-to-number and number-to-string conversions should be
        performed.

- QMainWindow

      * Added support for tabbed dock widgets.

      * Enhanced look and feel of dock widget handling. When a dock widget
        hovers over a main window, the main window animates the existing
        dock widgets and main area to show how it will accept the dock
        widget if dropped.

      * Fixed issues related to insertToolBarBreak().

- QMap

      * Prevent conversion of iterator or const_iterator to bool
        (e.g., if (map->find(value))), because the conversion always
        returned true. Qt 4.1 code that doesn't compile because of this
        change was most probably buggy.

      * Added the uniqueKeys() function.

- QMenu

      * Added the aboutToHide() signal.

      * Added the isEmpty() accessor function.

      * Clear menuAction() when setMenu(0)

      * Added support for widgets in menus via QWidgetAction.

      * Collapse multiple consecutive separators. This can be turned off
        with the collapsibleSeparators property.

      * Made scrollable menus wrap, just like non-scrollable ones.

- QMessageBox

      * Updated the API to allow more than 3 buttons to be used.

      * Added support to display buttons in the order required by
        platform-specific style guidelines.

      * Added support for display of informative text using the
        informativeText property.

      * Added the detailedText property to allow detailed text to be
        displayed.

      * Improved sizing of message box (especially on Mac OS X).

      * Changed the behavior so that long text strings are automatically
        wrapped.

      * Updated icon handling to use QStyle::standardIcon() where possible.

- QMetaObject

      * Added the userProperty() and normalizedType() functions.

- QMetaType

      * Ensured that all type names are normalized before registering them.

      * Added support for handling Qt's integer typedefs: qint8, qint16,
        etc.

- QModelIndex

      * Added the flags() convenience function.

- QMutexLocker, QReadLocker, and QWriteLocker

      * These classes now track the state of the lock they are holding.
        They will not unlock on destruction if unlock() has been called.

- QObject

      * thread() will always return a valid thread, even if the object was
        created before QApplication or in a non-QThread thread.

      * When thread() returns zero, events are no longer sent to the object.
        (Previous versions of Qt would send posted events to objects with no
        thread; this does not happen in Qt 4.2).

      * Added support for dynamically added properties via the new
        property(), setProperty(), and dynamicPropertyNames() functions.

      * Fixed a crash that could occur when a child deleted its sibling.

- QPainter

      * Fixed a crash the occurred when drawing cosmetic lines outside the
        paint device boundaries.

      * Fixed a pixel artifact issue that occurred when drawing cosmetic
        diagonal lines.

      * Fixed opaque backgrounds so that they are identical on all
        platforms.

      * Optimized drawing of cosmetic lines at angles between 315 and 360
        degrees.

      * Added the setRenderHints() function.

      * Fixed a memory corruption issue in drawEllipse().

- QPixmap

      * Fixed crash caused by setting a mask or alpha channel on a pixmap
        while it was being painted.

      * Changed load() and save() to no longer require a format string.

      * Ensured that grabWidget() works before the specified widget is first
        shown.

- QPluginLoader

      * Added errorString() to report the causes of errors when plugins fail
        to load.
        
- QPrinter

      * Added support for PostScript as an output format on all platforms.

      * Significantly reduced the size of the generated output when using
        the PostScript and PDF drivers.

      * Fixed issue where fromPage()/toPage() returned incorrect values when
        generating PDF files.

      * Ensured that setOutputFormat() preserves previously set printer
        properties.

      * Updated setOutputFileName() to automatically choose PostScript or
        PDF as the output format for .ps or .pdf suffixes.

- QProcess

      * Added support for channel redirection to allow data to be redirected
        to files or between processes.

- QPushButton

      * Ensured that, when a menu is added to a push button, its action is
        also added to enable keyboard shortcuts.

- QRect, QRectF, QRegion

      * Renamed unite(), intersect(), subtract(), and eor() to united(),
        intersected(), subtracted(), and xored() respectively.

      * Added QRegion::intersects(QRegion) and QRegion::intersects(QRect).

      * Fixed case where rect1 & rect2 & rect3 would return a non-empty
        result for disjoint rectangles.

- QRegExp

      * Added RegExp2 syntax, providing greedy quantifiers (+, *, etc.).

      * Marks (QChar::isMark()) are now treated as word characters,
        affecting the behavior of '\b', '\w', and '\W' for languages
        that use diacritic marks (e.g., Arabic).

      * Fix reentrancy issue with the regexp cache.

- QScrollArea

      * Added the ensureWidgetVisible() function to facilitate scrolling to
        specific child widgets in a scroll area.

- QScrollBar

      * Ensured that a SliderMove action is triggered when the slider value is
        changed through a wheel event.

- QSet

      * Added QSet::iterator and QMutableSetIterator.

- QSettings

      * Store key sequences as readable entries in INI files.

      * Detect NFS to prevent hanging when lockd isn't running.

- QShortcut

      * Added the setAutoRepeat(bool) function to disable auto-repeating
        actions on keyboard shortcuts.

- QSize

      * Fixed potential overflow issue in scale().

- QSlider

      * Added support for jump-to-here positioning.

- QSortFilterProxyModel

      * Handle source model changes (e.g., data changes, item insertion
        and removal) in a fine-grained manner, so that the proxy model
        behaves more like a "real" model.

      * Added sortRole, filterRole and dynamicSortFilter properties.

      * Perform stable sorting of items.

      * Fixed support for drag and drop operations where one item is dropped
        on top of another.

      * Ensure that persistent indexes are updated when the layout of the
        source model changes.

      * Made match() respect the current sorting and filtering settings.

      * Forward mimeTypes() and supportedDropActions() calls to source
        models.

      * Added the ability to filter on all the columns.

      * Added the filterChanged() function to enable custom filtering to be
        implemented.

- QSqlQuery

      * Added execBatch() for executing SQL commands in a batch. Currently
        only implemented for the Oracle driver.

      * Fixed a case where executedQuery() would not return the executed
        query.

- QSqlRelationalTableModel

      * Fixed issue related to sorting a relational column when using the
        PostgreSQL driver.

      * revertAll() now correctly reverts relational columns.

- QStackedLayout

      * Fixed crash that occurred when removing widgets under certain
        conditions.

- QStackedWidget

      * Fixed crash that occurred when removing widgets under certain
        conditions.

      * Fixed issue where the size hint of the current widget would not be
        respected.

- QStandardItemModel

      * Added an item-based API for use with QStandardItem.

      * Reimplemented sort().

      * Added the sortRole property.

- QStatusBar

      * Added the insertWidget() and insertPermanentWidget() functions.

- QString

      * Added support for case-insensitive comparison in compare().

      * Added toUcs4() and fromUcs4() functions.

- QStyle

      * Added the following style hint selectors:
        SH_Slider_AbsoluteSetButtons, SH_Slider_PageSetButtons,
        SH_Menu_KeyboardSearch, SH_TabBar_ElideMode, SH_DialogButtonLayout,
        SH_ComboBox_PopupFrameStyle, SH_MessageBox_TextInteractionFlags,
        SH_DialogButtonBox_ButtonsHaveIcons, SH_SpellCheckUnderlineStyle,
        SH_MessageBox_CenterButtons, SH_Menu_SelectionWrap,
        SH_ItemView_MovementWithoutUpdatingSelection.

      * Added the following standard pixmap selectors:
        SP_DirIcon, SP_DialogOkButton, SP_DialogCancelButton,
        SP_DialogHelpButton, SP_DialogOpenButton, SP_DialogSaveButton,
        SP_DialogCloseButton, SP_DialogApplyButton, SP_DialogResetButton,
        SP_DialogDiscardButton, SP_DialogYesButton, SP_DialogNoButton,
        SP_ArrowUp, SP_ArrowDown, SP_ArrowLeft, SP_ArrowRight, SP_ArrowBack,
        SP_ArrowForward.

      * Added PE_PanelScrollAreaCorner and PE_Widget as primitive element
        selectors.

      * Added PM_MessageBoxIconSize and PM_ButtonIconSize as pixel metric
        selectors.
        
      * Added SE_LineEditContents and SE_FrameContents as sub-element
        selectors.

      * Added SE_FrameContents to control the contents rectangle of a
        QFrame.

- QSvgHandler

      * Improved style sheet parsing and handling.

      * Added support for both embedded and external style sheets.

      * Improved parsing of local url() references.

      * Improved coordinate system handling.

      * Fixed issue where the viewbox dimensions would be truncated to integer
        values.

      * Fixed support for gradient transformations.

      * Fixed opacity inheritance behavior.

      * Added support for gradient spreads.

      * Fixed gradient stop inheritance behavior.

      * Fixed parsing of fill and stroke properties specified in style sheets.

      * Added support for reading and writing the duration of animated SVGs.

      * Fixed incorrect rendering of SVGs that do not specify default viewboxes.

      * Fixed radial gradient rendering for the case where no focal point is
        specified.

- QSyntaxHighlighter

      * Added various performance improvements.

- Qt namespace

      * Added ForegroundRole and BackgroundRole, allowing itemviews to use
        any QBrush (not just QColor, as previously) when rendering items.

      * Added NoDockWidgetArea to the ToolBarArea enum.

      * Added NoToolBarArea to the DockWidgetArea enum.

      * Added GroupSwitchModifier to the KeyboardModifiers enum. It
        represents special keys, such as the "AltGr" key found on many
        keyboards.

      * Added several missing keys to the Key enum: Key_Cancel, Key_Printer,
        Key_Execute, Key_Sleep, Key_Play and Key_Zoom.

      * Added OpenHandCursor and ClosedHandCursor for use with QCursor.

- QTabBar

      * QTabBar text can now be elided; this is controlled by the elideMode
        property.

      * You can now turn on or off the "scroll buttons" for the tab bar with
        the usesScrollButtons property.

      * Non-pixmap based styles will now fill the background of the tab with
        the palette's window role.

- QTabletEvent:

      * Ensured that QTabletEvents are dispatched with the proper relative
        coordinates.

      * Added proximity as another type of a tablet event (currently only sent
        to QApplication).

- QTableView

      * Added API for spanning cells.

      * Ensured that cells are selected when the user right clicks on them.

      * Added a corner widget.

      * Added the setSortingEnabled property.

- QTableWidget

      * Added the clearContents() function to enable the contents of the view
        to be cleared while not resetting the headers.

      * QTableWidget now uses stable sorting.

      * Allow sorting of non-numerical data.

      * Add convenience table item constructor that takes an icon as well as
        a string.

- QTabWidget

      * Added missing selected() Qt3Support signal.

      * Clarified documentation for setCornerWidget().

      * Ensured that the tab widget's frame is drawn correctly when the tab
        bar is hidden.

      * Ensured that the internal widgets have object names.

      * Added iconSize, elideMode, and usesScrollButtons as properties (see
        QTabBar).

- QTcpSocket

      * Fixed a rare data corruption problem occurring on heavily loaded
        Windows servers.

- QTemporaryFile

      * Added support for file extensions and other suffixes.

      * Fixed one constructor which could corrupt the temporary file path.

- QTextBrowser

      * Fixed various bugs with the handling of relative URLs and custom
        protocols.

      * Added isBackwardAvailable(), isForwardAvailable(), and
        clearHistory() functions.

- QTextCodec

      * Allow locale-dependent features of Qt, such as QFile::exists(), to
        be accessed during global destruction.

- QTextCursor

      * Added columnNumber(), blockNumber(), and insertHtml() convenience
        functions.

- QTextDocument

      * Added convenience properties and functions: textWidth, idealWidth(),
        size, adjustSize(), drawContents(), blockCount, maximumBlockCount.

      * Added support for forced page breaks before/after paragraphs and
        tables.

      * Added CSS support to the HTML importer, including support for
        CSS selectors.

      * Added defaultStyleSheet property that is applied automatically for
        every HTML import.

      * Improved performance when importing HTML, especially with tables.

      * Improved pagination of tables across page boundaries.

- QTextEdit

      * Fixed append() to use the current character format.

      * Changed mergeCurrentCharFormat() to behave in the same way as
        QTextCursor::mergeCharFormat, without applying the format to the
        word under the cursor.

      * QTextEdit now ensures that the cursor is visible the first time the
        widget is shown or when replacing the contents entirely with
        setPlainText() or setHtml().

      * Fixed issue where the setPlainText() discarded the current character
        format after the new text had been added to the document.

      * Re-added setText() as non-compatibility function with well-defined
        heuristics.

      * Added a moveCursor() convenience function.

      * Changed the default margin from 4 to 2 pixels for consistency with
        QLineEdit.

      * Added support for extra selections.

- QTextFormat

      * Fixed the default value for QTextBlockFormat::alignment() to return
        a logical left alignment instead of an invalid alignment.

      * Added UnderlineStyle formatting, including SpellCheckUnderline.

- QTextStream

      * Added the pos() function, which returns the current byte-position
        of the stream.

- QTextTableCell

      * Added the setFormat() function to enable the cell's character format
        to be changed.

- QThread

      * Related to changes to QObject, currentThread() always returns a
        valid pointer. (Previous versions of Qt would return zero if called
        from non-QThread threads; this does not happen in Qt 4.2).

- QToolBar

      * Introduced various fixes to better support tool buttons, button
        groups and comboboxes in the toolbar extension menu.

      * Fixed crash that occurred when QApplication::setStyle() was called
        twice.

- QToolButton

      * Fixed an alignment bug for tool buttons with multi-line labels and
        TextUnderIcon style.

- QToolTip

      * Added the hideText() convenience function.

      * Added the showText() function that takes a QRect argument specifying
        the valid area for the tooltip. (If you move the cursor outside this
        area the tooltip will hide.)

      * Added a widget attribute to show tooltips for inactive windows.

- QTranslator

      * Added support for plural forms through a new QObject::tr() overload.

      * Ensured that a LanguageChange event is not generated if the
        translator fails to load.

      * Fixed a bug in isEmpty().

      * Added Q_DECLARE_TR_FUNCTIONS() as a means for declaring tr()
        functions in non-QObject classes.

- QTreeView

      * Ensured that no action is taken when the root index passed to
        setRootIndex() is the same as the current root index.

      * When hiding items the view no longer performs a complete re-layout.

      * Fixed possible segfault in isRowHidden().

      * Significantly speed up isRowHidden() for the common case.

      * Improved row painting performance.

      * After expanding, fetchMore() is called on the expanded index giving
        the model a way to dynamically populate the children.

      * Fixed issue where an item could expand when all children were
        hidden.

      * Added support for horizontal scrolling using the left/right arrow
        keys.

      * Added a property to enable the focus rectangle in a tree view to be
        shown over all columns.

      * Added more key bindings for expanding and collapsing the nodes.

      * Added the expandAll() and collapseAll() slots.

      * Added animations for expanding and collapsing branches.

      * Take all rows into account when computing the size hint for a
        column.

      * Added the setSortingEnabled property.

      * Fixed the behavior of the scrollbars so that they no longer
        disappear after removing and re-inserting items while the view is
        hidden.

      * Fixed memory corruption that could occur when inserting and removing
        rows.

      * Don't draw branches for hidden rows.

- QTreeWidget

      * Added the const indexOfTopLevelItem() function.

      * Improved item insertion speed.

      * Fixed crash caused by calling QTreeWidgetItem::setData() with a
        negative number.

      * QTreeWidget now uses stable sorting.

      * Made construction of single column items a bit more convenient.

      * Added the invisibleRootItem() function.

      * Made addTopLevelItems() add items in correct (not reverse) order.

      * Ensured that the header is repainted immediately when the header
        data changes.

- QUiLoader

      * Exposed workingDirectory() and setWorkingDirectory() from
        QAbstractFormBuilder to assist with run-time form loading.

- QUrl

      * Added errorString() to improve error reporting.

      * Added hasQuery() and hasFragment() functions.

      * Correctly parse '+' when calling queryItems().

      * Correctly parse the authority when calling setAuthority().

      * Added missing implementation of StripTrailingSlash in toEncoded().

- QVariant

      * Added support for all QMetaType types.

      * Added support for QMatrix as a known meta-type.

      * Added support for conversions from QBrush to QColor and QPixmap,
        and from QColor and QPixmap to QBrush.

      * Added support for conversions between QSize and QSizeF, between
        QLine and QLineF, from long long to char, and from unsigned long
        long to char.

      * Added support for conversions from QPointF to QPoint and from QRectF
        to QRect.

      * Fixed issue where QVariant(Qt::blue) would not create a variant of
        type QVariant::Color.

      * Added support for conversions from int, unsigned int, long long,
        unsigned long long, and double to QByteArray.

- QWhatsThis

      * Improved look and feel.

- QWidget

      * Delayed creation: Window system resources are no longer allocated in
        the QWidget constructor, but later on demand.

      * Added a styleSheet property to set/read the widget style sheet.

      * Added saveGeometry() and restoreGeometry() convenience functions for
        saving and restoring a window's geometry.

      * Fixed memory leak for Qt::WA_PaintOnScreen widgets with null paint
        engines.
        
      * Ensured that widget styles propagate to child widgets.

      * Reduced flicker when adding widget to layout with visible parent.

      * Fixed child visibility when calling setLayout() on a visible widget.

      * Speed up creation/destruction/showing of widgets with many children.

      * Avoid painting obscured widgets when updating overlapping widgets.

- QWorkspace

      * Resolved issue causing the maximized controls to overlap with the
        menu in reverse mode.

      * Fixed issue where child windows could grow a few pixels when
        restoring geometry in certain styles.

      * Ensured that right-to-left layout is respected when positioning new
        windows.

      * Fixed crash that occurred when a child widget did not have a title
        bar.

      * Fixed issue where maximized child windows could be clipped at the
        bottom of the workspace.

- quintptr and qptrdiff

      * New integral typedefs have been added.

- Q3ButtonGroup

      * Fixed inconsistencies with respect to exclusiveness of elements in
        Qt 3.

      * Fixed ID management to be consistent with Qt 3.

- Q3Canvas

      * Fixed several clipping bugs introduced in 4.1.0.

- Q3CanvasView

      * Calling setCanvas() now always triggers a full update.

- Q3Grid, Q3Hbox, Q3VBox

      * Fixed layout problem.

- Q3IconView

      * Fixed a case where selected icons disappeared.

- Q3ListBox

      * Fixed inconsistencies in selectAll() with respect to Qt 3.

      * Fixed possible crash after deleting items.

- Q3ListView

        Fixed possible crash in Q3ListView after calling clear().

        Fixed inconsistent drag and drop behavior with respect to Qt 3.

- Q3Process

      * Stability fixes in start().

- Q3Socket

      * No longer (incorrectly) reports itself as non-sequential.

- Q3Table

      * Improved behavior for combobox table elements.



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

- Interbase driver
      
      * Fixed data truncation for 64 bit integers on 64 bit operating
        systems.

- MySQL driver
      
      * When using MySQL 5.0.7 or larger, let the server do the text
        encoding conversion.

      * Added UNIX_SOCKET connection option.

      * Improved handling of TEXT fields.

- OCI driver
    
      * Improved speed for meta-data retrieval.
     
      * Fixed potential crash on Windows with string OUT parameters.

      * Improved handling of mixed-case table and field names.

- ODBC driver

      * Improved error reporting if driver doesn't support static result
        sets.

      * Improved support for the Sybase ODBC driver.

- SQLite driver

      *  QSqlDatabase::tables() now also returns temporary tables.
 
      *  Improved handling of mixed-case field names.



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

- Added "-silent" options that outputs only test failures and warnings.

- Reset failure count when re-executing a test object

- Added nicer output for QRectF, QSizeF, and QPointF



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


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

- Fixed the -exceptions configure switch.

- Fixed a build issue preventing the use of MMX instructions when
  available.

- Fixed leak of semaphore arrays during an application crash.

- Fixed cases where the wrong cursor was shown.

- Fixed cases where QWidget::normalGeometry() would return wrong value.

- Allow widgets inside QScrollArea to have a minimum size larger than the 
  screen size.

- Allow (0,0) as a valid size for top-level windows.

- VNC driver

      * Fixed keyboard shortcut problem when using the VNC driver.

      *  Fixed issue with the VNC driver that prevented client applications to
         connect in some cases.

      *  Fixed a leak of shared memory segments in the VNC driver.

      *  Reduced CPU consumption in the VNC driver.

      *  Implemented dynamic selection of the underlying driver for the VNC and
         transformed screen drivers.

      *  Improved error handling when clients connects to the server.

- Graphics system

      * Introduced new API for accelerated graphics hardware drivers.

      * Implemented support for multiple screens.

      * QScreen has binary incompatible changes. All existing screen drivers
        must be recompiled.

      * QWSWindow, QWSClient, QWSDisplay and QWSEvent have binary 
        incompatible changes. QWSBackingStore has been removed. 
        Existing code using these classes must be recompiled.

      * Added support for OpenGL ES in QGLWidget. 

      * Implemented support for actual screen resolution in QFont.

      * Removed internal limitation of 10 display servers.

      * Improved memory usage when using screens with depths less than 16
        bits-per-pixel.

      * Fixed 16 bits-per-pixel screens on big-endian CPUs.

      * Optimized CPU usage when widgets are partially hidden.

      * Improved detection of 18 bits-per-pixel framebuffers.

      * Improved performance when using a rotated screen with 18 or 24
        bits-per-pixel depths.

      * Improved speed of drawing gradients.

      * Introduced the QWSWindowSurface as a technique to create
        accelerated paint engines derived from QPaintEngine.

      * Implemented the Qt::WA_PaintOnScreen flag for top-level widgets.

      * Extended QDirectPainter to include non-blocking API and support for 
        overlapping windows. Existing code that subclasses QDirectPainter 
        must be recompiled.

      * Implemented QWSEmbedWidget which enables window embedding.

      * Removed hardcoded 72 DPI display limitation.

- Device handling

      * QWSMouseHandler has binary incompatible changes. All existing mouse
        drivers must be recompiled.

      * Fixed an issue of getting delayed mouse events when using the
        vr41xx driver.

      * Improved event compression in the vr41xx mouse handler.

      * Improved algorithm for mouse calibration which works for all
        screen orientations.

      * Fixed an issue causing mouse release events with wrong positions
        when using a calibrated and filtered mouse handler on a rotated
        screen.

      * Made the tty device configurable for the Linux framebuffer screen
        driver.

      * Fixed a deadlock issue when using drag and drop and a calibrated
        mouse handler.

      * Autodetection of serial mice is turned off to avoid disrupt serial
        port communication. Set QWS_MOUSE_PROTO to use a serial mouse.

- QVFb

      * Fixed an issue preventing QVFb from starting on some systems.

      * Added support for dual screen device emulation in QVFb.

- QCopChannel

      *  Added a flush() function so that the QWS socket can be flushed,
         enabling applications to ensure that QCop messages are delivered.


Linux and UNIX systems
----------------------

- Printing
 
      * Improved CUPS support by sending PDF instead of Postscript to
        CUPS on systems that have a recent CUPS library, improving the
        print quality.

      * Added a new and improved QPrintDialog.

      * Improved font embedding on systems without FontConfig.

- QApplication

      * When available, use Glib's mainloop functions to implement event
        dispatching.

- QPlastiqueStyle

      * Added support to enable KDE icons to be automatically used on
        systems where they are available.

- QTextCodec
     
      * Uses iconv(3) (when available) to implement the codec returned by
        QTextCodec::codecForLocale(). The new codec's name is "System"
        (i.e., QTextCodec::codecForLocale()->name() returns "System"
        when iconv(3) support is enabled).


AIX
---

- The makeC++SharedLib tool is deprecated; use the "-qmkshrobj" compiler
  option to generate shared libraries instead.


X11
---

- Added support to internally detect the current desktop environment.

- QAbstractItemView

      * Fixed assertion caused by interrupting a drag and drop operation
        with a modal dialog on X11.
     
      * Ensured that release events dispatched when closing a dialog
        with a double click, are not propagated through to the window
        underneath.

- QCursor

      * Fixed crash occuring when the X11 context had been released before
        the cursor was destructed.

- QGLWidget

      * Fixed crashes that could occur with TightVNC.
 
      * Improved interaction between QGLWidget and the Mesa library.

- QMenu
 
      * Made it possible for popup menus to cover the task bar on KDE.

- QMotifStyle

      * Ensured that the font set on a menu item is respected.

- QX11EmbedContainer, QX11EmbedWidget

      * Added missing error() functions.

- QX11PaintEngine
  
      * Increased speed when drawing polygons with a solid pixmap brush.

      * Fixed masked pixmap brushes.

      * Increased QImage drawing performance.

- Motif Drop support
     
      * Support for drops from Motif applications has been refactored and is
        now working properly. QMimeData reports non-textual data offered in
        Motif Drops using a MIME type of the form "x-motif-dnd/ATOM", where
        ATOM is the name of the Atom offered by the Motif application.

- Font rendering

      * Improved stability when rendering huge scaled fonts.

      * Enabled OpenType shaping for the Latin, Cyrillic, and Greek
        writing systems.

      * Improved sub-pixel anti-aliasing.

      * Improved font loading speed.


Mac OS X
--------

- Mac OS 10.2 support dropped.

- QuickDraw support in QPaintEngine dropped; everything folded into the
  CoreGraphics support.

- All libraries in Qt are now built as frameworks when -framework mode is
  selected (default) during the configuration process.
 
- Many accessibility improvements, including better VoiceOver support. The
  following widgets have had their accessibilty updated for this release:
  QSplitter, QScrollBar, QLabel, QCheckBox, QRadioButton, QTabBar,
  QTabWidget, QSlider, and QScrollBar.

- Hidden files are now reported as hidden by QFileInfo, QDirModel, etc.

- Windows now have a transparent size grips, an attribute for specifying an
  opaque size grip was added.

- Metrowerks generator has been removed.

- Ensured that the anti-aliasing threshold setting is followed.

- Added a standard "Minimize" menu item to Assistant's Window menu.

- The documentation now has "Xcode-compatible" links so that it can be added
  into Xcode's documentation viewer. This needs to be done by the developer
  as regenerating Xcode's index takes quite a long time

- QAbstractScrollArea

      * Improved look and feel by aligning the scroll bars with the size
        grip.

- QClipboard
 
      * Data copied to the clipboard now stays available after the
        application exits.

      * Added support for the Find clipboard buffer.

      * Fixed encoding of URLs passed as MIME-encoded data.

- QComboBox

      * Improved the popup sizing so it's always wide enough to display its
        contents.

      * Improved the popup placement so it stays on screen and does not
        overlap the Dock.

      * The minimumSizeHint() and sizeHint() functions now honor
        minimumContentsLength.

- QKeyEvent

      * The text() of a QKeyEvent is filled with the control character if
        the user pressed the real Control key (Meta in Qt) and another key.
        This brings the behavior of Qt on Mac OS X more in line with Qt on
        other platforms.

- QLibrary

      * Removed the dependency on dlcompat for library loading and resolving
        in favor of native calls. This means that you can unload libraries
        on Mac OS X 10.4 or later, but not on 10.3 (since that uses dlcompat
        itself).

- QMacStyle

      * QMacStyle only uses HITheme for drawing now (no use of Appearance
        Manager).

      * Fixed placement of text on buttons and group boxes for non-Latin
        locales.

      * Fixed rendering of small and mini buttons.

      * Attempt to be a bit smarter before changing a push button to bevel
        button when the size gets too small.

      * Draws the focus ring for line edits when they are near the "top" of
        the widget hierarchy.

      * Ensured that the tickmarks are drawn correctly.

      * Implemented the standardIconImplementation() function.

      * Fixed the look of line edits.

      * "Colorless" controls now look better.

      * Fixed the sort indicator.

      * Improved the look of text controls, such as QTextEdit, to fit in
        better with the native style.

- QMenu

      * Popups no longer show up in Expose.

      * Ensured that the proper PageUp and PageDown behavior are used.

- QMenuBar

      * Added support for explicit merging of items using QAction::MenuRole.

      * Added support for localization of merged items.

- QMessageBox

      * A message box that is set to be window modal will automatically
        become a sheet.

      * Improved the look of the icons used to fit in with the native style.
  
- QPainter
     
      * Fixed off-by-one error when drawing certain primitives.

      * Fixed off-by-many error when drawing certain primitives using a
        scaling matrix.

      * Fixed clipping so that setting an empty clip will clip away
        everything.

      * Fixed changing between custom dash patterns.

      * Added combinedMatrix() which contains both world and viewport/window
        transformations.
      
      * Added the setOpacity() function.

      * Added MiterJoins that are compliant with SVG miter joins.

- QPainterPath
     
      * Added the arcMoveTo() and setElementPosition() functions.

- QPixmap

      * Added functions to convert to/from a CGImageRef (for CoreGraphics
        interoperability).
 
      * Fixed various Qt/Mac masking and alpha transparency issues.

- QPrinter
     
      * Made QPrinter objects resuable.

- QProcess

      * Always use UTF-8 encoding when passing commands.

- QScrollBar

      * Improved handling of the case where the scrollbar is to short to
        draw all its controls.

- QTextEdit

      * Improved the look of the widget to fit in with the native style.

- QWidget

      * All HIViewRefs inside Qt/Mac are created with the
        kWindowStandardHandlerAttribute.

      * Added the ability to wrap a native HIViewRef with create().

      * Windows that have parents with the WindowStaysOnTopHint also get the
        WindowStaysOnTopHint.


Windows
-------

- Ensured that widgets do not show themselves in a hover state if a popup
  has focus.

- Fixed issues with rendering system icons on 16 bits-per-pixel displays.

- Fixed issue where fonts or colors would be reset on the application
  whenever windows produced a WM_SETTINGSCHANGE event.

- Fixed a bug with Japanese input methods.

- Compile SQLite SQL plugin by default, as on all the other platforms.

- Fixed build issue when not using Precompiled Headers (PCH).

- Made Visual Studio compilers older than 2005 handle (NULL == p)
  statements, where p is of QPointer type.

- Fixed HDC leak that could cause applications to slow down significantly.

- Ensured that timers with the same ID are not skipped if they go to different
  HWNDs.

- Improved MIME data handling

      * Resolved an issue related to drag and drop of attachments from some
        applications.

      * Resolved an issue where pasting HTML into some applications would
        include parts of the clipboard header.
 
      * Improved support for drag and drop of Unicode text.

      * Made it possible to set an arbitrary hotspot on the drag cursor on
        Windows 98/Me.

- ActiveQt

    * Fixed issues with the compilation of code generated by dumpcpp.

    * Made ActiveQt controls behave better when inserted into Office
      applications.

    * Ensured that slots and properties are generated for hidden functions and
      classes.

    * Ensured that the quitOnLastWindowClosed property is disabled when
      QApplication runs an ActiveX server.

    * Ensured that controls become active when the user clicks into a subwidget.

    * Added support for CoClassAlias class information to give COM class a
      different name than the C++ class.

- QAccessible
     
      * Ensured that the application does not try to play a sound for
        accessibility updates when no sound is registered.

- QAxBase
 
      * Fixed potential issue with undefined types.

- QDir
  
      * Fixed bug where exists() would return true for a non-existent drive
        simply because the specified string used the correct syntax.
 
      * Improved homePath() to work with Japanese user names.

- QFileDialog

      * Added support for relative file paths in native dialogs.

      * Enabled setLabelText() to allow context menu entries to be changed.
      
      * Ensured that users are denied entry into directories where they
        don't have execution permission.

      * Disabled renaming and deleting actions for non-editable items.

      * Added a message box asking the user to confirm when deleting files.

- QFileInfo
      
      * Fixed absoluteFilePath() to return a path that begins with the
        current drive label.

- QGLWidget
       
      * Fixed usage of GL/WGL extension function pointers. They are now
        correctly resolved within the context in which they are used.

- QGLColormap

      * Fixed cases where the colormap was not applied correctly.

- QMenu
 
      * Made it possible for popup menus to cover the task bar.

- QPrinter

      * Added support for printers that do not have a DEVMODE.

      * Fixed a drawing bug in the PDF generator on Windows 98/Me.

      * Made it possible to programmatically change the number of copies
        to be printed.

      * Fixed possible crash when accessing non-existent printers.

- QProcess

      * Fixed lock-up when writing data to a dead child process.

- QSettings

      * Fixed bug causing byte arrays to be incorrectly stored on
        Win95/98/Me.

      * Allow keys to contain HKEY_CLASSES_ROOT and HKEY_USERS to allow all
        registry keys to be read and prevent unintentional use of
        HKEY_LOCAL_MACHINE.

      * Fall back to the local machine handle if a key does not start with a
        handle name.

- QUdpSocket

       * Introduced fixes for UDP broadcasting on Windows.

- QWhatsThis

       * Improved native appearance.

- QWidget
 
       * Top-level widgets now respect the closestAcceptableSize of their
         layouts.

       * Ensured that getDC() always returns a valid HDC.

- QWindowsStyle

      * We no longer draw splitter handles in Windows style. This resolves
        an inconsistency with XP style, so that the two styles can use the
        same layout interchangeably. Note that it is fully possible to style
        splitter handles (if a custom style or handle is required) using
        style sheets.

      * Disabled comboboxes now have the same background color as disabled
        line edits.
 
- QWindowsXPStyle
  
      * Made QPushButton look more native when pressed.

      * Improved the look of checked tool buttons.

      * Defined several values that are not present in MinGW's header files.



****************************************************************************
*                   Significant Documentation Changes                      *
****************************************************************************


- Updated information about the mailing list to be used for porting issues
  (qt-interest).

- Demos / Examples

      * Added a new directory containing desktop examples and moved the
        Screenshot example into it.

      * Added a new Chat client network example which uses QUdpSocket to
        broadcast on all QNetworkInterface's interfaces to discover its
        peers.

      * The Spreadsheet demo now uses the QItemDelegate, QCompleter, and
        QDateTimeEdit with calendar popup.

      * An OpenGL button is added to some of the demos to toggle usage of
        the OpenGL paint engine.

      * Fixed crash resulting from incorrect painter usage in the Image
        Composition example



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


Assistant
---------

- Middle clicking on links will open up new tabs.

- Added "Find as you type" feature to search documentation pages.

- Added "Sync with Table of Contents" feature to select the current page in
  the contents.

- Fixed issue where activating a context menu over a link would cause the
  link to be activated.

- Provides a default window title when not specified in a profile.

- Fixed JPEG viewing support for static builds.

- Fixed crash that could occur when opening Assistant with old and invalid
  settings.

- Fixed display of Unicode text in the About dialog.


Designer
--------

- Added QWidget and the new widgets in this release to Designer's widget
  box.

- Updated the dialog templates to use the new QDialogButtonBox class.

- Backup files created by Designer no longer overwrite existing files.

- Promoted widgets inherit the task menu items of the base class.

- Enums are no longer ordered alphabetically in the property editor.

- Fixed issue where shortcuts could be corrupted in certain situations.

- Line endings in .ui files now match the standard line endings for the
  platform the files are created on.

- Ensured that a warning is displayed whenever duplicate connections are
  made in the connections editor.

- Added shortcuts for the "Bring to Front" and "Send to Back" form editor
  actions.

- Added new 22 x 22 icons.
 
- Fixed selection of dock widgets in loaded forms.

- Made QWidget::windowOpacity a designable property.

- Numerous improvements and fixes to the action and property editors.

- Windows only

      * The default mode is Docked Window.

- Mac OS X only

      * Preview of widgets is no longer modal.

      * Passing really long relative paths into the resource will no longer
        cause a crash.


Linguist
--------

- Added a new "Check for place markers" validation feature.

- Added the "Search And Translate" feature.

- Added the "Batch translation" feature.

- Added support for editing plural forms.

- Extended the .ts file format to support target language, plural forms,
  source filename, and line numbers.

- Added the "Translated Form Preview" feature.

- Added placeholders for "hidden" whitespace (i.e., tabs and newlines) in
  the translation editor.


lupdate
-------

- Added the -extensions command-line option in order to recursively scan
  through a large set of files with the specified extensions.

- Made lupdate verbose by default (use -silent to obtain the old behavior).

- Improved parsing of project files.

- Fixed some issues related to parsing C++ source files.


lrelease
--------

- Made lrelease verbose by default (use -silent to obtain the old behavior).

- Disabled .qm file compression by default (pass -compress to obtain the old
  behavior).
  
      
moc
---

- Fixed support for enums and flags defined in classes that are themselves
  declared in namespaces.

- Added support for the -version and -help command line options (for
  consistency with the other tools).


rcc
---

- Added support for the -binary option to generate resources that are
  registered at run-time.


qmake
-----

- Added support for an Objective C compiler on platforms that support it via
  OBJECTIVE_SOURCES. Additionally, Objective C precompiled headers are
  generated as necessary.

- Added support for a qt.conf to allow easy changing of internal target
  directories in qmake.

- Added support for the recursive switch (-r) in shadow builds.

- Introduced QMAKE_CFLAGS_STATIC_LIB to allow modified flags to be
  passed to temporary files when compiling a static library.

- Added a target.targets for extra qmake INSTALLS. The $files() function
  is now completely consistent with wildcard matching as specified to
  input file variables.

- Added QMAKE_FUNC_* variables to EXTRA_COMPILERS for late evaluation
  of paths to be calculated at generation time. $$fromfile() will no
  longer parse input file multiple times.

- Added support for -F arguments in LIBS line in the Xcode generator.

- $$quote() has changed to only do an explicit quote, no escape sequences
  are expanded. A new function $$escape_expand() has been added to allow
  expansion of escape sequences: \n, \t, etc.

- Added a $$QMAKE_HOST variable to express host information about the
  machine running qmake.

- Added a $$replace() function.

- Ensured that PWD is always consulted first when attempting to resolve an
  include for dependency analysis.

- Added support for UTF-8 encoded text in .pro files.

- Variables $$_PRO_FILE_ and $$_PRO_FILE_PWD_ added for features to detect
  where the .pro really lives.

- Added QMAKE_FRAMEWORK_VERSION to override the version inside a .framework,
  though VERSION is still the default value.

- Added support for custom bundle types on Mac OS X.

- Added support for Mac OS X resources (.rsrc) in REZ_FILES.


qt3to4
------

- qt3to4 now appends to the log file instead of overwriting it.

- Fixed one case where qt3to4 was inserting UNIX-style line endings on
  Windows.

- Added the new Q3VGroupBox and Q3HGroupBox classes to ease porting.

- Updated the porting rules for this release.


uic
---

- Added support for more variant types: QStringList, QRectF, QSizeF,
  QPointF, QUrl, QChar, qlonglong, and qulonglong.

- Fixed code generated by uic for retranslating item view widgets so that
  the widgets are not cleared when they are retranslated.

- Ensured that no code is generated to translate empty strings.


uic3
----

- Added line numbers to warnings.

- Ensured that warnings show the objectName of the widget in question.

- Added support for word wrapping in labels when converting files from uic3
  format.

- Ensured that the default layouts are respected when converting files from
  uic3 format.

- Ensured that double type properties are handled correctly.
