Qt 3.0 Beta2 is not binary compatible with Beta1, this means that any
programs linked with Beta1 must be recompiled.

Below you'll find a description of general changes in the Qt Library
and Qt Designer followed by a detailed list of changes in the
programming API.


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

Wacom Tablet Support
--------------------

Support for Wacom brand tablets has been introduced on Irix and
Windows.  These devices generate a QTabletEvent that can be handled by
QWidget::tabletEvent(). The QTabletEvent holds information about
pressure, X and Y tilt, and which device is being used (e.g. stylus or
eraser).  Note: at present, there are known issues with the Windows
version.

Documentation
-------------

Overall enhancements including fixed typos and the addition of several
images and code examples.

QStyle (and derived classes)
----------------------------

The style API has been completely rewritten in Qt 3.0. The main reason
for doing this was because it was getting inconsistent, hard to
maintain and extend. Most of the old 2.x functions have been replaced
by a small set of more general functions. The new API is:

 - much more consistent
 - less work have to be done to create custom styles
 - easier to extend and maintain binary compatibility

The old API relied upon a host of virtual functions that were
re-implemented in the different styles. These functions were used to
draw parts of, or entire widgets. The new API uses a small set of more
general functions. Enumerated values are passed as parameters to these
functions to specify which parts of a control or widget is to be drawn
(e.g drawPrimitive( PE_ArrowUp, ...)).

To create custom styles with the new API, simply subclass from the
preferred base style and re-implement the function that draws the part
of the widget you want to change. If you for example want to change
the look of the arrows that are used in QWindowsStyle, subclass from
it and re-implement the drawPrimitive() function. Your drawPrimitive()
function may look something like this:

void QMyStyle::drawPrimitive( PrimitiveElement pe, ... )
{
        switch( pe ) {
        case PE_ArrowUp:
                // draw up arrow
                break;
        case PE_ArrowDown:
                // draw down arrow
                break;
        default:
                // let the base class handle the rest of the drawing
                QWindowsStyle::drawPrimitive( ... );
                break;
        }
}

For more information about the new style API, please read the QStyle
documentation.


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

 - Improved indentation algorithm for the code editor.
 - Allow multiple code editors to be open. This makes copy and paste
   much easier.


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

QCanvas
-------

 - QCanvas does not react on windowActivationChange() anymore.
 - 64 bit cleanup.

QChar
-----

 - The Unicode character is stored host ordered now. Main advantage is
   that you can directly cast a QChar array to an array of unsigned shorts.

QCom
----

 - Introduced QS_OK, QS_FALSE, QE_NOINTERFACE, QE_INVALIDARG and
   QE_NOIMPL as possible QRESULT return values.

QDate, QTime and QDateTime
--------------------------

 - New function for outputting free form strings and new DateFormat
   enum Qt::LocalDate.

New functions:
	QString	toString( const QString& format );

QDir
----

 - entryInfoList() returns 0 for non-existing directories on Windows
   as the documentation claims and the Unix version already does.
 - On Windows, QDir tries a more failsafe way to determine the home
   directory.

QDom
----

 - QDomNode::hasChildNodes() now works as documented.
 - QDomDocument::toString() includes now namespaces in its output.
 - QDomDocument::QDomDocument() constructor now allows adding children
   to the document.

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

 - Various fixes in file type filter and handling of file names and
 directories.

QEvent
------

 - New event type DeferredDelete. See QObject changes below.

QGL
---

 - Fix for Irix in respect of installing colormaps.
 - Swapped arguments of QGLColormap::setEntries() in order to be able
   to use a meaningful default argument.

New class:
	QGLColormap - class for manipulating colormaps in GL index mode.

QGridView
---------

A new class that provides an abstract base for fixed-size grids.

QIconSet
--------

New function:
	void clearGenerated();

QImage
------

 - Handlers for image formats can be dynamically loaded as a plug-in by
 using the QImageFormatInterface.

QLabel
------

 - setIndent() behaves like documented.

QLineEdit
---------

New function:
	int characterAt( int xpos, QChar *chr ) const;

QLibrary
--------

Enabled plug-in loading with static Qt library (Windows).

QMovie
------

 - Does pixmap caching now. Reduces load e.g. on the X Server in the
 case of animated gifs.

QObject
-------

 - Added a deferredDelete() function that will cause the object to
 delete itself once the event loop is entered again.

 - A second type of destroyed signal - one that passes a pointer to
 the destroyed object as a parameter - will be emitted in QObject's
 destructor.

New signal:
	void destroyed( QObject* obj );

New slot:
	void deferredDelete();

