Qt 3.0 adds a lot of new features and improvements over the Qt 2.x
series. Some internals have undergone major redesign and new classes
and methods have been added.

We have tried to keep the API of Qt 3.0 as compatible as possible with
the Qt 2.x series. For most applications only minor changes will be
needed to compile and run them successfully using Qt 3.0.

One of the major new features that has been added in the 3.0 release
is a module allowing you to easily work with databases. The API is
platform independent and database neutral. This module is seamlessly
integrated into Qt Designer, greatly simplifying the process of
building database applications and using data aware widgets.

Other major new features include a component architecture allowing you
to build cross platform components, 'plugins' with Qt. You can use
your own and third party plugins your own applications. The Unicode
support of Qt 2.x has been greatly enhanced, it now includes full
support for scripts written from right to left (e.g. Arabic and
Hebrew) and also provides improved support for Asian languages.

Many new classes have been added to the Qt Library. Amongst them are
classes that provide a docking architecture (QDockArea/QDockWindow), a
powerful rich text editor (QTextEdit), a class to store and access
application settings (QSettings) and a class to create and communicate
with processes (QProcess).

Apart from the changes in the library itself a lot has been done to
make the development of Qt applications with Qt 3.0 even easier than
before. Two new applications have been added: Qt Linguist is a tool to
help you translate your application into different languages; Qt
Assistant is an easy to use help browser for the Qt documentation that
supports bookmarks and can search by keyword.

Another change concerns the Qt build system, which has been reworked
to make it a lot easier to port Qt to new platforms. You can use this
platform independent build system for your own applications.


The Qt Library
========================================

A large number of new features has been added to Qt 3.0. The following
list gives an overview of the most important new and changed aspects
of the Qt library. A full list of every new method follows the
overview.


Database support
----------------

One of the major new features in Qt 3.0 is the SQL module that
provides cross-platform access to SQL databases, making database
application programming with Qt seamless and portable. The API, built
with standard SQL, is database-neutral and software development is
independent of the underlying database.

A collection of tightly focused C++ classes are provided to give the
programmer direct access to SQL databases. Developers can send raw SQL
to the database server or have the Qt SQL classes generate SQL queries
automatically.  Drivers for Oracle, PostgreSQL, MySQL and ODBC are
available and writing new drivers is straightforward.

Tying the results of SQL queries to GUI components is fully supported
by Qt's SQL widgets. These classes include a tabular data widget
(for spreadsheet-like data presentation with in-place editing), a
form-based data browser (which provides data navigation and edit
functions) and a form-based data viewer (which provides read-only
forms). This framework can be extended by using custom field editors,
allowing for example, a data table to use custom widgets for in-place
editing. The SQL module fully supports Qt's signal/slots mechanism,
making it easy for developers to include their own data validation and
auditing code.

Qt Designer fully supports Qt's SQL module. All SQL widgets can be
laid out within Qt Designer, and relationships can be established
between controls visually. Many interactions can be defined purely in
terms of Qt's signals/slots mechanism directly in Qt Designer.


Component model - plugins
-------------------------

The QLibrary class provides a platform independent wrapper for runtime
loading of shared libraries. Access to the shared libraries uses a
COM-like interface. QPluginManager makes it trivial to implement
plugin support in applications. The Qt library is able to load
additional styles, database drivers and text codecs from plugins which
implement the relevant interfaces, e.g. QStyleFactoryInterface,
QSqlDriverInterface or QTextCodecInterface. It is possible to remove
unused components from the Qt library, and easy to extend any
application with 3rd party styles, database drivers or text codecs.

Qt Designer supports custom widgets in plugins, and will use the
widgets both when designing and previewing forms.

QComponentFactory makes it easy to register any kind of component in a
global database (e.g. the Windows Registry) and to use any registered
component.


Rich text engine and editor
---------------------------

The rich text engine originally introduced in Qt 2.0 has been further
optimized and extended to support editing. It allows editing formatted
text with different fonts, colors, paragraph styles, tables and
images. The editor supports different word wrap modes, command-based
undo/redo, multiple selections, drag and drop, and many other
features.  The engine is highly optimized for proccesing and displaying
large documents quickly and efficiently.


Unicode
-------

Apart from the rich text engine, another new feature of Qt 3.0 that
relates to text handling is the greatly improved Unicode support. Qt
3.0 includes an implementation of the bidirectional algorithm (BiDi)
as defined in the Unicode standard and a shaping engine for Arabic,
which gives full native language support to Arabic and Hebrew speaking
people. At the same time the support for Asian languages has been
greatly enhanced.

The support is almost transparent for the developer using Qt to
develop their applications. This means that developers who developed
applications using Qt 2.x will automatically gain the full support for
these languages when switching to Qt 3.0. Developers can rely on their
application to work for people using writing systems different from
Latin1, without having to worry about the complexities involved with
these scripts, as Qt takes care of this automatically.


