
Qt 3.2 introduces new features as well as many improvements over the
3.1.x series. This file gives an overview of the main changes since
version 3.1.2.  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 3.2 series is binary compatible with the 3.1.x series.
Applications compiled for 3.1 will continue to run with 3.2.

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


Qt library
----------

New classes have been added to the Qt Library including a
class to add splash screens to applications (QSplashScreen), a toolbox
widget that provides a column of tabbed widgets (QToolBox), and a
class to manage per-thread data storage (QThreadStorage).

The SQL module received a fair bit of attention this time. The most
notable improvements include a native IBM DB2 driver, complete support
for stored procedures including the possibility to access
out-parameters, and native support for 64 bit fields without having to
convert to or from strings. We also added support for setting
connection parameters. This way you can, for example, conveniently
open an SSL connection to a MySQL or PostgreSQL database. If you need
even more customization, e.g. for an Oracle database, you can set up
the connection yourself and instantiate a Qt driver object on top of
it. An extended SQL cursor class has been added that makes it more
convenient to display result sets from general SQL queries
(QSqlSelectCursor). In addition, you can add custom database drivers
without compiling them as plugins (see
QSqlDatabase::registerSqlDriver()).

QLineEdit, the one-line text editor, now supports validation input
masks. The feature complements the previous QValidator concept and
allows e.g. restriction of input to the IP address format (mask
"990.990.990.990;_"), or to ISO date format (mask "0000-90-90;0").

Qt's unicode code support has been extended. Most notably, full
support for Indic scripts has been added, covering writing systems
such as Devanagari, Tamil and Bengali. The group of right to left
writing systems has been extended with support for Syriac. Both
improvements are available on both Windows with Uniscribe installed,
and on Unix/X11 when using XFT with OpenType fonts.

All tool classes that support STL-like iterators with begin() and
end(), contain two extra functions constBegin() and constEnd(). The
const versions always return const iterators, and thus can be a little
bit faster with Qt's implicitly shared containers.

QPainter's complex drawText() function has been highly
optimized. Despite its support for complex unicode scripts, it now
performs better than its less unicode-capable counterpart in Qt 2.3.

QPixmap now supports pixmaps with alpha channel (semi transparency) on
all Windows versions except Windows 95 and Windows NT.

The print dialog now supports "selection" as a print range as well as
the possibility to enable/disable all different printer options
individually.

Many classes were improved; see the detailed overview that follows.

Qt Motif Extension
------------------

Dialog handling has matured and has been extended since the
extension's introduction in Qt 3.1.  The documentation and code
examples have been improved, including a walkthrough that covers the
complete migration of a real-world Motif example to Qt. The process
contains four intermediate steps where the application utilizes both
toolkits.

ActiveQt Extension
------------------

Type handling has been extended on both the container and the server
side. The new supported types are byte arrays and 64bit integers. The
QAxServer module supports QObject subclasses as return and parameter
types of slots, and allows error reporting through COM exceptions.
The Designer integration has been extended to support property dialogs
implemented by the control server.

Qt Designer
-----------

The popup menu editor has been rewritten. The new editor provides the
the ability to add, edit and remove menus and menu items directly in
the menubar and in the popup menu. Navigation and editing can be done
using either the mouse or the keyboard.

The new QWidgetContainerPlugin class provides support for complex
custom container widgets in Designer, such as the custom tab widget,
etc.

The property editor now allows editing of properties with or'd values
(sets).

Designer also supports the new QToolBox widget in a similar fashion to
QTabWidget, etc.

Qt Assistant
------------

Profiles have been introduced to allow applications to extend the use
of Qt Assistant as a help system. Profiles describe the documentation
to use so that only application specific documentation will be
referenced in an end user installation. Profiles also allow some
customization of the look in Qt Assistant. For detailed information,
see the helpdemo example in $QTDIR/examples/helpdemo.

Profiles replace the content files and categories system. The
following command line options are removed since they no longer serve
any purpose: addContentFile, removeContentFile, category, and
disableFirstRun.

Qt Assistant has multiple tabs for browsing, therefore enabling
multiple pages to be browsed without opening a new window.

It is possible to specify a default home page.

It is possible to specify a PDF reader so that urls to PDF files can
be opened from Qt Assistant.

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

- QAction / QActionGroup
	Simplified constructors so that it is no longer necessary to
	specify texts for buttons and menu items separately.
	For action groups, we fixed the enable/disable behavior. If
	an action inside an action group is explicitly disabled, it is
	no longer implicitly enabled together with the group.
	This is identical to enabling/disabling widgets and their
	children.

