Qt 3.0.1 is a bugfix release. It maintains both forward and backward
compatibility (source and binary) with Qt 3.0.0


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

- Style Engine fixes
	Qt 3.0 introduced a new and more flexibile style engine. This
	release should fix most of the small visual flaws that the new
	styles introduced. It also greatly improves appearance in
	right-to-left mode.

- MS-Windows XP
	This is the first release to fully support Windows XP,
	including the new themable GUI styles.
	The Windows XP style can only be built as a plugin, which requires
	Qt to be configured as a shared library. To build the plugin
	you must install a Microsoft Platform SDK for October 2001
	or later. Your INCLUDE and LIB environment variables must
	point to the respective directories in the SDK installation.

- Reverse (right-to-left) layouts
	Many classes have improved support for right-to-left layouts.

- Compile fixes 
	Solaris 7 Intel, g++ version 2.8.1.

- Documentation updates
	Some new and improved diagrams and minor textual revisions.

- Mac only: Drag'n'drop
	Mac only: QDropEvents can decode HFS flavors.

- X11 only: Multi-head (multi-screen) improvements
	Support for different TrueColor depths on each head (screen).
	Drag'n'drop support across multiple screens. Tooltips always
	stay on the correct screen. Improved OpenGL support on
	multiple screens. Qt 3.1 will support different color depths
	on every screen (e.g. one TrueColor screen, one 8-bit
	PseudoColor and one 8-bit GreyScale).


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

- QAction
	Fixed a memory leak in conjunction with action accelerators.
	Turn toggle actions off when toggling is turned off with
	setToggleAction(FALSE);