Docked and Floating Windows
---------------------------

Qt 3.0 introduces the concept of Dock Windows and Dock Areas. Dock
windows are widgets, that can be attached to, and detached from, dock
areas. The commonest kind of dock window is a tool bar. Any number of
dock windows may be placed in a dock area. A main window can have dock
areas, for example, QMainWindow provides four dock areas (top, left,
bottom, right) by default. The user can freely move dock windows and
place them at a convenient place in a dock area, or drag them out of
the application and have them float freely as top level windows in
their own right. Dock windows can also be minimized or hidden.

For developers, dock windows behave just like ordinary widgets. QToolbar
for example is now a specialized subclass of a dock window.  The API
of QMainWindow and QToolBar is source compatible with Qt 2.x, so
existing code which uses these classes will continue to work.


Regular Expressions
-------------------

Qt has always provided regular expression support, but that support
was pretty much limited to what was required in common GUI control
elements such as file dialogs. Qt 3.0 introduces a new regular
expression engine that supports most of Perl's regex features and is
Unicode based. The most useful additions are support for parentheses
(capturing and non-capturing) and backreferences.


Storing application settings
----------------------------

Most programs will need to store some settings between runs, for
example, user selected fonts, colors and other preferences, or a list
of recently used files.  The new QSettings class provides a platform
independent way to achieve this goal. The API makes it easy to store
and retrieve most of the basic data types used in Qt (such as basic
C++ types, strings, lists, colors, etc). The class uses the registry
on the Windows platform and traditional resource files on Unix.


Creating and controlling other processes
----------------------------------------

QProcess is a class that allows you to start other programs from
within a Qt application in a platform independent manner. It gives you
full control over the started program, for example you can redirect
the input and output of console applications.


Accessibility (not part of the beta1 release)
---------------------------------------------

Accessibility means making software usable and accessible to a wide
range of users, including those with disabilities. In Qt 3.0, most
widgets provide accessibility information for assistive tools that can
be used by a wide range of disabled users. Qt standard widgets like
buttons or range controls are fully supported. Support for complex
widgets, like e.g. QListView, is in development. Existing applications
that make use of standard widgets will become accessible just by using
Qt 3.0.

Qt uses the Active Accessibility infrastructure on Windows, and needs
the MSAA SDK, which is part of most platform SDKs. With improving
standardization of accessibility on other platforms, Qt will support
assistive technologies on other systems, too.

The accessibility API in Qt is not yet stable, which is why we decided
not to make it a part of the beta1 release.


XML Improvements
----------------

The XML framework introduced in Qt 2.2 has been vastly improved. Qt
2.2 already supported level 1 of the Document Object Model (DOM), a
W3C standard for accessing and modifying XML documents.  Qt 3.0 has
added support for DOM Level 2 and XML namespaces.

The XML parser has been extended to allow incremental parsing of XML
documents. This allows you to start parsing the document directly
after the first parts of the data have arrived, and to continue
whenever new data is available.  This is especially useful if the XML
document is read from a slow source, e.g. over the network, as it
allows the application to start working on the data at a very early
stage.


SVG support
-----------

SVG is a W3C standard for "Scalable Vector Graphics". Qt 3.0's SVG
support means that QPicture can optionally generate and import static
SVG documents. All the SVG features that have an equivalent in
QPainter are supported.


Multihead support
-----------------

Many professional applications, such as DTP and CAD software, are able
to display data on two or more monitors. In Qt 3.0 the QDesktopWidget
class provides the application with runtime information about the
number and geometry of the desktops on the different monitors and such
allows applications to efficiently use a multi-monitor setup.

The virtual desktop of Windows 98 and 2000 is supported, as well as
the traditional multi-screen and the newer Xinerama multihead setups
on X11.


X11 specific enhancements
-------------------------

Qt 3.0 now complies with the NET WM Specification, recently adopted
by KDE 2.0.  This allows easy integration and proper execution with
desktop environments that support the NET WM specification.

The font handling on X11 has undergone major changes.  QFont no longer
has a one-to-one relation with window system fonts.  QFont is now a
logical font that can load multiple window system fonts to simplify
Unicode text display.  This completely removes the burden of
changing/setting fonts for a specific locale/language from the
programmer.  For end-users, any font can be used in any locale.  For
example, a user in Norway will be able to see Korean text without
having to set their locale to Korean.

Qt 3.0 also supports the new render extension recently added to
XFree86. This adds support for anti aliased text and pixmaps with
alpha channel (semi transparency) on the systems that support the
rendering extension (at the moment XFree 4.0.3 and later).


Printing
--------