QPainter
--------

 - So far clipping had always been done in the device coordinate
   system. The newly introduced ClipMode allows clipping regions to be
   set via setClipRect() and setClipRegion() in painter coordinates.

New enum:
	enum ClipMode { ClipDevice, ClipPainter };

Extended functions:
	QRegion clipRegion( ClipMode = ClipDevice ) const;
	void setClipRect( const QRect &, ClipMode = ClipDevice )
	void setClipRect( int x, int y, int w, int h, ClipMode = ClipDevice );
	void setClipRegion( const QRegion &, ClipMode = ClipDevice );

QPrintDialog
------------

 - Allow overriding the default print dialog. This way it's possible
   to better cope with the variety of existing print systems (API not
   finalized, yet).
 - The dialog reads current QPrinter on every invocation now.

New functions:
	static void setGlobalPrintDialog( QPrintDialog * );
	virtual bool setupPrinters ( QListView *printers );

QPrinter
--------

 - X11 version only: Introduced Qt settings switch 'embedFonts' that
   allows disabling font embedding to reduce size of PostScript output.

QProcess
--------

 - Added function to retrieve the pid (Unix) or PROCESS_INFORMATION
   (Windows) from a running process.
 - Extra parameter for environment settings in start() and launch()
   functions.

New/extended functions:
	PID processIdentifier();
	virtual bool start( QStringList *env=0 );
	virtual bool launch( const QString& buf, QStringList *env=0  );
	virtual bool launch( const QByteArray& buf, QStringList *env=0  );

New signal:
	void launchFinished();

QServerSocket
-------------

 - Set the SO_REUSEADDR option so that the server can be restarted.

QSocket
-------

 - Make deletion of QSocket instances safe if it is in response to a
   signal emitted by the object itself.

SocketDevice
------------

 - Optional boolean parameter to be able to distinguish between
   timeout and connection closed by peer when waitForMore() returns.

Extended functions:
	int waitForMore( int msecs, bool *timeout=0 ) const;

QStyleSheet
-----------

 - Added helper function that escapes HTML meta-characters.

New function:
	QString escape( const QString& plain);

QSql
----

 - The source of the SQL driver plug-ins have been moved to
   $QTDIR/plugins/src/sqldrivers/.
 - The postgres driver checks the version number of the server. So there is
   no need for different drivers: QPSQL6 no longer exists -- use QPSQL7
   instead.
 - Postgres driver supports now 3 PostgreSQL back ends: 6.x, 7.0.x and 7.1.x
 - Better handling of errors coming from the database.
 - SQL driver for Microsoft SQL Server and Sybase Adaptive Server (TDS).
 - Added caching for forward-only cursors.
 - Avoid crashes on the unloading of SQL plugins that occurred on some
   platforms.
 - QSqlResults can be forward only to improve performance
   (QSqlResult::setForwardOnly()).
 - QSqlDatabase passes the port number to the SQL driver.

QTable
------

 - No longer calls processEvents() in columnWidthChanged() and
   rowHeightChanged() in order to avoid any side effects.
 - Ensure that mousePressEvent doesn't emit contextMenuRequested(),
   unless it is called from the contextMenu event handler.
 - For more useful subclassing the new functions listed below have
   been added.

New functions:
	bool isEditing() const;
	EditMode editMode() const;
	int currEditRow() const;
	int currEditCol() const;

QTextCodec
----------

 - Fixes for characters in the 0x80..0xff range.

QTextEdit
---------

 - The rich text engine has seen many internal improvements and
   additions to the QTextEdit class.

New functions:
	virtual void scrollToBottom();
	virtual void removeSelection( int selNum = 0 );
	virtual bool getParagraphFormat(...);
	virtual void insertParagraph( const QString &text, int para );
	virtual void removeParagraph( int para );
	virtual void insertAt( const QString &text, int para, int index );
	QRect paragraphRect( int para ) const;
	int paragraphAt( const QPoint &pos ) const;
	int charAt( const QPoint &pos, int *para ) const;
	
QUrlOperator
------------

 - More precise error messages.

QWidget
-------

 - Added a read-only property containing the widget's background brush.

New function:
	virtual const QBrush& backgroundBrush() const;

QWMatrix
--------

 - New functions for mapping of geometric elements via matrix
   multiplication semantics.

New functions:
	QRect mapRect( const QRect & );
	QPoint operator * (const QPoint & ) const;
	QRegion operator * (const QRect & ) const;
	QRegion operator * (const QRegion & ) const;
	QPointArray operator *  ( const QPointArray &a ) const;
