Qt 2.1 introduces new features as well as many improvements over the
2.0.x series. This file will only give an overview of the main changes
since version 2.0.2.  A complete list would simply be too large to be
useful.  For more detail see the online documentation which is included
in this distribution, and also available on
http://qt.nokia.com/doc/

The Qt version 2.1 series is binary compatible with the 2.0.x
series - applications compiled for 2.0 will continue to run with 2.1.

As with previous Qt releases, the API and functionality of Qt is
completely portable between Microsoft Windows and X11.  It is also portable
between Windows 95, 98 and NT; unlike most toolkits, Qt lets a single
executable work on all three.

****************************************************************************
*			    Overview					   *
****************************************************************************

As usual, large sections of the documentation have been revised and
lots of new documentation has been added.

Much work went into existing classes, based on all the feedback we got
from our users. A warm thank you to you all at this point, we honestly
hope to satisfy most of your wishes with the new release.

Among the things that got a lot of polishing is the new geometry
management system that was introduced with the 2.x series. Some
classes, such as QBoxLayout, have been rewritten and many size hints
and size policies were optimized. As usual with newly introduced
systems, the occasional bug has been fixed as well. As a result,
layout in Qt-2.1 is not only nicer but also faster.

Big parts of the file dialog have been rewritten. It is now
synchronized in terms of features with the common Windows dialog,
including fancy drag'n'drop and in-place renaming. You can customize
both parts of the dialog, the front-end with info and preview widgets,
the back-end with different network protocols (see the QFileDialog and
QNetworkProtocol documentation for details).

Especially interesting for dynamic Qt applications is the newly
introduced property system. Many interesting things, from scripting up
to graphical user interface builders, become easier. The technology
requires a new macro Q_PROPERTY and a new revision of Qt's meta object
compiler (moc). See the Qt documentation for details.

Due to strong customer demand, we added a cross-platform way to easily
implement multi-document interfaces (known as 'MDI'). The widget is
called QWorkspace and makes this task trivial.

On X11, text dropping from Motif drag'n'drop applications has been
added, to make your Qt applications inter-operable with those Motif
applications that survived Y2K.

The rich text system, first introduced in Qt-2.0, has been
revised. Apart from great speed improvements, it now supports HTML
tables as well as floating images.

QMultiLineEdit, the text input field in Qt, got the missing word wrap
functionality. It's probably the last big extension we will add to
that widget. In Qt 3.0, it will be replaced by a fancier, faster and
more powerful QTextEdit widget that also deals with different colors
and fonts in a way similar to the existing QTextView.

Qt follows the respective GUI style guides even more closely. This
includes honoring desktop settings, and keyboard shortcuts such as
Ctrl-Z/Y for undo/redo in line edit and multi-line edit
controls. Dialog handling for both modal and non-modal dialogs has
been improved to follow the platform conventions precisely.

With QIconView, we added a powerful new visualization widget similar
to QListView and QListBox. It contains optinally labelled pixmap items
that the user can select, drag around, rename, delete and more.

Compared to the previous release, we have managed to reduce overall
memory consumption while improving execution speed and features.

Below is a list of the major new features in existing classes as well
as short descriptions of all new classes and the changes in some of
the extensions shipped with Qt.


****************************************************************************
* 		New major features in existing classes			   *
****************************************************************************

QApplication	- new function wakeUpGuiThread() to simplify using threads
		  with Qt.

QArray		- added sorting and binary search.

QColor		- custom color support added.  qRgb(r,g,b) helper function
		  now sets an opaque alpha value instead of a transparent
		  one.

QComboBox	- support for text items with icons.

QFileDialog	- many new features including fancy drag'n'drop
		  and in-place renaming.
		  Methods like setInfoPreviewWidget()and
		  setContentsPreviewWidget() make it easy to customize
		  the dialog extensively. With QUrlOperator and the
		  QNetworkProtocol abstraction, the dialog can operate
		  transparently by various different network protocols,
		  such as HTTP and FTP (see the Network Extension).

QFocusEvent	- carries a reason() for the event. Possible reasons are
		  Mouse, Tab, ActiveWindow, ShortCut and other. The
		  addition makes line edit controls behave properly.

QHeader		- added optional visual sort indicator. Revisited API that 
		  operates on sections only (solves the 'logical' vs. 'actual' 
		  index confusion). A reworked 'table' example shows how
		  to use QHeader in combination with a scrollview to create
		  a simple spreadsheet.

QListBox	- many signals and functions added for convenience and
		  greater flexibility.

QListView	- various selections modes similar to QListBox, many
		  new functions and signals added for convenience and
		  greater flexibility.

QMainWindow	- implemented draggable and hidable toolbars. A menubar
		  can be made draggable by simply putting it in a toolbar.

QMetaObject	- Parts of the API made public. The meta object allows
		  applications to access information about an object's
		  properties as well as its signals and slots.

QMultiLineEdit	- added different word wrap modes: WidgetWidth,
		  FixedPixelWidth and FixedColumnWidth.

QObject		- property access functions property() and setProperty().

QPen		- added adjustable cap and join styles.

QPopupMenu	- added support for tear-off menus, custom items
		  and widget items.
		  A new function setItemParameter() makes it possible
		  to distinguish between several menu items connected to
		  one single slot.

QPrinter        - Now allows printing to the default printer without doing
                  setup() first.

QProgressDialog	- auto-reset and auto-close modes.

QPushButton	- added a menu button mode with setPopup().

QScrollView	- support for auto-scrolling on drag move events (drag
		  auto scroll mode).

QSignal		- optional additional integer parameter for the emitted
		  signal.

QSimpleRichText - added adjustSize() function that implements a clever
		  size hint. Vertical break support for printing. inText()
		  hit test.