- QApplication
	Shared double buffers are cleaned up on destruction. 
	Creating and using multiple QApplications in the same process
	is supported.
	- Solaris only: Default to the Interface System font (which is
	  the default for the CDE)
	- Win32 only: When WM_QUERYENDSESSION is received, _flushall
	  is called to ensure that all open streams and buffers are
	  flushed to disk (or to OS's buffers). 
	  Better support for more input methods (e.g. Chinese). 
	  Enter events are not propagated to modally blocked widgets. 
	  Key_BackTab events are generated rather than Shift+Key_Tab.
	  Floating toolbars are blocked when the application is modal. 
	  Move and Resize are disabled in the system menu for
	  maximized toplevel windows
	- WinXP only: WM_THEMECHANGED messages are handled; widgets
	  are repolished with the appropriate style.
	- X11 only: Removed misleading warning message for main
	  widgets on heads (screens) other than the default head.
	  Input context: Solved a memory leak in Xlib, and saved a
	  server round trip when updating the microfocushint. 
	  Worked around some broken XmbLookupString implementations
	  that do not report buffer overflows correctly. 
	  Key events are never given to a widget after clearFocus()
	  has been called for that widget; this is the same behavior
	  as Windows.

- QAquaStyle (MacOS X only)
	More optimizations and several minor visual bugs fixed.

- QCanvas
	Erase any exposed empty space when shrinking the canvas.

- QCanvasPixmapArray
	Initialize the framecount to 0.

- QCanvasView
	Optimize background pixmaps: potentially they were drawn
	twice, first untranslated then translated.

- QClipboard (X11 only)
	The race conditions that cause KDE to lock-up occasionally
	should now be fixed.

- QComboBox
	Fixed behavior with non-selectable items. Fixed a crash when
	calling setCurrentItem(-1). Fixed autoscrolling when dragging
	the mouse directly after opening the dropdown.

- QColor
	Make invalid named colors return a non-valid QColor (as
	documented).

- QColorDialog (Win32 only)
	Use WStyle_DialogBorder, since resizing this dialog does not
	make much sense.

- QCommonStyle
	Respect QApplication::globalStrut() in scroll bars. Support
	reverse layout in QTitleBar.

- QCursor
	Safer cleanup of cursor shapes (avoids possible free'd memory
	read)
	- Win32 only: fixed application override cursor with mouse
	  grabbing.

- QDate
	Fixed some possible overflows.
	- Win32 only: Improve locale support for short day and month
	  names etc. Initialize milliseconds correctly.

- QDateTimeEdit
	Display AM/PM if set by locale. Improved sizeHint().

- QDockAarea
	More reliable sizeHint(). Better support for reverse layouts.

- QDockWindow
	Emit the placeChange() signal more reliably. Avoid floating
	docks popping up everywhere before they have been positioned
	and laid out.

- QDesktopWidget
	- X11 only: When using normal dualhead (not Xinerama), make
	  sure we report the correct screen number.
	- Win32 only: refresh on WM_DISPLAYCHANGE.

- QFrame
	New panel styles LineEditPanel and TabWidgetPanel. This was
	required by the new for Windows XP support.

- QFileDialog
	Show unicode filenames to the user rather than encoded ASCII
	(e.g. previously latin1 characters were shown as "%XX"
	escapes).
	Fixed multiple-selection of FTP files. 
	Emit signal fileHighlighted in existingfile mode.
	- Mac only: Fixed existingFolder(). Fixed window position so
	  that it will never fall outside the screen.
	- Win32 only: since files, directories and drives are not case
	  sensitive, we don't add an extra entry in the paths box if
	  the path already exists but with different case.

- QFileInfo (Unix only) 
	Make sure that symlinks pointing to invalid/non-existing
	targets are reported as symlinks.

- QFont
	Ensure a rounded-off value is returned from pointSize().
	- x11 only: improved line width calculation. Fixed off by one
	  error in interpreting Xft font extents. Allow the use of
	  both Xft and non Xft fonts in the same application. Make
	  sure fonts are antialiased by default when using
	  xftfreetype.

- QFontDialog
	Prevent re-laying out when the size of the preview label
	changes.

- QFtp
	In parseDir(), do not compare English month names to
	shortMonthName(), since the latter is localized.

- QGList
	Make self-assignments work.

- QGLWidget
	Fixed ARGB to RGBA conversion on BigEndian systems.
	- Win32 only: fixed colormap for 8-bit RGBA GL mode.
	- X11 only: multiple heads with different color depths fixes.

- QHebrewCodec
	Assume the bidi algorithm is a reversible operation for the
	visual 8859-8 codec. This is not true for very complex strings
	but should hold in most cases.

- QIconSet
	Fixed detach() to really detach the internal pixmaps. In case
	no image formats are installed, show black pixmaps rather than
	ASSERT.

- QImage
	Allow 16-bit DIBs. Allow > 32767 level PNMs. 
	Fixed smoothscale() for the following bug: whenever 
	(new_width / original_width * 4096) is not an integer the last
	column of the scaled image is black.

- QImageIO
	Fixed plugin loading in cases where the image format is
	explicitly defined.

- QInputDialog
	Disable the OK button when input is not Acceptable.
	(See QValidator.)

- QLabel
	When showing rich text with tables (via QSimpleRichtext),
	avoid drawing the table background.

- QLayout
	In reverse layout mode: fix off by one error when laying out
	right to left or bottom to top.

- QLineEdit
	Fixed offset calculation for horizontal scrolling. Invoke
	validator when the user presses Backspace or
	Delete. Compression of the undo/redo stack fixed. Security: do
	not reveal the position of spaces with Ctrl+RightArrow or
	Ctrl+LeftArrow in password mode.

- QListBox
	Append items at the proper position even after sorting the
	content. Made QWidget::setBackgroundMode() work correctly.

- QListBoxPixmap
	Use the function pixmap() when drawing the pixmap, so users
	can reimplement QListBoxPixmap::pixmap().

- QListView
	Fix misalignment of checkbox click zone. Make the selected and
	focus rectangles cover the entire column for QCheckListItems
	if the listview root is not decorated. Make
	QWidget::setBackgroundMode() on the viewport work correctly.
	Comply with user interface guidelines: clear the selection
	when a click is in an empty area unless the Ctrl key is down.
	Fixed possible crash when starting a rename with a double
	click. Smarter ensureItemVisible(). Draw listview background
	in paintEmptyArea() with the current style. Ensure the
	listview always has a current item.

- QMainWindow
	Better laying out of dockareas when they are all empty.
	Otherwise an empty QMainWindow looks unappealing in a
	workspace. Maintain the toplevel layout's resize mode.

- QMessageBox
	Avoid double deletion if the parent is destroyed while the
	messagebox is open. Support y/n/c shortcuts without needing
	the Alt key modifier.

- QMovie
	Allow pause() and restart() with MNG.

- QMultiLineEdit
	Remove internal trailing space when returning a textline with
	textLine(int) and querying lineLength(int).

- QPainter
	The boundingRect() should now work properly for the
	combination richtext, right-aligned and an empty initial rect.
	Handle DontClip-flag in the painter's complex drawText()
	function. Reset the cached composition matrix (and inverse)
	when reinitialising a painter.

- QPicture
	Fixed the loading of binaries from older Qt versions.

- QPixmap
	grabWidget(): when the widget sets WRepaintNoErase it might
	erase itself with the non-redirected QWidget::erase(); restore
	those areas.
	- X11 only: (with XRENDER extension) when copying a pixmap,
	  bitBlt the entire data into the new pixmap instead of using
	  alpha composition.

- QPopupMenu
	Fixed strange side effects with the menu effects. Support
	minimumSize() for popups. Fixed a navigation issue where
	Key_Right under certain circumstances was not propagated to
	the menu bar. Speedups when disabling/enabling menu items
	before showing them.
	- X11 only: Fixed mouse and keyboard grabbing side effects
	  with popup menu effects enabled.

- QPrintDialog (built-in dialog)
	Use the text in the lineedit for the file dialog.

- QPrinter
	Fixed crash when printing with incomplete combined unicode
	fonts.
	- Win32 only: fixed a very rare and mysterious crash.


- QPSPrinter
	Make sure the fontPath is read correctly by the postscript
	driver, and the qtconfig program. Small memory leaks closed.
	Better support for Asian printing. Limit line length of
	Postscript DSC comments to 255 chars (as per the postscript
	specification).

-  QRichText
	Fixed handling of &nbsp. Support both <qt title="..."> and
	<title>. Avoid painting \n at the end of lines (these
	sometimes appeared as an empty unicode box). Fixed find() in
	"whole words only" mode. Fixed unicode auto alignment. Made
	cursor movement in BiDi paragraphs compliant with MS-Windows.
	Fixed paragraph right and center alignments when using <br>
	tags. Fixed superscript/subscript confusion.

- QScrollBar
	Allow scrolling with modifier keys pressed.

- QScrollView
	Made autoscrolling work with drag and drop. Never generate
	paintevents that are outside the visible area.

- QSettings
	- Unix only: search paths are valid for individual objects,
	  NOT every object (windows behavior). When reading files,
	  don't replace the old groups with contents of the new
	  groups; merge them instead. Properly escape backslashes and
	  newlines.
	- win32 only: improved error handling. Fixed subKeyList() and
	  entryList() for empty paths.

- QSimpleRichText
	Correctly transform clipping rectangle.

- QSizeGrip
	Reverted sizeHint() to the old size to avoid making the
	statusbar a tiny bit too big. Support right-to-left layout.


- QSgiStyle
	Made the combobox arrow look nicer. Fixed disabled combobox
	drawing.

- QSlider
	Fixed click handling for reverse layouts.

- QSpinBox
	Usability fix: when changing a value with the up/down arrow
	keys or with the arrow buttons, select the new value.

- QSplitter
	Use the actual QSplitter pointer as documented (and not a
	QSplitterHandle pointer) as the parameter to the
	QStyle::sizeForContents() call. Fixed reverse layouts when
	splitter movement is constrained.

- QSqlRecord
	Fixed double increment of the iterator in certain
	circumstances.

- QString
	Fixed QString::setLatin1() when the length parameter is 0.
	- Unix only: Use strcoll() in QString::localeAwareSorting().
	- Mac only: clarify that local8Bit() is always utf8().

- QStyle
	New frame styles for tab widgets, window frames and line edit
	controls. This was required by the new support for Windows XP.
	Added SH_ScrollBar_StopMouseOverSlider style hint so that one can
	turn on (or off) the ability to stop pageup/pagedown when the
	slider hits the mouse (this is needed for Aqua on MacOS X).

- QSvgDevice
	Many fixes for saving and restoring attributes that are not
	part of QPainter. Processing of 'tspan' elements. Now uses
	double instead of int for internal 'path' arithmetic for
	better scaling results. Supports QPicture's coordinate
	transformations.

- QTabBar
	Fixed the focus rectangles and spacing with icons and label
	texts.

- QTable
	Improved layout in right-to-left mode. Fixed adjustRow() when
	using header items with icon sets. Do not let hidden
	columns/rows re-appear when adjusting. Update header correctly
	when changing a table's dimensions. Correctly reset the
	updatesEnabled flag in sortColumn(). Fixed modifying the
	contents of a combobox or checkbox table item while it is the
	current cell.

- QTableItem
	Make sure an item cannot span over a table's maximum number of
	rows and columns.

- QTabWidget
	Constrain the sizehint to avoid having oversized dialogs.

- QTextCode
	Rename iso8859-6-I to to 8859-6. The old name is still
	supported for backwards compatibility.
	- Win32: implemented locale().
	- Mac: implemented locale().

- QTextDrag (Win32 only)
	Performance improvements in encodedData().

- QTextEdit
	Fixed HTML output. New property tabStopWidth. Fixed append()
	and made it smarter: it only scrolls to the end if the view
	was scrolled to the end before. Proper reformatting when
	switching word wrap policies. Do not blink the cursor when the
	textedit is disabled. Make isModified() return the new value
	in slots connected to the modificationChanged() signal.
	- X11 only: middle mouse selection pasting sets the cursor
	  position.

- QTextStream
	Faster string output in latin1 mode.

- QThread
	- Unix only: initialize threads in non-GUI mode as well.
	- Win32 only: fixed the initial value of QThread::running().

- QToolButton
	Fixed unwanted occurences of delayed popup menus.

- QUrlOperator
	Fixed the cache, so that QUrlInfo::name() is set correctly for
	renamed files. This bug also affected QFileDialog. More
	careful check whether a file is writable before renaming or
	deleting it.

- QValueVector
	Make operator==() const. Fixed some sharing issues.

- QVariant
	Fixed a few memory leaks when casting complex values to simple
	types. Faster operator==().

- QWaitCondition (Win32 only)
	Fixed wakeAll().

- QWhatsThis
	Make QWidget::customWhatsThis() work with menu accelerators.
	Avoid infinite loops with menu effects.

- QWidget
	Fix default focus so that setTabOrder( X, Y ); setTabOrder( Y,
	Z ); gives focus to X, not Y or Z. Closing a modal dialog with
	a double click on a widget could result in a mouse release
	event being delivered to the widget underneath; this has been
	fixed.
	Set/Reset WState_HasMouse on DragEnter/DragLeave.
	- Win32 only: obey WPaintUnclipped. Make reparent() with 0,0
	  positions do the requested positioning.
	- X11 only: when reparenting widgets to/from toplevel, make
	  sure the XdndAware property is set. Make input methods work
	  with servers other than kinput2. More fixes for 4Dwm's
	  incompliance with ICCCM 4.1.5 regarding geometry handling.
	  When hiding toplevel windows, we call XFlush() to avoid
	  having popup menus hanging around grabbing the mouse and
	  keyboard while the application is busy. Obey the 'erase'
	  value in repaint(const QRegion& reg, bool erase).

- QWindowsStyle
	Various visual fixes, including fixes for right-to-left
	mode. Most significantly the light source now comes from the
	top left also in reverse layout the same as modern versions of
	Windows.

- QWorkspace
	Support document windows without title bars. Scroll to top
	left corner when cascading/tiling a scrolled workspace. Define
	a proper baseSize() for workspace children. Fix some side
	effects with the workspace's maximize controls on Windows
	style. Don't raise windows over scrollbars. Clients can now
	call adjustSize() on the workspace when their sizeHint()
	changes. When showing two scrollbars, maintain a solid corner.
	Obey a document window's maximum size when tiling.

****************************************************************************
*			   Extensions					   *
****************************************************************************

NO CHANGES

****************************************************************************
*			      Other					   *
****************************************************************************

- qtconfig (X11 only)
	It is now possible to turn Xft on and off, as well as turning
	antialiasing-by-default on and off. This is necessary since
	Xft doesn't work on dual head.

- moc
	Q_PROPERTY: Support QMap<QString, QVariant> and
	QValueList<QVariant> as "QMap" and "QValueList". Support
	parameters of nested template types, for example
	QValueVector<QValueVector<double> >, as well as
	Foo<const int>.

- uic
	Fix uic-generated code for QWizard with both "font" and
	"titleFont" properties set. Put local includes after global
	includes in generated files.

- lupdate
	Allow translation of menubar items generated with Qt Designer
	(e.g. "&File", "&Edit", etc.).

- libMNG
	Updated to version 1.0.3.

- libPNG
	Updated to version 1.0.12.

- Translations
	Added Hebrew translations for Qt and the demo application.

- Qt Designer
	Support 'Ignored' size policy. Support properties of type
	'double'. Fixed saving of custom widgets in toolbars. Various
	smaller usability improvements.

- Qt Assistant
	When users starts Qt Assistant themselves, always make a new
	instance. Only use the unique-instance feature when invoking
	from Qt Designer.

- QMsDev
	Invoke Qt Linguist when opening a .ts file in Visual Studio.



****************************************************************************
*		    Qt/Embedded-specific changes		           *
****************************************************************************

NO CHANGES
