Here is a list of (major) changes in Qt from 0.95 to 0.96.

Bug-fixes, optimizations and improved documentation, of course.
QClipboard is new.

There are some changes in the API (Qt header files).  Some functions have
been renamed or the arguments have changed. The old versions of these
functions have been obsoleted. A call to an obsoleted function will by
default generate a runtime warning the first time it is called, but it
will be executed correctly. If you really need to ship code fast, you can
turn off the runtime obsolescence warnings by calling
qSuppressObsoleteWarnings().

Obsoleted functions will disappear in a future release.  To get
compile-time errors for each use of an obsoleted function, compile your
code with -DTEST_OBSOLETE. You should recompile without this option when
you have upgraded your code (otherwise, you may get linking errors). 
Note: it is probably not a good idea to compile the Qt library with
-DTEST_OBSOLETE, it may cause problems if you try to link or run
programs that use obsoleted functions.

For new users: obsoleted functions are no longer documented, in fact they
are not even visible in the documentation.

*************** Changes that might affect runtime behavior *****************

QFileInfo:
----------
  size() returns uint(previousy int), 0 if the size cannot be fetched (was -1).
	Use isFile() to check.


QPopupMenu
------------
  When a popup menu is a submenu (directly or as a subsub...menu) of a
  menu bar(QMenuBar), the menu bar will now always emit the activated() or
  highlighted() signal when a submenu emits these signals. This fix might
  have undesired effects if you previously have worked around it by
  connecting to signals both in menu bar and its submenus.

*************** Changes that might generate compile errors *****************
**************           when compiling old code           *****************

QDataStream:
-----------
  Serialization of int and uint is no longer supported. Use INT32 and
  UINT32 instead. This had to be changed in order to run Qt on 64-bit
  architectures.


QImage:
-------
  24-bpp pixel format no longer supported, use 32-bpp instead.

  This means that you have to use uint* instead of uchar* when accessing
  pixel values. You cannot use the uchar* pointer directly, because the
  pixel format depends on the byte order on the underlying platform. Use
  qRgb() and friends (qcolor.h) to access the pixels.


QWidget:
--------
  setMouseTracking() does not return bool. Call hasMouseTracking() to
  determine the mouse tracking state. (This only affects code that
  actually uses the return value.)

  (There are other changes in QWidget, see below)


*************** Type changes that might generate warnings: *****************


QCache/QIntCache:
-----------------
  Using int/uint instead of long/ulong.


QDate/QTime/QDateTime:
----------------------
  Using int/uint instead of long/ulong (MS-DOS required long).


QIODevice/QBuffer/QFile:
------------------------
  Using int/uint instead of long/ulong.


QKeyEvent:
----------
  ascii() now returns int (previously uchar).


QTableView:
------------
  uint used instead of ulong (tableFlags() etc.)


QTextStream:
------------
  int used instead of long (flags() etc.)


*****************         Obsoleted functions         **********************

QAccel:
-------
  enable(), disable() and isDisabled() are obsolete.
  Use setEnabled(TRUE/FALSE) and !isEnabled() instead.
  isItemDisabled(), enableItem(), disableItem() are obsolete.
  Use !isItemEnabled(), setItemEnabled(TRUE/FALSE) instead.


QApplication:
-------------
  cursor(), setCursor() and restoreCursor() obsoleted.
  Use overrideCursor(), setOverrideCursor() and restoreOverrideCursor()
  instead.


QBitmap:
--------
  Constructor takes "const uchar *bits" instead of "const char *"
  because of sign problems (uchar = unsigned char). Old constructors are
  obsolete.


QButton:
--------
  toggleButton() is obsolete, renamed to isToggleButton().


QColor:
-------
  The functions QRED, QGREEN, QBLUE, QRGB, QGRAY obsolete.
  Instead, use  qRed, qGreen, qBlue, qRgb, qGray.


QComboBox:
----------
  setStrList() obsolete, use clear() + insertStrList() instead.
  string() obsolete, use text() instead.


QLCDNumber:
----------
  longValue() is obsolete, use intValue() instead.


QListbox:
---------
  The macro LBI_String is obsolete, use LBI_text instead.
  string() obsolete, use text() instead.
  stringCopy() and setStringCopy() are obsolete.


QMenuData:
----------
  string() obsolete, use text() instead.
  isItemDisabled(), enableItem(), disableItem() are obsolete.
  Use !isItemEnabled(), setItemEnabled(TRUE/FALSE) instead.
  checkItem() and uncheckItem() are obsolete.
  Use setItemChecked(TRUE/FALSE) instead.


QPainter: 
--------- 

  drawBezier() is obsolete, general Bezier curves are rarely used and
  cost too much. Qt will only support drawQuadBezier() (four-point
  Bezier) in the future.

QPointArray:
-----------
  move() is obsolete, use translate() instead.
  bezier() is obsolete, general Bezier curves are rarely used and
  cost too much. Qt will only support quadBezier() (four-point
  Bezier) in the future.



QRect:
------
  move() is obsolete, use moveBy() instead.
  setTopLeft(), setTopRight(), setBottomLeft(), setBottomRight() and
  setCenter() is obsolete, use moveTopLeft(), moveTopRight(),
  moveBottomLeft(), moveBottomRight() and moveCenter() instead.


QRegion:
-------
  move() is obsolete, use translate() instead.


QSocketNotifier:
----------------
  enabled() is obsolete. Use isEnabled() instead.


QWidget:
--------
  enable(), disable() and isDisabled() are obsolete.
  Use setEnabled(TRUE/FALSE) and !isEnabled() instead.

  setMinimumSize(), setMaximumSize(), minimumSize(), maximumSize() are obsolete
  use setMinSize(), setMaxSize(), minSize(), maxSize() instead.

  enableUpdates() obsolete, use isUpdatesEnabled()/setUpdatesEnabled().

  id() is obsolete, it has been renamed to winId().

***************** All other changes from 0.95 to 0.96 **********************

moc
----------
    Gives a warning if no output is generated.


qglobal.h:
----------
  INT32 and UINT32 typedefs changed to work with DEC Alpha.


QApplication:
-------------
  clipboard() is new.


QButtonGroup:
-------------
  Exclusive group setting added (isExclusive and setExclusive).
  find() is new.


QColor:
-------
  New type QRgb (uint), used for RGB triplet.


QLineEdit:
----------
  You can now mark text, and copy and paste to/from the clipboard.


QPaintDevice:
---------
  The bitblt function now takes an ignoreMask parameter. It has a default
  value, so no old code will be broken.

QPrinter:
------------
  fixed minor bugs in handling of polygons and beziers.


QWidget:
--------
  New protected virtual functions styleChange(), backgroundColorChange(),
  backgroundPixmapChange(), paletteChange() and fontChange().
  These functions are called from setStyle(), setBackgroundColor() etc.
  You can reimplement them to if you need to know when widget properties
  changed and to optimize updates.

  The destroyed() signal has been moved to QObject.