QSpinBox	- different button symbols, currently UpDownArrows and
		  PlusMinus.

QSplitter	- supports three resize modes now, Stretch, KeepSize
		  and FollowSizeHint.

QString		- new functions setUnicode(), setUnicodeCodes(), setLatin1(),
		  startsWith() and endsWith()

QStringList	- new functions fromStrList(), split(), join() and grep().

QStyle		- some extensions for menu button indicators, default
		  button indicators, variable scrollbar extends and toolbar
		  handles.

QStyleSheet	- a couple of tags added to the default sheet, such as
		  U, NOBR, HEAD, DL, DT, DD and table support (TABLE, TR,
		  TD, TH). Many attributes added to existing tags.

QTextView	- basic table support. Contents is selectable, selections
		  can be pasted/dragged into other widgets.

QToolBar	- stretchable depending on the orientation (setHorizontalStretchable()
		  and setVerticalStretchable(). Added orientationChanged() signal.

QToolButton	- added optional delayed menu with setPopup() and
		  setPopupDelay(). Auto-raise behaviour adjustable.

QWidget		- new widget flag WStyle_ContextHelp that adds a
		  context-help button to the window titlebar. The
		  button triggers "What's This?"-help. The flag works
		  with MS-Windows and future versions of X11 desktops
		  such as KDE-2.0.

		- New function showFullScreen().

		- Enabling and disabling with setEnabled() propagates to
		  children.

		- Changed isVisible(). It now returns whether a widget
		  is mapped up to the toplevel widget (the previous
		  implementation only returned isVisibleTo(parentWidget()).

		- New property 'backgroundOrigin' that lets a widget draw 
		  its background relatively to its parent widget's coordinate
		  system. This makes pseudo-transparency possible, without
		  the overhead of a real widget mask.


****************************************************************************
*				New clases				   *
****************************************************************************

QCustomMenuItem	- an abstract base class for custom menu items in
		  popup menus.

QFontDataBase	- provides information about the available fonts. Not really
		  a new class (it was used internally for the QFontDialog),
		  but for the first time public API.

QGuardedPtr	- a template class that provides guarded pointers to
		  QObjects.

QIconView	- a sophisticated new widget similar to QListView and
		  QListBox.  An iconview contains optinally labelled pixmap
		  items that the user can select, drag around, rename, delete
		  and more. The widget is highly optimized for speed and
		  large amounts of icons.

QInputDialog	- a convenience dialog to get some simple input values from
		  the user.

QMetaProperty	- stores meta data about properties. Part of the meta
		  object system.

QNetworkProtocol- base class for network protocols, provides
		  a common API for network protocols.

QUrl/
QUrlOperator	- provides an easy way to work with URLs.

QVariant	- a tagged union for the most common Qt data types.

QValueStack	- a value-based stack container.

QWorkspace	- provides a workspace that can contain decorated
		  windows as opposed to frameless child widgets.
		  QWorkspace makes it easy to implement a multi-document
		  interface (MDI).

QBig5Codec	- provides support for the Big5 Chinese encoding.


****************************************************************************
*		Changes which may affect runtime behaviour		   *
****************************************************************************

QDataStream / QPicture
 To accomodate for improved functionality, the stream serialization format
 of QString and QPen has changed in Qt 2.1. The format version
 number has been increased to 3. Compatibility has been kept, so
 applications built with this version of Qt are automatically able to read
 QDataStream and QPicture data generated by earlier Qt 2.x versions. But if
 your application needs to generate data that must be readable by
 applications that are compiled with earlier versions of Qt, you must use
 QDataStream::setVersion() (if the data contains QString or QPen objects).
 See the documentation of this function for further discussion.

QPainter::drawPolygon()
 An outline is no longer drawn in the brush color if NoPen is specified.
 This matches the behaviour on Windows and ensures that the area
 painted in this case is the same pixels defined by a QRegion made
 from the polygon.  To get the old behaviour, you can call
 painter.setPen(painter.brush()) prior to painting, which will also
 work on Windows.

QPushButton::sizeHint()
 The size hint of auto-default push buttons has been slightly
 increased in order to reserve space for a default button indicator
 frame. This is necessary for a proper Motif or Platinum emulation. If
 this change destroys your geometry management, a auto-default button
 is probably not what you wanted anyway. Simply call
 setAutoDefault(FALSE) on these push buttons to get the old behaviour.

QWidget
 Font and palette propagation has changed totally (from "almost
 brain-dead" to working).  In practice, the only changes we've seen are
 to the better.

QColor
 qRgb(r,g,b) now sets a default opaque alpha value of 0xff instead of
 a transparent 0x00 alpha value formerly.  Use qRgb(r,g,b,a) if you do
 need a transparent alpha value.

QPalette
 It turned out that the old normal/active/disabled set of color groups
 didn't work very well, except in the simplest hello-world examples,
 that it couldn't be fixed without nasty hacks, and that during five
 years nobody had discovered the bugs.  So, we've dropped our broken
 attempt at Tcl/Tk L&F compatibility, and added support for Windows
 2000 and Macintosh L&F compatibility instead.  The Macintosh and
 Windows 2000 looks differentiate between the window with focus and
 other windows.  Qt calls the color groups QPalette::active() and
 QPalette::inactive() respectively.

QGridLayout/QBoxLayout 
 setMargin() now also works on child layouts. As a result of this
 change, the geometry() of a layout now includes margin(). This may
 effect programs that use QLayout::geometry().

QToolButton
 The now adjustable auto-raise behaviour defaults to TRUE only when
 a button is used inside a QToolBar. That's usually what you want. If not,
 call setAutoRaise(FALSE).