Printing support has been enhanced on all platforms. The QPrinter
class now supports setting a virtual resolution for the painting
process. This makes WYSIWYG printing trivial, and also allows you to
take full advantage of the high resolution of a printer when painting
on it.

The postscript driver built into Qt and used on Unix has been greatly
enhanced. It supports the embedding of true/open type and type1 fonts
into the document, and can correctly handle and display Unicode.
Support for fonts built into the printer has been enhanced and Qt now
knows about the most common printer fonts used for Asian languages.


QHttp
-----

This class provides a simple interface for HTTP downloads and uploads.


Compatibility with the Standard Template Library (STL)
------------------------------------------------------

Support for the C++ Standard Template Library has been added to the Qt
Template Library (QTL).  The QTL classes now contain appropriate copy
constructors and typedefs so that they can be freely mixed with other
STL containers and algorithms.  In addition, new member functions have
been added to QTL template classes which correspond to STL-style
naming conventions (e.g., push_back()).


Qt Designer
========================================

Qt Designer was a pure dialog editor in Qt 2.2 but has now been
extended to provide the full functionality of a GUI design tool.

This includes the ability to lay out main windows with menus and
toolbars. Actions can be edited within Qt Designer and then plugged
into toolbars and menu bars via drag and drop. Splitters can now be
used in a way similar to layouts to group widgets horizontally or
vertically.

In Qt 2.2, many of the dialogs created by Qt Designer had to be
subclassed to implement functionality beyond the predefined signal and
slot connections. Whilst the subclassing approach is still fully supported,
Qt Designer now offers an alternative: a plugin for editing 
slots. The editor offers features such as syntax highlighting,
completion, parentheses matching and incremental search.

The functionality of Qt Designer can now be extended via plugins.
Using Qt Designer's interface or by implementing one of the provided
interfaces in a plugin, a two way communication between plugin and Qt
Designer can be established. This functionality is used to implement
plugins for custom widgets, so that they can be used as real widgets
inside the designer.

Basic support for project management has been added. This allows you
to read and edit *.pro files, add and remove files to/from the project
and do some global operations on the project. You can now open the
project file and have one-click access to all the *.ui forms in the
project.

In addition to generating code via uic, Qt Designer now supports the
dynamic creation of widgets directly from XML user interface
description files (*.ui files) at runtime. This eliminates the need of
recompiling your application when the GUI changes, and could be used
to enable your customers to do their own customizations. Technically,
the feature is provided by a new class, QWidgetFactory in the
QResource library.


Qt Linguist
========================================

Qt Linguist is a GUI utility to support translating the user-visible
text in applications written with Qt. It comes with two command-line
tools: lupdate and lrelease.

Translation of a Qt application is a three-step process:

  1) Run lupdate to extract user-visible text from the C++ source
     code of the Qt application, resulting in a translation source file
     (a *.ts file).
  2) Provide translations for the source texts in the *.ts file using
     Qt Linguist.
  3) Run lrelease to obtain a light-weight message file (a *.qm file)
     from the *.ts file, which provides very fast lookup for released
     applications.

Qt Linguist is a tool suitable for use by translators. Each
user-visible (source) text is characterized by the text itself, a
context (usually the name of the C++ class containing the text), and
an optional comment to help the translator. The C++ class name will
usually be the name of the relevant dialog, and the comment will often
contain instructions that describe how to navigate to the relevant
dialog.

You can create phrase books for Qt Linguist to provide common
translations to help ensure consistency and to speed up the
translation process. Whenever a translator navigates to a new text to
translate, Qt Linguist uses an intelligent algorithm to provide a list
of possible translations: the list is composed of relevant text from
any open phrase books and also from identical or similar text that has
already been translated.

Once a translation is complete it can be marked as "done"; such
translations are included in the *.qm file. Text that has not been
"done" is included in the *.qm file in its original form. Although Qt
Linguist is a GUI application with dock windows and mouse control,
toolbars, etc., it has a full set of keyboard shortcuts to make
translation as fast and efficient as possible.

When the Qt application that you're developing evolves (e.g. from
version 1.0 to version 1.1), the utility lupdate merges the source
texts from the new version with the previous translation source file,
reusing existing translations. In some typical cases, lupdate may
suggest translations. These translations are marked as unfinished, so
you can easily find and check them.


Qt Assistant
========================================

Due to the positive feedback we received about the help system built
into Qt Designer, we decided to offer this part as a separate
application called Qt Assistant. Qt Assistant can be used to browse
the Qt class documentation as well as the manuals for Qt Designer and
Qt Linguist. It offers index searching, a contents overview, bookmarks
history and incremental search. Qt Assistant is used by both Qt
Designer and Qt Linguist for browsing their help documentation.


QMake
========================================

