From d796c9dd933ab96ec83b9a634feedd5d32e1ba3f Mon Sep 17 00:00:00 2001 From: Timothy Pearson Date: Tue, 8 Nov 2011 12:31:36 -0600 Subject: Test conversion to TQt3 from Qt3 8c6fc1f8e35fd264dd01c582ca5e7549b32ab731 --- doc/porting3.doc | 816 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 816 insertions(+) create mode 100644 doc/porting3.doc (limited to 'doc/porting3.doc') diff --git a/doc/porting3.doc b/doc/porting3.doc new file mode 100644 index 00000000..bd67bd2f --- /dev/null +++ b/doc/porting3.doc @@ -0,0 +1,816 @@ +/**************************************************************************** +** +** Help with porting from Qt 2.x to Qt 3.x +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of the Qt GUI Toolkit. +** +** This file may be used under the terms of the GNU General +** Public License versions 2.0 or 3.0 as published by the Free +** Software Foundation and appearing in the files LICENSE.GPL2 +** and LICENSE.GPL3 included in the packaging of this file. +** Alternatively you may (at your option) use any later version +** of the GNU General Public License if such license has been +** publicly approved by Trolltech ASA (or its successors, if any) +** and the KDE Free Qt Foundation. +** +** Please review the following information to ensure GNU General +** Public Licensing retquirements will be met: +** http://trolltech.com/products/qt/licenses/licensing/opensource/. +** If you are unsure which license is appropriate for your use, please +** review the following information: +** http://trolltech.com/products/qt/licenses/licensing/licensingoverview +** or contact the sales department at sales@trolltech.com. +** +** This file may be used under the terms of the Q Public License as +** defined by Trolltech ASA and appearing in the file LICENSE.QPL +** included in the packaging of this file. Licensees holding valid Qt +** Commercial licenses may use this file in accordance with the Qt +** Commercial License Agreement provided with the Software. +** +** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, +** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted +** herein. +** +**********************************************************************/ + +/*! +\page porting.html + +\title Porting to Qt 3.x + +This document describes porting applications from Qt 2.x to Qt 3.x. + +The Qt 3.x series is not binary compatible with the 2.x series. This +means programs compiled for Qt 2.x must be recompiled to work with Qt +3.x. Qt 3.x is also not completely \e source compatible with 2.x, +however all points of incompatibility cause compiler errors or +run-time messages (rather than mysterious results). Qt 3.x includes +many additional features and discards obsolete functionality. Porting +from Qt 2.x to Qt 3.x is straightforward, and once completed makes +the considerable additional power and flexibility of Qt 3.x available +for use in your applications. + +To port code from Qt 2.x to Qt 3.x: + +\list 1 + +\i Briefly read the porting notes below to get an idea of what to expect. +\i Be sure your code compiles and runs well on all your target platforms + with Qt 2.x. +\i Recompile with Qt 3.x. For each error, search below for related + identifiers (e.g. function names, class names). This document + mentions all relevant identifiers to help you get the information + you need at the cost of being a little verbose. +\i If you get stuck, ask on the \link http://qt-interest.trolltech.com/ + qt-interest \endlink mailing list, or Trolltech Technical Support if + you're a registered licensee. + +\endlist + +Table of contents: + +\tableofcontents + +\target Linkerrors +\section1 Link Errors on Windows + +On Windows, originally in Qt 2.x, the default configuration of the Qt +library is static. If you just use the default configuration you +don't need to set certain preprocessor defines. In Qt 3.0, the +default configuration of the Qt library is to build it as a shared +library, therefore the preprocessor define \c QT_DLL is needed. + +If you use tmake with Qt 2.x, and now use qmake with Qt 3.x, then the +cause of the problem is with the project file. In the project file, +there is usually line that looks like: + +\c CONFIG = ... + +this should be changed to + +\c CONFIG += ... + +so that qmake can look at the configuration that Qt was built with and +set any relevant preprocessor defines in the makefile. + +\target Headers +\section1 Header file inclusion changes + +Qt 3.x remove some unnecessary nested #include directives from +header files. This speeds up compilation when you don't need those +nested header files. But in some cases you will find you need to add +an extra #include to your files. + +For example, if you get a message about QStringList or its functions +not being defined, then add \c {#include } at +the top of the file giving the error. + +Header files that you might need to add #include directives for include: +\list +\i \c +\i \c +\i \c +\i \c +\i \c +\i \c +\i \c +\i \c +\endlist + +\section1 Namespace + +Qt 3.x is namespace clean. A few global identifiers that had been +left in Qt 2.x have been discarded. + +Enumeration \l Qt::CursorShape and its values are now part of the +special \c Qt class defined in qnamespace.h. If you get compilation +errors about these being missing (unlikely, since most of your code will +be in classes that inherit from the Qt namespace class), then apply +the following changes: + +\list +\i \c QCursorShape becomes \c Qt::CursorShape +\i \c ArrowCursor becomes \c Qt::ArrowCursor +\i \c UpArrowCursor becomes \c Qt::UpArrowCursor +\i \c CrossCursor becomes \c Qt::CrossCursor +\i \c WaitCursor becomes \c Qt::WaitCursor +\i \c IbeamCursor becomes \c Qt::IbeamCursor +\i \c SizeVerCursor becomes \c Qt::SizeVerCursor +\i \c SizeHorCursor becomes \c Qt::SizeHorCursor +\i \c SizeBDiagCursor becomes \c Qt::SizeBDiagCursor +\i \c SizeFDiagCursor becomes \c Qt::SizeFDiagCursor +\i \c SizeAllCursor becomes \c Qt::SizeAllCursor +\i \c BlankCursor becomes \c Qt::BlankCursor +\i \c SplitVCursor becomes \c Qt::SplitVCursor +\i \c SplitHCursor becomes \c Qt::SplitHCursor +\i \c PointingHandCursor becomes \c Qt::PointingHandCursor +\i \c BitmapCursor becomes \c Qt::BitmapCursor +\endlist + +The names of some debugging macro variables have been changed. We have +tried not to break source compatibility as much as possible. If you observe +error messages on the UNIX console or the Windows debugging stream that were +previously disabled, please check these macro variables: + +\list +\i \c DEBUG becomes \c QT_DEBUG +\i \c NO_DEBUG becomes \c QT_NO_DEBUG +\i \c NO_CHECK becomes \c QT_NO_CHECK +\i \c CHECK_STATE becomes \c QT_CHECK_STATE +\i \c CHECK_RANGE becomes \c QT_CHECK_RANGE +\i \c CHECK_NULL becomes \c QT_CHECK_NULL +\i \c CHECK_MATH becomes \c QT_CHECK_MATH +\endlist + +The name of some debugging macro functions has been changed as well +but source compatibility should not be affected if the macro variable +\c QT_CLEAN_NAMESPACE is not defined: + +\list +\i \c ASSERT becomes \c Q_ASSERT +\i \c CHECK_PTR becomes \c Q_CHECK_PTR +\endlist + +For the record, undocumented macro variables that are not part of the API +have been changed: + +\list +\i \c _OS_*_ becomes \c Q_OS_* +\i \c _WS_*_ becomes \c Q_WS_* +\i \c _CC_*_ becomes \c Q_CC_* +\endlist + +\section1 Removed Functions + +All these functions have been removed in Qt 3.x: +\list +\i QFont::charSet() +\i QFont::setCharSet() +\i QMenuBar::setActItem() +\i QMenuBar::setWindowsAltMode() +\i QObject::initMetaObject() +\i QPainter::drawQuadBezier() +\i QPointArray::quadBezier() +\i QRegExp::find() +\i QSpinBox::downButton() +\i QSpinBox::upButton() +\i QString::basicDirection() +\i QString::visual() +\i QStyle::set...() functions +\i QStyle::drawArrow() +\i QWidget::setFontPropagation() +\i QWidget::setPalettePropagation() +\endlist + +Also, to avoid conflicts with \c , the following three +global functions have been renamed: +\list +\i setw() (renamed qSetW()) +\i setfill() (renamed qSetFill()) +\i setprecision() (renamed qSetPrecision()) +\endlist + +\section1 Obsoleted Functions + +The following functions have been obsoleted in Qt 3.0. The +documentation of each of these functions should explain how to +replace them in Qt 3.0. + +\warning It is best to consult \l http://doc.trolltech.com/3.0/ +rather than the documentation supplied with Qt to obtain the latest +information regarding obsolete functions and how to replace them in +new code. + +\list +\i QAccel::keyToString( QKeySequence k ) +\i QAccel::stringToKey( const QString \& s ) +\i QActionGroup::insert( QAction *a ) +\i QButton::autoResize() const +\i QButton::setAutoResize( bool ) +\i QCanvasItem::active() const +\i QCanvasItem::enabled() const +\i QCanvasItem::selected() const +\i QCanvasItem::visible() const +\i QCanvasPixmapArray::QCanvasPixmapArray( QPtrList\ list, QPtrList\ hotspots ) +\i QCanvasPixmapArray::operator!() +\i QColorGroup::QColorGroup( const QColor \& foreground, const QColor \& background, const QColor \& light, const QColor \& dark, const QColor \& mid, const QColor \& text, const QColor \& base ) +\i QComboBox::autoResize() const +\i QComboBox::setAutoResize( bool ) +\i QDate::dayName( int weekday ) +\i QDate::monthName( int month ) +\i QDir::encodedEntryList( const QString \& nameFilter, int filterSpec = DefaultFilter, int sortSpec = DefaultSort ) const +\i QDir::encodedEntryList( int filterSpec = DefaultFilter, int sortSpec = DefaultSort ) const +\i QDockWindow::isHorizontalStretchable() const +\i QDockWindow::isVerticalStretchable() const +\i QDockWindow::setHorizontalStretchable( bool b ) +\i QDockWindow::setVerticalStretchable( bool b ) +\i QFont::defaultFont() +\i QFont::setDefaultFont( const QFont \& f ) +\i QFont::setPixelSizeFloat( float pixelSize ) +\i QFontDatabase::bold( const QString \& family, const QString \& style, const QString \& ) const +\i QFontDatabase::families( bool ) const +\i QFontDatabase::font( const QString \& familyName, const QString \& style, int pointSize, const QString \& ) +\i QFontDatabase::isBitmapScalable( const QString \& family, const QString \& style, const QString \& ) const +\i QFontDatabase::isFixedPitch( const QString \& family, const QString \& style, const QString \& ) const +\i QFontDatabase::isScalable( const QString \& family, const QString \& style, const QString \& ) const +\i QFontDatabase::isSmoothlyScalable( const QString \& family, const QString \& style, const QString \& ) const +\i QFontDatabase::italic( const QString \& family, const QString \& style, const QString \& ) const +\i QFontDatabase::pointSizes( const QString \& family, const QString \& style, const QString \& ) +\i QFontDatabase::smoothSizes( const QString \& family, const QString \& style, const QString \& ) +\i QFontDatabase::styles( const QString \& family, const QString \& ) const +\i QFontDatabase::weight( const QString \& family, const QString \& style, const QString \& ) const +\i QLabel::autoResize() const +\i QLabel::setAutoResize( bool enable ) +\i QLineEdit::cursorLeft( bool mark, int steps = 1 ) +\i QLineEdit::cursorRight( bool mark, int steps = 1 ) +\i QLineEdit::hasMarkedText() const +\i QLineEdit::markedText() const +\i QLineEdit::repaintArea( int, int ) +\i QListBox::cellHeight( int i ) const +\i QListBox::cellHeight() const +\i QListBox::cellWidth() const +\i QListBox::findItem( int yPos ) const +\i QListBox::inSort( const QListBoxItem *lbi ) +\i QListBox::inSort( const QString \& text ) +\i QListBox::itemYPos( int index, int *yPos ) const +\i QListBox::numCols() const +\i QListBox::totalHeight() const +\i QListBox::totalWidth() const +\i QListBoxItem::current() const +\i QListBoxItem::selected() const +\i QListView::removeItem( QListViewItem *item ) +\i QListViewItem::removeItem( QListViewItem *item ) +\i QMainWindow::addToolBar( QDockWindow *, Dock = DockTop, bool newLine = FALSE ) +\i QMainWindow::addToolBar( QDockWindow *, const QString \& label, Dock = DockTop, bool newLine = FALSE ) +\i QMainWindow::lineUpToolBars( bool keepNewLines = FALSE ) +\i QMainWindow::moveToolBar( QDockWindow *, Dock = DockTop ) +\i QMainWindow::moveToolBar( QDockWindow *, Dock, bool nl, int index, int extraOffset = -1 ) +\i QMainWindow::removeToolBar( QDockWindow *) +\i QMainWindow::setToolBarsMovable( bool ) +\i QMainWindow::toolBarPositionChanged( QToolBar *) +\i QMainWindow::toolBarsMovable() const +\i QMessageBox::message( const QString \& caption, const QString \& text, const QString \& buttonText = QString::null, QWidget *parent = 0, const char *= 0 ) +\i QMessageBox::query( const QString \& caption, const QString \& text, const QString \& yesButtonText = QString::null, const QString \& noButtonText = QString::null, QWidget *parent = 0, const char *= 0 ) +\i QMessageBox::standardIcon( Icon icon, GUIStyle style ) +\i QPalette::normal() +\i QRegExp::match( const QString \& str, int index = 0, int *len = 0, bool indexIsStart = TRUE ) const +\i QScrollView::childIsVisible( QWidget *child ) +\i QScrollView::showChild( QWidget *child, bool show = TRUE ) +\i QSignal::block( bool b ) +\i QSignal::isBlocked() const +\i QSignal::parameter() const +\i QSignal::setParameter( int value ) +\i QSimpleRichText::draw( QPainter *p, int x, int y, const QRegion \& clipRegion, const QColorGroup \& cg, const QBrush *paper = 0 ) const +\i QString::ascii() const +\i QString::data() const +\i QString::setExpand( uint index, QChar c ) +\i QStyle::defaultFrameWidth() const +\i QStyle::scrollBarExtent() const +\i QStyle::tabbarMetrics( const QWidget *t, int \& hf, int \& vf, int \& ov ) const +\i QTabDialog::isTabEnabled( const char *name ) const +\i QTabDialog::selected( const QString \& ) +\i QTabDialog::selected( const QString \& tabLabel ) +\i QTabDialog::setTabEnabled( const char *name, bool enable ) +\i QTextStream::QTextStream( QString \& str, int filemode ) +\i QToolBar::QToolBar( const QString \& label, QMainWindow *, ToolBarDock = DockTop, bool newLine = FALSE, const char *name = 0 ) +\i QToolButton::iconSet( bool on ) const +\i QToolButton::offIconSet() const +\i QToolButton::onIconSet() const +\i QToolButton::setIconSet( const QIconSet \& set, bool on ) +\i QToolButton::setOffIconSet( const QIconSet \& ) +\i QToolButton::setOnIconSet( const QIconSet \& ) +\i QToolTip::enabled() +\i QToolTip::setEnabled( bool enable ) +\i QTranslator::find( const char *context, const char *sourceText, const char *comment = 0 ) const +\i QTranslator::insert( const char *context, const char *sourceText, const QString \& translation ) +\i QTranslator::remove( const char *context, const char *sourceText ) +\i QUriDrag::setFilenames( const QStringList \& fnames ) +\i QWidget::backgroundColor() const +\i QWidget::backgroundPixmap() const +\i QWidget::iconify() +\i QWidget::setBackgroundColor( const QColor \& c ) +\i QWidget::setBackgroundPixmap( const QPixmap \& pm ) +\i QWidget::setFont( const QFont \& f, bool ) +\i QWidget::setPalette( const QPalette \& p, bool ) +\i QWizard::setFinish( QWidget *, bool ) +\i QXmlInputSource::QXmlInputSource( QFile \& file ) +\i QXmlInputSource::QXmlInputSource( QTextStream \& stream ) +\i QXmlReader::parse( const QXmlInputSource \& input ) +\endlist + +Additionally, these preprocessor directives have been removed: + +\list +\i \c {#define strlen qstrlen} +\i \c {#define strcpy qstrcpy} +\i \c {#define strcmp qstrcmp} +\i \c {#define strncmp qstrncmp} +\i \c {#define stricmp qstricmp} +\i \c {#define strnicmp qstrnicmp} +\endlist + +See the changes-3.0.0 document for an explanation of why this had to be done. +You might have been relying on the non-portable and unpredictable behavior +resulting from these directives. We strongly recommend that you either make +use of the safe qstr* variants directly or ensure that no 0 pointer is +passed to the standard C functions in your code base. + +\section1 Collection Class Renaming + +The classes QArray, QCollection, QList, QListIterator, QQueue, QStack +and QVector have been renamed. To ease porting, the old names and the +old header-file names are still supported. + +\table +\header \i Old Name \i New Name \i New Header File +\row \i QArray \i \l QMemArray \i \c +\row \i QCollection \i \l QPtrCollection \i \c +\row \i QList \i \l QPtrList \i \c +\row \i QListIterator \i \l QPtrListIterator \i \c +\row \i QQueue \i \l QPtrQueue \i \c +\row \i QStack \i \l QPtrStack \i \c +\row \i QVector \i \l QPtrVector \i \c +\endtable + +\section1 QButtonGroup + +In Qt 2.x, the function QButtonGroup::selected() returns the selected +\e radio button (QRadioButton). In Qt 3.0, it returns the selected \e +toggle button (\l QButton::toggleButton), a more general concept. +This might affect programs that use QButtonGroups that contain a +mixture of radio buttons and non-radio (e.g. QCheckBox) toggle buttons. + +\section1 QDate + +Two QDate member functions that were virtual in Qt 2.0 are not virtual +in Qt 3.0. This is only relevant if you subclassed QDate and +reimplemented these functions: + +\list +\i QString QDate::monthName( int month ) const +\i QString QDate::dayName( int weekday ) const +\endlist + +In addition to no longer being virtual, QDate::monthName() and +QDate::dayName() have been renamed QDate::shortMonthName() and +QDate::shortDayName() and have been made static (as they should had +been in the first place). The old names are still provided for source +compatibility. + +\section1 QFileDialog + +If the mode was not set explicitly, and the user entered a +non-existent file, the dialog would accept this. In Qt 3.x, you must +set the mode, e.g. setMode(QFileDialog::AnyFile), to get the same +behavior. + +\section1 QFont + +The internals of QFont have changed significantly between Qt 2.2 and +Qt 3.0, to give better Unicode support and to make developing +internationalized applications easier. The original API has been +preserved with minimal changes. The CharSet enum and its related +functions have disappeared. This is because Qt now handles all charset +related issues internally, and removes this burden from the developer. + +If you used the CharSet enum or its related functions, e.g +QFont::charSet() or QFont::setCharSet(), just remove them from your +code. There are a few functions that took a QFont::CharSet as a +parameter; in these cases simply remove the charset from the +parameter list. + +\section1 QInputDialog + +The two static getText(...) methods in QInputDialog have been merged. +The \c echo parameter is the third parameter and defaults to +QLineEdit::Normal. + +If you used calls to QInputDialog::getText(...) that provided more +than the first two retquired parameters you will must add a value +for the \c echo parameter. + +\section1 QLayout and Other Abstract Layout Classes + +The definitions of \l QGLayoutIterator, \l QLayout, \l QLayoutItem, \l +QLayoutIterator, \l QSpacerItem and \l QWidgetItem have been moved from \c + to \c . The header \c + now includes \c for compatibility. It +might be removed in a future version. + +\section1 QListViewItem + +The paintBranches() function in Qt 2.x had a GUIStyle parameter; this +has been dropped for Qt 3.x since GUI style is handled by the new +style engine (See \l QStyle.) + +\section1 QMoveEvent + +In Qt 2.x, the function QMoveEvent::pos() returned the position of the +widget in its parent widget, including the window frame. In Qt 3.0, +it returns the new position of the widget, excluding window frame for +top level widgets. + +\section1 QMultiLineEdit + +The QMultiLineEdit was a simple editor widget in previous Qt versions. +Since Qt 3.0 includes a new richtext engine, which also supports +editing, QMultiLineEdit is obsolete. For the sake of compatibility +QMultiLineEdit is still provided. It is now a subclass of QTextEdit +which wraps the old QMultiLineEdit so that it is mostly source +compatible to keep old applications working. + +For new applications and when maintaining existing applications we +recommend that you use QTextEdit instead of QMultiLineEdit wherever +possible. + +Although most of the old QMultiLineEdit API is still available, there +is one important difference. The old QMultiLineEdit operated in terms +of lines, whereas QTextEdit operates in terms of paragraphs. This is +because lines change all the time during wordwrap, whereas paragraphs +remain paragraphs. The consequence of this change is that functions +which previously operated on lines, e.g. numLines(), textLine(), etc., +now work on paragraphs. + +Also the function getString() has been removed since it +published the internal data structure. + +In most cases, applications that used QMultiLineEdit will continue to +work without problems. Applications that worked in terms of lines may +retquire some porting. + +The source code for the old 2.x version of QMultiLineEdit can be found +in \c $QTDIR/src/attic/qtmultilineedit.h/cpp. Note that the class has +been renamed to QtMultiLineEdit to avoid name clashes. If you really +need to keep compatibility with the old QMultiLineEdit, simply include +this class in your project and rename QMultiLineEdit to +QtMultiLineEdit throughout. + +\section1 QPrinter + +QPrinter has undergone some changes, to make it more flexible and +to ensure it has the same runtime behaviour on both Unix and Windows. In 2.x, +QPrinter behaved differently on Windows and Unix, when using view +transformations on the QPainter. This has changed now, and QPrinter +behaves consistently across all platforms. A compatibilty mode has been +added that forces the old behaviour, to ease porting from Qt 2.x +to Qt 3.x. This compatibilty mode can be enabled by passing the +QPrinter::Compatible flag to the QPrinter constructor. + +On X11, QPrinter used to generate encapsulated postscript when +fullPage() was TRUE and only one page was printed. This does not +happen by default anymore, providing a more consistent printing output. + +\section1 QRegExp + +The \l QRegExp class has been rewritten to support many of the features of Perl +regular expressions. Both the regular expression syntax and the QRegExp +interface have been modified. + +Be also aware that \c is no longer included +automatically when you include \c . See +\link #Headers above \endlink for details. + +\omit +In Qt 3.0, qregexp.h has to +include qstringlist.h, so it's no good to have qstringlist.h include qregexp.h, +unless one wants to achieve an Escher effect. +\endomit + +\section2 New special characters + +There are five new special characters: (, ), {, +| and } (parentheses, braces and pipe). When porting old +regular expressions, you must add \ (backslash) in front of any +of these (actually, \\ in C++ strings), unless it is already +there. + +Example: Old code like +\code + QRegExp rx( "([0-9|]*\\)" ); // works in Qt 2.x +\endcode +should be converted into +\code + QRegExp rx( "\\([0-9\\|]*\\)" ); // works in Qt 2.x and 3.x +\endcode +(Within character classes, the backslash is not necessary in front of certain +characters, e.g. |, but it doesn't hurt.) + +Wildcard patterns need no conversion. Here are two examples: +\code + QRegExp wild( "(*.*)" ); + wild.setWildcard( TRUE ); +\endcode +\code + // TRUE as third argument means wildcard + QRegExp wild( "(*.*)", FALSE, TRUE ); +\endcode +However, when they are used, make sure to use QRegExp::exactMatch() +rather than the obsolete QRegExp::match(). QRegExp::match(), like +QRegExp::find(), tries to find a match somewhere in the target +string, while QRegExp::exactMatch() tries to match the whole target +string. + +\section2 QRegExp::operator=() + +This function has been replaced by \l QRegExp::setPattern() in Qt 2.2. +Old code such as +\code + QRegExp rx( "alpha" ); + rx.setCaseSensitive( FALSE ); + rx.setWildcard( TRUE ); + rx = "beta"; +\endcode +still compiles with Qt 3, but produces a different result (the case sensitivity +and wildcard options are forgotten). This way, +\code + rx = "beta"; +\endcode +is the same as +\code + rx = QRegExp( "beta" ); +\endcode +which is what one expects. + +\section2 QRegExp::match() + +The following function is now obsolete, as it has an unwieldy +parameter list and was poorly named: +\list +\i bool QRegExp::match( const QString \& str, int index = 0, + int * len = 0, bool indexIsStart = TRUE ) const +\endlist +It will be removed in a future version of Qt. Its \link +QRegExp::match() documentation \endlink explains how to replace it. + +\section2 QRegExp::find() + +This function was removed, after a brief appearance in Qt 2.2. Its +name clashed with QString::find(). Use \l QRegExp::search() or \l +QString::find() instead. + +\section2 QString::findRev() and QString::contains() + +\l QString::findRev()'s and \l QString::contains()'s semantics have changed +between 2.0 and 3.0 to be more consistent with the other overloads. + +For example, +\code + QString( "" ).contains( QRegExp("") ) +\endcode +returns 1 in Qt 2.0; it returns 0 in Qt 3.0. Also, "^" now really means +start of input, so +\code + QString( "Heisan Hoppsan" ).contains( QRegExp("^.*$") ) +\endcode +returns 1, not 13 or 14. + +This change affect very few existing programs. + +\section2 QString::replace() + +With Qt 1.0 and 2.0, a QString is converted implicitly into a QRegExp +as the first argument to QString::replace(): +\code + QString text = fetch_it_from_somewhere(); + text.replace( QString("[A-Z]+"), "" ); +\endcode +With Qt 3.0, the compiler gives an error. The solution is to use a +QRegExp cast: +\code + text.replace( QRegExp("[A-Z]+"), "" ); +\endcode +This change makes it possible to introduce a +QString::replace(QString, QString) overload in a future version of Qt +without breaking source compatibility. + +\section1 QSemiModal + +The QSemiModal class is now obsolete. You should call show() on a +modal dialog instead. + +\section1 QSortedList + +The QSortedList class is now obsolete. Consider using a QDict, a QMap +or a plain QPtrList instead. + +\section1 QTableView + +The QTableView class has been obsoleted and is no longer a part of the +Qt API. Either use the powerful QTable class or the simplistic +QGridView in any new code you create. If you really need the old table +view for compatibility you can find it in \c +$QTDIR/src/attic/qttableview.{cpp,h}. Note that the class has been +renamed from QTableView to QtTableView to avoid name clashes. To use +it, simply include it in your project and rename QTableView to +QtTableView throughout. + +\section1 QToolButton + +The \l QToolButton class used to distinguish between "on" and "off" +icons. In 3.0, this mechanism was moved into the \l QIconSet class +(see \l QIconSet::State). + +The old \l QToolButton::onIconSet and \l QToolButton::offIconSet +properties are still provided so that old source will compile, but +their semantics have changed: they are now synonyms for \l +QToolButton::iconSet. If you used that distinction in Qt 2.x, you will +need to adjust your code to use the QIconSet On/Off mechanism. + +Likewise, the \e on parameter of these two functions is now ignored: + +\list +\i void QToolButton::setIconSet ( const QIconSet \& set, bool on ) +\i QIconSet QToolButton::iconSet ( bool on ) const +\endlist + +These functions are only provided for ease of porting. New code +should use the following instead: + +\list +\i void QToolButton::setIconSet( const QIconSet \& set ) +\i QIconSet QToolButton::iconSet() const +\endlist + +Finally, this function is no longer virtual: + +\list +\i void QToolButton::setIconSet( const QIconSet \& set, bool on ) +\endlist + +If you have a class that inherits QToolButton and that reimplements +QToolButton::setIconSet(), you should make the signature of the +reimplementation agree with the new \l QToolButton::setIconSet(), +a virtual function. + +\section1 QTextStream + +The global QTextStream manipulators setw(), setfill() and setprecison() +were renamed to qSetW(), qSetFill() and qSetPrecision() to avoid conflicts +with \c . If you used them, you must rename the occurrences to +the new names. + +\section1 QTranslator + +The \l QTranslator class was extended in Qt 2.2, and these extensions +lead to a new interface. This interface is used mainly by translation +tools (for example, \link linguist-manual.book Qt +Linguist \endlink). For source compatibility, no member function was +effectively removed. The \l QTranslator documentation points out +which functions are obsolete. + +This function is no longer virtual: + +\list +\i QString QTranslator::find( const char * context, + const char * sourceText ) const +\endlist + +If you have a class that inherits QTranslator and which reimplements +QTranslator::find(), you should reimplement QTranslator::findMessage() instead. +In fact, find() is now defined in terms of findMessage(). By doing the +conversion, you will also gain support for translator comments and for any +future extensions. + +\section1 QWidget + +QWidget::backgroundColor(), QWidget::setBackgroundColor(), +QWidget::backgroundPixmap() and QWidget::setBackgroundPixmap() have +often been the source of much confusion in previous releases. Qt 3.0 +addresses this by obsoleting these functions and by replacing them +with eight new functions: QWidget::eraseColor(), +QWidget::setEraseColor(), QWidget::erasePixmap(), +QWidget::setErasePixmap(), QWidget::paletteBackgroundColor(), +QWidget::setPaletteBackgroundColor(), +QWidget::paletteBackgroundPixmap() and +QWidget::setPaletteBackgroundPixmap(). See their documentation for +details. + +\section1 QXml Classes + +\section2 QXmlInputSource + +The semantics of QXmlInputSource has changed slightly. This change +only affects code that parses the same data from the same input source +multiple times. In such cases you must call +QXmlInputSource::reset() before the second call to +QXmlSimpleReader::parse(). + +So code like +\code + QXmlInputSource source( &xmlFile ); + QXmlSimpleReader reader; + ... + reader.parse( source ); + ... + reader.parse( source ); +\endcode +must be changed to +\code + QXmlInputSource source( &xmlFile ); + QXmlSimpleReader reader; + ... + reader.parse( source ); + ... + source.reset(); + reader.parse( source ); +\endcode + +\section2 QXmlLocator + +Due to some internal changes, it was necessary to clean-up the semantics of +QXmlLocator: this class is now an abstract class. This shouldn't cause +any problems, since programmers usually used the QXmlLocator that was +reported by QXmlContentHandler::setDocumentLocator(). If you used this +class in some other way, you must adjust your code to use the +QXmlLocator that is reported by the +QXmlContentHandler::setDocumentLocator() function. + +\section1 Asynchronous I/O Classes + +QASyncIO, QDataSink, QDataSource, QIODeviceSource and QDataPump were +used internally in previous versions of Qt, but are not used anymore. +They are now obsolete. + +\section1 Transparent widgets + +In Qt 2.x, the AutoMask property was used to obtain a +transparent-looking widget. In general, this approach is slow and +processor hungry. Qt 3.0 uses the BackgroundOrigin which provides +vastly improved performance and more flexibility in most cases. The +few classes for which the AutoMask property is still the best approach +are QCheckBox, QComboBox, QPushButton, QRadioButton and QTabWidget. + +\section1 Bezier Curves + +The function names for Bezier curves in QPainter and QPointArray have +been corrected. They now properly reflect their cubic form instead of +a quadratic one. If you have been using either +QPainter::drawQuadBezier() or QPointArray::quadBezier() you must +replace these calls with +\list +\i void QPainter::drawCubicBezier( const QPointArray \&, int index=0 ) and +\i QPointArray QPointArray::cubicBezier() const +\endlist +respectively. Neither the arguments nor the resulting curve have changed. + +\section1 Locale-aware String Comparisons in QIconView, QListBox, + QListView and QTable + +In Qt 2.x, QString only provided string comparisons using the Unicode +values of the characters of a string. This is efficient and reliable, +but it is not the appropriate order for most languages. For example, +French users expect 'é' (e acute) to be treated essentially as +'e' and not put after 'z'. + +In Qt 3.0, QString::localeAwareCompare() implements locale aware +string comparisions on certain platforms. The classes \l QIconView, \l +QListBox, \l QListView and \l QTable now use +QString::localeAwareCompare() instead of QString::compare(). If you +want to control the behaviour yourself you can always reimplement +QIconViewItem::compare(), QListBox::text(), QListViewItem::compare() +or QTableItem::key() as appropriate. + +*/ -- cgit v1.2.3