- QApplication
	Added the aboutQt() slot for convenience.

- QAssistantClient
	Added the new function, setArguments(), that invokes Qt
	Assistant in different modes.

- QAxBase
	Added the new function, asVariant(), that passes a COM
	object through dynamicCall().

- QAxBindable
	Added the new function, reportError(), that sends error
	information to the ActiveX client.

- QColor
	Added the new static function, colorNames(), that retrieves a
	list of all color names known to Qt.

- QDeepCopy
	Now also supports QDir, QFileInfo, and QStringList.

- QDom
	Now has long and ulong support for setAttribute() and
	setAttributeNS().

- QFont
	Added the new properties: stretch and overline. Added the new
	function, resolve(), that copies unspecified attributes from
	one font to another.

- QFontDataBase
	Added a new overload for families() that restricts the
	returned list to fonts supporting a specific QFont::Script,
	e.g. QFont::Greek, QFont::Devanagari or QFont::Arabic.

- QFontInfo / QFontMetrics
	Added new constructors that force the info and metrics objects
	to use a given QFont::Script.

- QGLWidget
	Added a new constructor that takes a QGLContext
	parameter. Makes the undocumented setContext() obsolete.

- QHeader
	Added getters for the sort indicator (sortIndicatorSection()
	and sortIndicatorOrder() ).

- QImage
	Added a new overload for save() that writes to a given
	QIODevice*.

- QListView
	Added tristate support to check list items
	(QCheckListItem::setTristate()). Added the new function,
	setSelectionAnchor(), to set the list view's selection anchor
	explicitly.

- QLineEdit
	Added input masks: setInputMask(), inputMask(), and
	hasAcceptableInput().

- QMessageBox
	Added the new static function, question(), that complements
	the existing information(), warning() and fatal() functions.

- QMotifDialog [Qt Motif Extension]
	Now has two distinct modes of operation: 1) it allows a Motif
	dialog to have a Qt parent, and 2) it allows a Qt dialog to have
	a Motif parent.

- QPixmapCache
	Added the new function, remove(), to explicitly remove a
	pixmap from the cache.

- QPrinter
	Added the new functions: setPrintRange(), printRange(),
	setOptionEnabled(), and optionEnabled(). For Windows only,
	added the new function, setWinPageSize(), that allows setting
	DEVMODE.dmPaperSize directly.

- QPtrList
	Added STL-like iterators with begin(), end(), and erase().

- QScrollBar
	Maintains a user defined size policy when the direction
	changes.

- QSplashScreen [new]
	This new widget class provides a splash screen to be shown
	during application startup.

- QSplitter
	Added the new properties: opaqueResize, childrenCollapsible,
	and handleWidth.

- QSqlError
	Added a couple of convenience functions: text(), which returns
	the concatenated database and driver texts. showMessage(),
	which will pop up a QMessageBox with the text that text()
	returns.

- QSqlQuery
	Added overloads for the bindValue() call which makes it
	possible to specifiy what role a bound value should have: In,
	Out or InOut.

- QSqlSelectCursor [new]
	This new QSqlCursor subclass provides browsing of general SQL
	SELECT statements.

- QString
	Added 64 bit support. Added the new functions: multiArg(),
	reserve(), capacity(), squeeze(). Added case insensitive
	overloads for startsWith() and endsWidth().

- QStringList
	Added the new function gres().

- QStyle
	Added support for toolbox, header, MDI frame, table grid line
	color, line edit password character, and message box question.

- QSyntaxHighlighter
	Added the new function, currentParagraph().

- QTabWidget
	Added support for custom widgets to be placed beside
	the tab bar: setCornerWidget() and cornerWidget().

- QTextEdit
	In Log mode, added the new functions: setMaxLogLines() and
	maxLogLines().

- QThreadStorage [new]
	This new tool class provides per-thread data storage, also
	referred to as thread local storage or TLS.

- QToolBox [new]
	This new widget class provides a column of tabbed widgets, one
	above the other, with the current page displayed below the
	current tab.

- QVariant
	Added support for LongLong and ULongLong.

- QWidget
	Added a new widget flag, WNoAutoErase, that combines the now
	obsolete WResizeNoErase and WRepaintNoErase flags.

- QWidgetContainerPlugin [new]
	This new plugin class complements QWidgetPlugin for custom
	container widgets, i.e. widgets that can host child
	widgets.