To ease portability we now provide the qmake utility to replace tmake.
QMake is a C++ version of tmake which offers additional functionallity
that is difficult to reproduce in tmake. Qt uses qmake in its
build system and we have released it as free software.


Qt Functions
========================================

QAction
-------

All new functions:
	void addedTo( QWidget *actionWidget, QWidget *container );
	void addedTo( int index, QPopupMenu *menu );

QActionGroup
------------

New mode "uses drop down", where members are shown in a separate
subwidget such as a combobox or a submenu (enable with
setUsesDropDown(TRUE) )

All new functions:
	void add(QAction*);
	void addSeparator();
	void addedTo( QWidget *actionWidget, QWidget *container, QAction *a );
	void addedTo( int index, QPopupMenu *menu, QAction *a );
	void setUsesDropDown( bool enable );
	bool usesDropDown() const;


QApplication
------------

Added the setStyle(const QString&) overload that takes the name of the
style as its argument. This loads a style plugin via a QStyleFactory.

desktop() now returns a QDesktopWidget that provides access to
multi-head information. Prior to 3.0, it returned a normal QWidget.

New functions to define the library search path for plugins
(setLibraryPaths, ...).

New functions to define reverse layout for bidirectional languages
(setReverseLayout, ...).

All new functions:
	bool hasPendingEvents()

	void setLibraryPaths(const QStringList &);
	QStringList libraryPaths();
	void addLibraryPath(const QString &);
	void removeLibraryPath(const QString &);

	void setReverseLayout( bool b );
	bool reverseLayout();
	int horizontalAlignment( int align );



QClipboard
----------

On systems that support it, for example X11, QClipboard now
differentiates between the primary selection and the data in the clipboard.

All new functions:
	bool supportsSelection() const;
	bool ownsClipboard() const;
	void setSelectionMode(bool enable);
	bool selectionModeEnabled() const;
New signals:
	void selectionChanged()
	


QCursor
-------

Now inherits Qt namespace. Enum values like ArrowCursor,
UpArrowCursor, CrossCursor etc. are now part of that namespace.


QDataStream
-----------

Added missing operators for Q_LONG and Q_ULONG


QDateTime / QDate / QTime
-------------------------

More sophisticated toString() function that takes a DateFormat, where
DateFormat can be either TextDate (the default), ISODate (ISO 8601) or
LocalDate (locale dependent).

All new functions:
	QDate addMonths( int months ) const;
	QDate addYears( int years ) const;
	QDate fromString( const QString& s, Qt::DateFormat f = Qt::TextDate );
	static QString shortMonthName( int month );
	static QString longMonthName( int month );
	static QString shortDayName( int weekday );
	static QString longDayName( int weekday );
	static void setShortMonthNames( const QStringList& names );
	static void setLongMonthNames( const QStringList& names );
	static void setShortDayNames( const QStringList& names );
	static void setLongDayNames( const QStringList& names );

QDialog
-------

Merged with QSemiModal. Calling show() on a modal dialog will return
immediately, not enter a local event loop. Showing a modal dialog in
its own event loop is achieved using exec().

exec() is now a public slot.

Usability: For widgets supporting What's This help, QDialog
automatically offers a context menu containing a "What's This?" entry.


QEvent
------

Mouse events are now propagated up to the toplevel widget if no widget
accepts them and no event filter filters them out. In previous Qt
versions, only key events were propagated.

All events carry a flag 'spontaneous' to determine whether the even
came from the outside or was generated by code within the
applications. Previously, only show and hide events had this flag.

Enter/Leave event generation has been fixed. Previously, a widget
received a leave event when the mouse pointer entered one of its
children. This was both unnatural and contradictive to the
documentation.

QWheelevent now carries an orientation to differentiate between
horizontal and vertical wheels.

QFocusEvent: new reason 'Backtab' (previously only 'Tab' was
available). This makes it possible to discover from what direction on
the tab-focus chain the widget was entered.

New events: QContextMenuEvent, QIMEvent


QFile
-----

Ported from int to Q_LONG to prepare for large file sizes on 64 bit
systems.

Filter handling made more flexible.


QFileDialog
-----------

All new Functions:
	void setSelectedFilter( const QString& );
	void setSelectedFilter( int );
New signals:
	void filesSelected( const QStringList& );
	void filterSelected( const QString& );

If you try to specify an invalid file when using getOpenFileName(s), an error message
will appear and the file will not be accepted.  In 2.x, this function behaved differently
because users were using getOpenFileName(s) as a Save File Dialog; you should use
getSaveFileName() when you require a Save File Dialog.	


QCanvas Module
--------------

	New classes:
		QCanvasSpline - a multi-bezier spline

	QCanvasItemList
		void update();

	QCanvas:
		QRect rect() const;
		void setUnchanged( const QRect& area );
		void drawArea(const QRect&, QPainter* p, bool double_buffer);
		void drawViewArea( QCanvasView* view, QPainter* p, const QRect& r, bool dbuf );
		QRect changeBounds(const QRect& inarea);

	QCanvasView:
		const QWMatrix &worldMatrix() const;
		const QWMatrix &inverseWorldMatrix() const;
		void setWorldMatrix( const QWMatrix & );
	QCanvasSprite:
		int leftEdge() const;
		int topEdge() const;
		int rightEdge() const;
		int bottomEdge() const;
		int leftEdge(int nx) const;
		int topEdge(int ny) const;
		int rightEdge(int nx) const;
		int bottomEdge(int ny) const;

QCanvasSprite can now be set to animate its frames without the need to
subclass.


QFont, QFontDatabase, QFontInfo, QFontMetrics
---------------------------------------------

The QFont::CharSet enum has been removed and replaced with the
QFont::Script enum. With this change, a QFont is not associated with a
specific character set. Instead, QFont uses Unicode Scripts for
loading fonts.  On platforms where most fonts do not use the Unicode
encoding (currently only X11), multiple locale and character-set
dependent fonts can be loaded for the individual Unicode Scripts.

Another new feature of QFont is a much more flexible substitution
mechanism. Each family can have a list of appropriate substitutes. The
font substitution feature allows you to specify a list of substitute
fonts. Substitute fonts are used when a font cannot be loaded, or if
the specified font doesn't have a particular character (X11 only).

For example (on X11), you select the font Lucida, which doesn't have
Korean characters. For Korean text, you want to use the Mincho font
family. By adding Mincho to the list, any Korean characters not found
in Lucida will be used from Mincho. Because the font substitutions are
lists, you can also select multiple families, such as Song Ti (for use
with Chinese text).

QFontInfo and QFontMetrics had small API changes related to the
disappearance of QFont::CharSet.  In terms of functionality, the
behavior of these classes is unchanged.

QFontDatabase had several API cleanups related to the disappearance of
QFont::CharSet.  Most QFontDatabase member functions take one less
argument, yet compatibility functions still exist to keep old source
code working.

Family and style names returned from QFontDatabase are now processed
and formatted in a way that is suitable for display to users.  Family
and foundry names are capitalized and foundry names are enclosed in
square brackets after the family name.  For example, the Helvetica
font family might have 3 different foundries: Adobe, Cronyx and
Phaisarn. In 2.x, QFontDatabase listed them like this:

	adobe-helvetica
	cronyx-helvetica
	phaisarn-helvetica

Starting with 3.0, QFontDatabase lists them like this:

	Helvetica [Adobe]
	Helvetica [Cronyx]
	Helvetica [Phaisarn]


QFrame
------

Two new frame shapes for more sophisticated style features:
MenuBarPanel and ToolBarPanel.


QGrid
-----

The member type

    enum Direction { Horizontal, Vertical };

has been eliminated, as it is redundant: use Qt::Orientation instead.
Old code referring to QGrid::Horizontal or QGrid::Vertical will still
work, as QGrid counts Qt among its ancestors.


QGroupBox
---------

More functionality of the built-in layout is exposed:

	int insideMargin() const;
	int insideSpacing() const;
	void setInsideMargin( int m );
	void setInsideSpacing( int s );


QHeader
-------

New property: bool stretching

New functions:
	bool isStretchEnabled( int section );
	void setStretchEnabled( bool b, int section );
	

QIconSet
--------

In addition to the mode - which can be either Normal, Disabled or
Active - QIconSet now supports different pixmaps for a state, i.e. On
or Off. The functions pixmap() and setPixmap() have been extended
accordingly.

The default constructor no longer initializes the iconset to
contain a null pixmap. QIconSet::isNull() returns TRUE for un-
initialized iconsets, and pixmap() still returns a null pixmap for
pixmaps that couldn't be generated.


QIconView
---------

Extended findItem() to support ComparisonFlags. Support for
soft-hyphens when doing word wrap.

New signal:
	contextMenuRequested( QIconViewItem*, const QPoint& pos);


QIconViewItem
-------------

Added support for explicit rtti.

New function:
	int rtti() const;



QListBox
--------

Extended findItem() to support ComparisonFlags.

New signal:
	void contextMenu( QListBoxItem *, const QPoint & );


QListBoxItem
------------

Added support for explicit rtti.

New function:
	int rtti() const;



QListView
---------

It was never really hard to implement drag and drop with QListView,
but since many applications demand this functionality today, we
decided to add it to the listview itself.

In addition, in-place editing and per-item tooltips have been added.
Extended findItem() to support ComparisonFlags

New properties:
	bool showToolTips
	ResizeMode resizeMode

New signals:
	contextMenuRequested( QIconViewItem*, const QPoint& pos);
	void dropped( QDropEvent *e );
	void itemRenamed( QListViewItem *item, int col, const QString & );
	void itemRenamed( QListViewItem *item, int col  );

New functions:
	void setResizeMode( ResizeMode m );
	ResizeMode resizeMode() const;
	QDragObject *dragObject();
	void startDrag();
	void startRename();


QListViewItem
-------------

Added support for explicit rtti.

New functions:
	void setDragEnabled( bool allow );
	void setDropEnabled( bool allow );
	bool dragEnabled() const;
	bool dropEnabled() const;
	bool acceptDrop( const QMimeSource *mime ) const;
	void setVisible( bool b );
	bool isVisible() const;
	void setRenameEnabled( int col, bool b );
	bool renameEnabled( int col ) const;
	void startRename( int col );
	void setEnabled( bool b );
	bool isEnabled() const;
	int rtti() const;

	void dropped( QDropEvent *e );
	void dragEntered();
	void dragLeft();
	void okRename( int col );
	void cancelRename( int col );


QLabel
------

In addition to text, rich text, pixmaps and movies, QLabel can now
display QPicture vector graphics.

New functions:

	QPicture *picture() const;
	void setPicture( const QPicture & );


QLineEdit
---------

New property: bool dragEnabled

New signal:
	contextMenuRequested( QIconViewItem*, const QPoint& pos);

New functions:
	void cursorForward( bool mark, int steps = 1 );
	void cursorBackward( bool mark, int steps = 1 );
	void cursorWordForward( bool mark );
	void cursorWordBackward( bool mark );
	bool dragEnabled();
	void setDragEnabled( bool b );


QMainWindow
-----------

Added a dock window architecture. Previous versions of QMainWindow
could only deal with toolbars, now they handle generalized dock
windows. QToolBar inherits QDockWindow.


New property:
	bool dockWindowsMovable;

New signals:
	void dockWindowPositionChanged( QDockWindow * );

New functions:
	void setDockEnabled( Dock dock, bool enable );
	bool isDockEnabled( Dock dock ) const;
	bool isDockEnabled( QDockArea *area ) const;
	void setDockEnabled( QDockWindow *tb, Dock dock, bool enable );
	bool isDockEnabled( QDockWindow *tb, Dock dock ) const;
	bool isDockEnabled( QDockWindow *tb, QDockArea *area ) const;

	void addDockWindow( QDockWindow *, Dock = Top, bool newLine = FALSE );
	void addDockWindow( QDockWindow *, const QString &label, Dock = Top, bool newLine = FALSE );
	void moveDockWindow( QDockWindow *, Dock = Top );
	void moveDockWindow( QDockWindow *, Dock, bool nl, int index, int extraOffset = -1 );
	void removeDockWindow( QDockWindow * );

	QDockArea *dockingArea( const QPoint &p );
	QDockArea *leftDock() const;
	QDockArea *rightDock() const;
	QDockArea *topDock() const;
	QDockArea *bottomDock() const;
	
	bool isCustomizable() const;
	bool appropriate( QDockWindow *dw ) const;
	QPopupMenu *createDockWindowMenu( DockWindows dockWindows = AllDockWindows ) const;

	bool showDockMenu( const QPoint &globalPos );


QMetaObject
-----------

###TODO


QMimeSourceFactory
------------------

New static functions:
	QMimeSourceFactory* takeDefaultFactory();
	static void addFactory( QMimeSourceFactory *f );


QNetworkProtocol
----------------

Spelling fix in Error::ErrListChildren enum.


QRegExp
-------

QRegExp now has a more complete regular expression engine similar to
Perl's, with full Unicode and backreference support.

New functions:
	bool minimal() const;
	void setMinimal( bool minimal );
	bool exactMatch( const QString& str );
	bool exactMatch( const QString& str ) const;
	int search( const QString& str, int start = 0 );
	int search( const QString& str, int start = 0 ) const;
	int searchRev( const QString& str, int start = -1 );
	int searchRev( const QString& str, int start = -1 ) const;
	int matchedLength();
	QStringList capturedTexts();
	QString cap( int nth = 0 );
	int pos( int nth = 0 );


QSessionManager
---------------

Renamed the misnamed setProperty() overloads to setManagerProperty()
to resolve the conflict with the now virtual QObject::setProperty().


QString
-------

New functions:
	bool endsWith( const QString & );
	int similarityWith( const QString & );

### TODO

QStyle
------

### TODO

QTabBar
-------

The extended QTabWidget support in Qt Designer made two more
functions handy to have:
	QTab * tabAt( int ) const;
	int indexOf( int ) const;



QToolBar
--------

Inherits QDockWindow now, previously only QWidget.


QToolButton
-----------

New property:
	QIconSet iconSet

New functions:
	QIconSet iconSet() const;
	virtual void setIconSet( const QIconSet & );

QWidget
-------

New functions:

    const QColor & eraseColor() const;
    virtual void setEraseColor( const QColor & );
    const QPixmap * erasePixmap() const;
    virtual void setErasePixmap( const QPixmap & );



QWizard
-------

New property: QString titleFont

New functions:
	QFont titleFont() const;
	void setTitleFont( const QFont & );
	int indexOf( QWidget* ) const;


QWMatrix
--------

New function:
	bool isIdentity() const;
	

QGL Module
----------

QGLWidget
New functions:
	QGLFormat requestedFormat() const;
	QImage grabFrameBuffer( bool withAlpha = FALSE );


QWorkspace Module
-----------------

A new property scrollBarsEnabled makes it possible to add on-demand
scrollbars to the workspace. We define this property in Qt Designer to
make designing forms larger than the available space on the desktop
more comfortable.

New property:
	bool scrollBarsEnabled


QXML Module
-----------
Many new functions have been added:
	QDomImplementation
		QDomDocumentType createDocumentType( const QString& qName, const QString& publicId, const QString& systemId );
		QDomDocument createDocument( const QString& nsURI, const QString& qName, const QDomDocumentType& doctype );
	QDomNode
		QDomNode insertBefore( const QDomNode& newChild, const QDomNode& refChild );
		QDomNode insertAfter( const QDomNode& newChild, const QDomNode& refChild );
		QDomNode replaceChild( const QDomNode& newChild, const QDomNode& oldChild );
		QDomNode removeChild( const QDomNode& oldChild );
		QDomNode appendChild( const QDomNode& newChild );
		bool hasChildNodes() const;
		QDomNode cloneNode( bool deep = TRUE ) const;
		void normalize();
		bool isSupported( const QString& feature, const QString& version ) const;
		QString namespaceURI() const;
		QString localName() const;
		bool hasAttributes() const;
	QDomDocument
		bool setContent( const QCString& text, bool namespaceProcessing=FALSE );
		bool setContent( const QByteArray& text, bool namespaceProcessing=FALSE );
		bool setContent( const QString& text, bool namespaceProcessing=FALSE );
		bool setContent( QIODevice* dev, bool namespaceProcessing=FALSE );
	QDomNamedNodeMap
		QDomNode namedItemNS( const QString& nsURI, const QString& localName ) const;
		QDomNode setNamedItemNS( const QDomNode& newNode );
		QDomNode removeNamedItemNS( const QString& nsURI, const QString& localName );

	QDomElement
		QString attributeNS( const QString nsURI, const QString& localName, const QString& defValue ) const;
		void setAttributeNS( const QString nsURI, const QString& qName, const QString& value );
		void setAttributeNS( const QString nsURI, const QString& qName, int value );
		void setAttributeNS( const QString nsURI, const QString& qName, uint value );
		void setAttributeNS( const QString nsURI, const QString& qName, double value );
		void removeAttributeNS( const QString& nsURI, const QString& localName );
		QDomAttr attributeNodeNS( const QString& nsURI, const QString& localName );
		QDomAttr setAttributeNodeNS( const QDomAttr& newAttr );
		QDomNodeList elementsByTagNameNS( const QString& nsURI, const QString& localName ) const;
		bool hasAttributeNS( const QString& nsURI, const QString& localName ) const;

	
	QXmlAttributes
		void clear();
		void append( const QString &qName, const QString &uri, const QString &localPart, const QString &value );

	QXmlInputSource:
		void setData( const QByteArray& dat );
		void fetchData();
		QString data();
		QChar next();
		void reset();
		QString fromRawData( const QByteArray &data, bool beginning = FALSE );

	QXmlSimpleReader:
		bool parse( const QXmlInputSource& input, bool incremental );
		bool parseContinue();

	QXmlEntityResolver:
		bool startEntity( const QString& name );
		bool endEntity( const QString& name );

	

New classes
-----------

QAquaStyle (only on MacOS X)
QCleanupHandler
QComponentFactory
QComponentFactoryInterface
QComponentServerInterface
QContextMenuEvent
QDesktopWidget
QDockArea
QDockWindow
QErrorMessage
QFeatureListInterface
QHttp [network]
QInterfaceListInterface
QInterfacePtr
QIMEvent
QLibrary
QLibraryInterface
QStyleFactory
QStyleInterface
QTextCodecInterface
QUnknownInterface
QUuid
QRegExpValidator
QTextEdit


Renamed Classes
---------------

QArray has been renamed QMemArray
QCollection has been renamed QPtrCollection
QList has been renamed QPtrList
QListIterator has been renamed QPtrListIterator
QQueue has been renamed QPtrQueue
QStack has been renamed QPtrStack
QVector has been renamed QPtrVector

The include file names have changed accordingly (e.g., <qmemarray.h>).


New Modules
-----------

SQL
	QDataBrowser
	QDataTable
	QDataView
	QDateTimeEdit
	QEditFactory


Obsolete classes
----------------

	QSemiModal, use QDialog instead.
	QMultiLineEdit, use QTextEdit instead.
	QTableView, use QScrollView or QTable instead.
	QAsyncIO, QDataSink, QDataSource, QDataPump and QIODeviceSource


Obsolete functions
------------------
	QActionGroup::insert( QAction * ),  use QActionGroup::add( QAction* ) instead.
	QApplication::setWinStyleHighlightColor( const QColor &c ), use setPalette() instead
	QApplication::winStyleHighlightColor(), use palette() instead
	QDir::encodedEntryList( int filterSpec, int sortSpec ), use QDir::entryList() instead
	QDir::encodedEntryList( const QString &nameFilter, int filterSpec, int sortSpec ), use QDir::entryList() instead
	QMainWindow::addToolBar( QDockWindow *, Dock = Top, bool newLine = FALSE );
	QMainWindow::addToolBar( QDockWindow *, const QString &label,  Dock = Top, bool newLine = FALSE );
	QMainWindow::moveToolBar( QDockWindow *, Dock = Top );
	QMainWindow::moveToolBar( QDockWindow *, Dock, bool nl, int index, int extraOffset = -1 );
	QMainWindow::removeToolBar( QDockWindow * );
	QMainWindow::toolBarsMovable() const;
	QMainWindow::toolBars( Dock dock ) const;
	QMainWindow::lineUpToolBars( bool keepNewLines = FALSE );
	QRegExp::match( const QString& str, int index = 0, int *len = 0,
			bool indexIsStart = TRUE );
	QToolButton::setOnIconSet( const QIconSet & )
	QToolButton::setOffIconSet( const QIconSet & )
	QToolButton::onIconSet() const
	QToolButton::offIconSet() const
	QToolButton::setIconSet( const QIconSet & set, bool on )
	QToolButton::iconSet( bool on ) const
	QXmlInputSource::QXmlInputSource( QFile& file ), use QXmlInputSource( QIODevice *dev ) instead.
	QXmlInputSource::QXmlInputSource( QTextStream& stream ), use QXmlInputSource( QIODevice *dev ) instead.

Removed functions:
	QWidget::setFontPropagation
	QWidget::setPalettePropagation
	QMenuBar::setActItem
	QMenuBar::setWindowsAltMode
	QCheckListItem::paintBranches
	QString::visual
	QString::basicDirection
	QRegExp::find( const QString& str, int index ) const; - has been renamed QRegExp::search()
	QFont::charSet() const, not needed anymore
	QFont::setCharSet( QFont::CharSet ), not needed anymore
	QPushButton::upButton(), not relevant anymore
	QPushButton::downButton(), not relevant anymore
	QSpinBox::upButton(), not relevant anymore
	QSpinBox::downButton(), not relevant anymore


Removed preprocessor directives
-------------------------------

	qcstring.h no longer contains the following defines:

		#define strlen qstrlen
		#define strcpy qstrcpy
		#define strcmp qstrcmp
		#define strncmp qstrncmp
		#define stricmp	qstricmp
		#define strnicmp qstrnicmp

	These directives were meant to automagically replace calls to the
	above listed standard C functions with the equivalent Qt wrappers.
	The latter pre-check the input parameters for null pointers as those
	might cause crashes on some platforms.

	Although convenient, this trick turned out to sometimes conflict with
	third-party code, or, simply be nullified by standard system and
	library headers depending on version and include order.

	The name of some debugging macro variables has been changed.

		DEBUG becomes QT_DEBUG
		NO_DEBUG becomes QT_NO_DEBUG
		NO_CHECK becomes QT_NO_CHECK
		CHECK_STATE becomes QT_CHECK_STATE
		CHECK_RANGE becomes QT_CHECK_RANGE
		CHECK_NULL becomes QT_CHECK_NULL
		CHECK_MATH becomes QT_CHECK_MATH

	The name of some other debugging macro functions has also been changed
	but source compatibility should not be affected if the macro variable
	QT_CLEAN_NAMESPACE is not defined:

		ASSERT becomes Q_ASSERT
		CHECK_PTR becomes Q_CHECK_PTR

	For the record these undocumented macro variables that are not part of
	the API have been changed:

		_OS_*_ becomes Q_OS_*
		_WS_*_ becomes Q_WS_*
		_CC_*_ becomes Q_CC_*


[Qt 3.0]

