summaryrefslogtreecommitdiffstats
path: root/doc/src/porting4.qdoc
diff options
context:
space:
mode:
Diffstat (limited to 'doc/src/porting4.qdoc')
-rw-r--r--doc/src/porting4.qdoc4231
1 files changed, 0 insertions, 4231 deletions
diff --git a/doc/src/porting4.qdoc b/doc/src/porting4.qdoc
deleted file mode 100644
index 4efb7be32..000000000
--- a/doc/src/porting4.qdoc
+++ /dev/null
@@ -1,4231 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the either Technology Preview License Agreement or the
-** Beta Release License Agreement.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain
-** additional rights. These rights are described in the Nokia Qt LGPL
-** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
-** package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-** If you are unsure which license is appropriate for your use, please
-** contact the sales department at http://qt.nokia.com/contact.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
- \page porting4.html
- \title Porting to Qt 4
- \contentspage {Porting Guides}{Contents}
- \previouspage Porting Guides
- \nextpage Porting to Qt 4 - Virtual Functions
- \ingroup porting
- \brief An overview of issues and techniques to consider when porting from Qt 3 to Qt 4.
-
-\omit
- ### QFileInfo::PermissionSpec -> QFile::Permission(s?)
- ### refer to porting4-renamedfunctions.qdoc
- ### QApplication library mutex is gone
- ### no integral conversion for containers? strings?
- ### QVector etc. are initialized to 0 by default?
- ### How to port from Qt 2.3 to Qt 4.
- ### missing sort() functions?
- ### QToolTipGroup
- ### QServerSocket -> Q3ServerSocket
-
- ### remove these when the classes are re-ported
-
- ### QApplication::eventLoop()
-
- \row \o void QCheckListItem::paintCell(QPainter *, const QColorGroup &, int, int, int)\row \o void Q3CheckListItem::paintCell(QPainter *, const QPalette &, int, int, int)
- \row \o void QCheckListItem::paintFocus(QPainter *, const QColorGroup &, const QRect &) \o void Q3CheckListItem::paintFocus(QPainter *, const QPalette &, const QRect &)
- \row \o QDataTable: a whole bunch of virtual functions have a different signature
-
- < Function: void QIconViewItem::paintFocus(QPainter *, const QColorGroup &)
- > Function: void QIconViewItem::paintFocus(QPainter *, const QPalette &)
-
- < Function: void QIconViewItem::paintItem(QPainter *, const QColorGroup &)
- > Function: void QIconViewItem::paintItem(QPainter *, const QPalette &)
-
- < Function: bool QUrlOperator::checkValid()
-
- < Function: void QWSInputMethod::setFont(const QFont &)
-
- ### OpenMode or OpenMode
-
- ### QWSDecoration
-\endomit
-
- This document describes the process of porting applications from
- Qt 3 to Qt 4.
- If you haven't yet made the decision about porting, or are unsure
- about whether it is worth it, take a look at the \l{What's New in
- Qt 4}{key features} offered by Qt 4. See also
- \l{Moving from Qt 3 to Qt 4} for tips on how to write Qt 3 code
- that is easy to port to Qt 4.
-
- \bold{Other porting guides:}
-
- \list
- \o \l{Moving from Qt 3 to Qt 4} \mdash covers some high level topics relevant
- to developers porting from Qt 3 to Qt 4.
- \o \l{Porting to Qt 4 - Drag and Drop} \mdash covers differences in the
- way drag and drop is handled between Qt 3 and Qt 4.
- \o \l{Porting UI Files to Qt 4} \mdash describes the new format used to
- describe forms created with \QD.
- \o \l{Porting to Graphics View} \mdash provides a class-by-class overview
- of the differences between Qt 3's canvas API and Qt 4's Graphics
- View framework.
- \o \l{qt3to4 - The Qt 3 to 4 Porting Tool} \mdash provides an overview
- of a tool aimed at helping developers start the process of porting an
- application to Qt 4.
- \endlist
-
- The Qt 4 series is not binary compatible with the 3 series. This
- means programs compiled for Qt 3 must be recompiled to work with
- Qt 4. Qt 4 is also not completely \e source compatible with 3,
- however nearly all points of incompatibility cause compiler
- errors or run-time messages (rather than mysterious results). Qt
- 4 includes many additional features and discards obsolete
- functionality. Porting from Qt 3 to Qt 4 requires some effort,
- but once completed the considerable additional power and
- flexibility of Qt 4 is available for use in your applications.
-
- To port code from Qt 3 to Qt 4:
-
- \list 1
-
- \o Briefly read the porting notes below to get an idea of what to expect.
-
- \o Be sure that your code compiles and runs well on all your target
- platforms with Qt 3.
-
- \o Add the line \c{QT += qt3support} to your \c .pro file if you use
- \c qmake; otherwise, edit your makefile or project file to
- link against the Qt3Support library and add \c -DQT3_SUPPORT to your
- compiler flags. (You might also need to specify other
- libraries. See \l{What's New in Qt 4} for details.)
-
- \o Run the \l qt3to4 porting tool. The tool will go through your
- source code and adapt it to Qt 4.
-
- \o Follow the instructions in the \l{Porting UI Files to Qt 4}
- page to port Qt Designer files.
-
- \o Recompile with Qt 4. 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.
-
- \endlist
-
- The \l qt3to4 porting tool replaces occurrences of Qt 3 classes
- that don't exist anymore in Qt 4 with the corresponding Qt 3
- support class; for example, \c QListBox is turned into \c
- Q3ListBox.
-
- At some point, you might want to stop linking against the Qt 3
- support library (\l{Qt3Support}) and take advantage of Qt 4's
- new features. The instructions below explain how to do that for
- each compatibility class.
-
- In addition to the Qt3Support classes (such as \c Q3Action, \c
- Q3ListBox, and \c Q3ValueList), Qt 4 provides compatibility
- functions when it's possible for an old API to cohabit with the
- new one. For example, QString provides a
- QString::simplifyWhiteSpace() compatibility function that's
- implemented inline and that simply calls QString::simplified().
- \bold{The compatibility functions are not documented here; instead,
- they are documented for each class.}
-
- If you have the line \c{QT += qt3support} in your \c .pro file, \c
- qmake will automatically define the \c QT3_SUPPORT symbol, turning
- on compatibility function support. You can also define the symbol
- manually (e.g., if you don't want to link against the \c
- Qt3Support library), or you can define \c QT3_SUPPORT_WARNINGS
- instead, telling the compiler to emit a warning when a
- compatibility function is called. (This works only with GCC 3.2+
- and MSVC 7.)
-
- If you get stuck, ask on the
- \l{http://qt.nokia.com/lists/qt-interest/}{qt-interest}
- mailing list. If you are a licensed customer, you can also contact
- Qt's technical support team.
-
-\omit
- ### what to do with slots that aren't slots anymore
- ### what to do with virtual functions that aren't virtual anymore
- ### what to do with virtual functions that changed signature
-\endomit
-
-\omit
- ### <qtl.h> -- stuff that vanished?
- ### implicit sharing
- ### uint -> int indexes
-\endomit
-
- Table of contents:
-
- \tableofcontents{4}
-
-\omit
- \section1 Header Files
-
- ### New style of headers
-
- \table
- \header \o Old header \o New header
- \row \o \c{<qtl.h>} \o \c{<qalgorithms.h>} or \c{<QtAlgorithms>}
- \endtable
-
- ### Some headers don't include each other anymore...
-\endomit
-
- \section1 Casting and Object Types
-
- In Qt 3, it was possible to use the \c qt_cast() function to determine
- whether instances of QObject subclasses could be safely cast to derived
- types of those subclasses. For example, if a QFrame instance is passed
- to a function whose signature specifies a QWidget pointer as its argument,
- \c qt_cast() could be used to obtain a QFrame pointer so that the
- instance's functions can be accessed.
-
- In Qt 4, much of this functionality is provided by the qobject_cast()
- function, and additional functions also provide similar functionality for
- certain non-QObject types:
-
- \table
- \header \o Qt 3 function \o Qt 4 function
- \row \o T *qt_cast<T *>(QObject *) \o \l{qobject_cast()}{T *qobject_cast<T *>(QObject *)}
- \row \o \o \l{qgraphicsitem_cast()}{T qgraphicsitem_cast<T>(QGraphicsItem *)}
- \row \o \o \l{qstyleoption_cast()}{T qstyleoption_cast<T>(QStyleOption *)}
- \row \o \o \l{qvariant_cast()}{T qvariant_cast<T>(const QVariant &)}
- \row \o \o \l{qdbus_cast()}{T qdbus_cast(const QDBusArgument &)}
- \endtable
-
-\omit
- \section1 Global Functions
-
- \table
- \header \o Qt 3 function \o Qt 4 function
- \row \o cstrcmp() \o strcmp()
- \row \o cstrcpy() \o strcpy()
- \row \o cstrlen() \o strlen()
- \row \o cstrncmp() \o strncmp()
- \row \o qmemmove() \o memmove()
- \endtable
-
- qGLVersion() ###
-
- copyBlt() ###
- bitBlt()
-
- #ifdef compat classes:
- * QLayoutIterator
- * QColorGroup
- * QMenuItem
-
- QWidget visibleRect property compat
- QWidget::BackgroundOrigin compat
-\endomit
-
- \section1 Type Names
-
- The table below lists the classes that have been renamed in Qt 4.
- If you compile your applications with \c QT3_SUPPORT defined, the
- old names will be available.
-
- Whenever you see an occurrence of the name on the left, you can
- safely replace it with the Qt 4 equivalent in your program. The
- \l qt3to4 tool performs the conversion automatically.
-
- \table
- \header \o Qt 3 class name \o Qt 4 class name
- \input porting4-renamedclasses.qdocinc
- \endtable
-
- The table below lists the enums and typedefs that have been
- renamed in Qt 4. If you compile your applications with \c
- QT3_SUPPORT defined, the old names will be available.
-
- Whenever you see an occurrence of the name on the left, you can
- safely replace it with the Qt 4 equivalent in your program. The
- \l qt3to4 tool performs the conversion
- automatically.
-
- \table
- \header \o Qt 3 type name \o Qt 4 type name
- \input porting4-renamedtypes.qdocinc
- \endtable
-
- \omit
- ###
- \row \o QButton::ToggleState \o Use QCheckBox::ToggleState instead.
- \endomit
-
- \section1 Enum Values
-
- The table below lists the enum values that have been renamed in
- Qt 4. If you compile your applications with \c QT3_SUPPORT defined,
- the old names will be available.
-
- Whenever you see an occurrence of the name on the left, you can
- safely replace it with the Qt 4 equivalent in your program. The
- \l qt3to4 tool performs the conversion automatically.
-
- \table
- \header \o Qt 3 enum value name \o Qt 4 enum value name
- \input porting4-renamedenumvalues.qdocinc
- \endtable
-
- In addition, the following \l{Qt::WindowFlags}{window flags} have
- been either replaced with \l{Qt::WidgetAttribute}{widget
- attributes} or have been deprecated:
-
- \table
- \header \o Qt 3 type \o Qt 4 equivalent
- \row \o Qt::WDestructiveClose \o Use QWidget::setAttribute(Qt::WA_DeleteOnClose) instead.
- \row \o Qt::WStaticContents \o{1,2} Use QWidget::setAttribute(Qt::WA_StaticContents) instead.
- \row \o Qt::WNorthWestGravity
- \row \o Qt::WNoAutoErase \o{1,3} Use QWidget::setAttribute(Qt::WA_NoBackground) instead.
- \row \o Qt::WResizeNoErase
- \row \o Qt::WRepaintNoErase
- \row \o Qt::WPaintClever \o Unnecessary in Qt 4.
- \omit ### Check with Matthias \endomit
- \row \o Qt::WMacNoSheet \o Unnecessary in Qt 4.
- \omit ### Check with Sam \endomit
- \endtable
-
- In Qt 4.1, the widget flags used to determine window modality were
- replaced by a single enum that can be used to specify the modal
- behavior of top-level widgets:
-
- \table
- \header \o Qt 3 type \o Qt 4 equivalent
- \row \o Qt::WShowModal \o Use QWidget::setWindowModality(Qt::ApplicationModal) instead.
- \row \o Qt::WGroupLeader \o Use QWidget::setWindowModality(Qt::WindowModal)
- for each child dialog of the group leader, but do not change the modality
- of the group leader itself.
- \endtable
-
- \target properties
- \section1 Properties
-
- Some properties have been renamed in Qt 4, to make Qt's API more
- consistent and more intuitive. For example, QWidget's \c caption
- property has been renamed \c windowTitle to make it clear that it
- refers to the title shown in the window's title bar.
-
- In addition, the property system has been extended to allow
- properties to be redefined in subclasses with the \l Q_PROPERTY()
- macro, removing the need for a \c Q_OVERRIDE() macro.
-
- The table below lists the Qt properties that have been renamed in
- Qt 4. Occurrences of these in \e{Qt Designer} UI files are
- automatically converted to the new name by \c uic.
-
- \table
- \header \o Qt 3 name \o Qt 4 name
- \row \o QButton::accel \o QButton::shortcut
- \row \o QButton::on \o QButton::checked
- \row \o QButton::toggleButton \o QAbstractButton::checkable
- \row \o QDial::lineStep \o QDial::singleStep
- \row \o QDial::maxValue \o QDial::maximum
- \row \o QDial::minValue \o QDial::minimum
- \row \o QDialog::modal \o QDialog::isModal
- \row \o QLineEdit::edited \o QLineEdit::modified
- \row \o QLineEdit::hasMarkedText \o QLineEdit::hasSelectedText
- \row \o QLineEdit::markedText \o QLineEdit::selectedText
- \row \o QObject::name \o QObject::objectName
- \row \o QProgressDialog::progress \o QProgressDialog::value
- \row \o QProgressDialog::totalSteps \o QProgressDialog::maximum
- \row \o QProgressDialog::wasCancelled \o QProgressDialog::wasCanceled
- \row \o QPushButton::iconSet \o QPushButton::icon
- \row \o QScrollBar::draggingSlider \o QScrollBar::sliderDown
- \row \o QScrollBar::lineStep \o QScrollBar::singleStep
- \row \o QScrollBar::maxValue \o QScrollBar::maximum
- \row \o QScrollBar::minValue \o QScrollBar::minimum
- \row \o QSlider::lineStep \o QSlider::singleStep
- \row \o QSlider::maxValue \o QSlider::maximum
- \row \o QSlider::minValue \o QSlider::minimum
- \row \o QSpinBox::lineStep \o QSpinBox::singleStep
- \row \o QSpinBox::maxValue \o QSpinBox::maximum
- \row \o QSpinBox::minValue \o QSpinBox::minimum
- \row \o QTabBar::currentTab \o QTabBar::currentIndex
- \row \o QTabWidget::currentPage \o QTabWidget::currentWidget
- \row \o QToolButton::iconSet \o QToolButton::icon
- \row \o QToolButton::textLabel \o QToolButton::text
- \row \o QWidget::caption \o QWidget::windowTitle
- \row \o QWidget::icon \o QWidget::windowIcon
- \row \o QWidget::iconText \o QWidget::windowIconText
- \endtable
-
- A handful of properties in Qt 3 are no longer properties in Qt 4,
- but the access functions still exist as part of the Qt 4 API.
- These are not used by \e{Qt Designer}; the only case where you
- need to worry about them is in highly dynamic applications that
- use Qt's meta-object system to access properties. Here's the list
- of these properties with the read and write functions that you
- can use instead:
-
- \table
- \header \o Qt 3 property \o Qt 4 read function \o Qt 4 write function
- \row \o QSqlDatabase::connectOptions \o QSqlDatabase::connectOptions() \o QSqlDatabase::setConnectOptions()
- \row \o QSqlDatabase::databaseName \o QSqlDatabase::databaseName() \o QSqlDatabase::setDatabaseName()
- \row \o QSqlDatabase::hostName \o QSqlDatabase::hostName() \o QSqlDatabase::setHostName()
- \row \o QSqlDatabase::password \o QSqlDatabase::password() \o QSqlDatabase::setPassword()
- \row \o QSqlDatabase::port \o QSqlDatabase::port() \o QSqlDatabase::setPort()
- \row \o QSqlDatabase::userName \o QSqlDatabase::userName() \o QSqlDatabase::setUserName()
- \endtable
-
- Some properties have been removed from Qt 4, but the associated
- access functions are provided if \c QT3_SUPPORT is defined to help
- porting to Qt 4. When converting Qt 3 UI files to Qt 4, \c uic
- generates calls to the Qt 3 compatibility functions. Note that
- this only applies to the properties of the Qt3Support library,
- i.e. \c QT3_SUPPORT properties of the other libraries must be
- ported manually when converting Qt 3 UI files to Qt 4.
-
- The table below lists these properties with the read and write
- functions that you can use instead. The documentation for the
- individual functions explains how to replace them with
- non-compatibility Qt 4 functions.
-
- \table
- \header \o Qt 3 property \o Qt 4 read function (\c QT3_SUPPORT)\o Qt 4 write function (\c QT3_SUPPORT)
- \row \o QMenuBar::separator \o QMenuBar::separator() \o QMenuBar::setSeparator()
- \row \o QPushButton::menuButton \o QPushButton::isMenuButton() \o N/A
- \row \o QTabWidget::margin \o QTabWidget::margin() \o QTabWidget::setMargin()
- \row \o QTextEdit::textFormat \o QTextEdit::textFormat() \o QTextEdit::setTextFormat()
- \row \o QWidget::backgroundBrush \o QWidget::backgroundBrush() \o N/A
- \row \o QWidget::backgroundMode \o QWidget::backgroundMode() \o QWidget::setBackgroundMode()
- \row \o QWidget::backgroundOrigin \o QWidget::backgroundOrigin() \o QWidget::setBackgroundOrigin()
- \row \o QWidget::colorGroup \o QWidget::colorGroup() \o QWidget::setColorGroup()
- \row \o QWidget::customWhatsThis \o QWidget::customWhatsThis() \o QWidget::setCustomWhatsThis()
- \row \o QWidget::inputMethodEnabled \o QWidget::inputMethodEnabled() \o QWidget::setInputMethodEnabled()
- \row \o QWidget::ownCursor \o QWidget::ownCursor() \o N/A
- \row \o QWidget::ownFont \o QWidget::ownFont() \o N/A
- \row \o QWidget::ownPalette \o QWidget::ownPalette() \o N/A
- \row \o QWidget::paletteBackgroundColor \o QWidget::paletteBackgroundColor() \o QWidget::setPaletteBackgroundColor()
- \row \o QWidget::paletteBackgroundPixmap \o QWidget::paletteBackgroundPixmap() \o QWidget::setPaletteBackgroundPixmap()
- \row \o QWidget::paletteForegroundColor \o QWidget::paletteForegroundColor() \o QWidget::setPaletteForegroundColor()
- \row \o QWidget::underMouse \o QWidget::underMouse() \o N/A
- \endtable
-
- The following Qt 3 properties and their access functions are no
- longer available in Qt 4. In most cases, Qt 4 provides similar
- functionality.
-
- \table
- \header \o Qt 3 property \o Qt 4 equivalent
- \row \o QButton::autoRepeat \o N/A
- \row \o QButton::autoResize \o Call QWidget:setFixedSize(QWidget::sizeHint()) whenever you change the contents.
- \row \o QButton::exclusiveToggle \o See \l QAbstractButton::autoExclusive.
- \row \o QButton::pixmap \o Use QAbstractButton::icon instead.
- \row \o QButton::toggleState \o Use QCheckBox::setState() and QCheckBox::state() instead.
- \row \o QButton::toggleType \o Use QCheckBox::setTristate() instead.
- \row \o QComboBox::autoResize \o Call QWidget:setFixedSize(QWidget::sizeHint()) whenever you change the contents.
- \row \o QFrame::contentsRect \o Use Q3Frame::contentsRect() instead.
- \row \o QFrame::margin \o Use QWidget::setContentsMargins() instead.
- \row \o QTabBar::keyboardFocusTab \o N/A
- \row \o QToolButton::offIconSet \o Use the \l{QIcon::Off}{off component} of QAbstractButton::icon instead.
- \row \o QToolButton::onIconSet \o Use the \l{QIcon::On}{on component} of QAbstractButton::icon instead.
- \row \o QWidget::microFocusHint \o N/A
- \row \o QMimeSource::serialNumber () \o N/A
- \endtable
-
-\omit
- \section1 Inheritance Chain
-
- ### QMenuBar, etc.
-
- \section1 Null vs. Empty
-
- ###
-\endomit
-
- \section1 Explicit Sharing
-
- Qt 4 is the first version of Qt that contains no \link
- http://qt.nokia.com/doc/3.3/shclass.html explicitly shared
- \endlink classes. All classes that were explicitly shared in Qt 3
- are \e implicitly shared in Qt 4:
-
- \list
- \o QImage
- \o QBitArray
- \o QByteArray
- \o Q3PointArray
- \endlist
-
- This means that if you took a copy of an instance of the class
- (using operator=() or the class's copy constructor), any
- modification to the copy would affect the original and vice
- versa. Needless to say, this behavior is rarely desirable.
-
- Fortunately, nearly all Qt 3 applications don't rely on explicit
- sharing. When porting, you typically only need to remove calls to
- detach() and/or copy(), which aren't necessary anymore.
-
- If you deliberately rely on explicit sharing in your application,
- you can use pointers or references to achieve the same result in
- Qt 4.
-
- \oldcode
- void asciify(QByteArray array)
- {
- for (int i = 0; i < (int)array.size(); ++i) {
- if ((uchar)array[i] >= 128)
- array[i] = '?';
- }
- }
- \newcode
- void asciify(QByteArray &array)
- {
- for (int i = 0; i < array.size(); ++i) {
- if ((uchar)array[i] >= 128)
- array[i] = '?';
- }
- }
- \endcode
-
- (Notice the \c & in the parameter declaration.)
-
-\omit
- \section1 Qt Designer UI Files
-
- ###
-\endomit
-
- \section1 Painting and Redrawing Widgets
-
- When implementing custom widgets in Qt 3, it was possible to use
- QPainter to draw on a widget outside paint events. This made it
- possible to integrate Qt applications with third party libraries
- and tools that impose their own rendering models. For example,
- a widget might be repainted in a slot using data obtained from
- an external source.
-
- In Qt 4, it is only possible to paint on a widget from within its
- \l{QWidget::}{paintEvent()} handler function. This restriction simplifies
- Qt's interaction with native window systems, improves the performance
- of applications by reducing the number of redraw operations, and
- also enables features to be implemented to improve the appearance of
- widgets, such as a backing store.
-
- Generally, we recommend redesigning applications to perform all
- painting operations in \l{QWidget::}{paintEvent()} functions, deferring
- actual painting until the next time this function is called.
- Applications can post paint events to trigger repaints, and it may be
- possible to examine your widget's internal state to determine which
- part of the widget needs to be repainted.
-
- If asynchronous repaints are used extensively by your application,
- and it is not practical to redesign the rendering model to perform
- all painting operations from within a widget's \l{QWidget::}{paintEvent()}
- function, it may be necessary to consider using an intermediate painting
- step. In this approach, one or more images can be updated asynchronously
- and painted on the widget in the paint event. To avoid excessive
- buffering, it may be worthwhile disabling the backing store by setting
- the widget's Qt::WA_PaintOnScreen widget attribute.
-
- On certain platforms, the Qt::WA_PaintOutsidePaintEvent widget attribute
- can be set to allow a widget to be painted from outside paint events.
-
- \note Setting widget attributes to disable key features of Qt's widget
- rendering model may also cause other features to be disabled.
-
- \section1 Compatibility Signals and Slots
-
- When \c QT3_SUPPORT is defined, the default connection type for signals
- and slots is the Qt::AutoCompatConnection type. This allows so-called
- \e compatibility signals and slots (defined in Qt 3 support mode to provide
- Qt 3 compatibility features) to be connected to other signals and
- slots.
-
- However, if Qt is compiled with debugging output enabled, and the
- developer uses other connection types to connect to compatibility
- signals and slots (perhaps by building their application without Qt 3
- support enabled), then Qt will output warnings to the console to
- indicate that compatibility connections are being made. This is intended
- to be used as an aid in the process of porting a Qt 3 application to Qt 4.
-
- \section1 QAccel
-
- The \c QAccel class has been renamed Q3Accel and moved to the
- Qt3Support module. In new applications, you have three options:
-
- \list 1
- \o You can use QAction and set a key sequence using QAction::setShortcut().
- \o You can use QShortcut, a class that provides similar
- functionality to Q3Accel.
- \o You can use QWidget::grabShortcut() and process "shortcut"
- events by reimplementing QWidget::event().
- \endlist
-
- The Q3Accel class also supports multiple accelerators using the
- same object, by calling Q3Accel::insertItem() multiple times. In
- Qt 4, the solution is to create multiple QShortcut objects.
-
- \section1 QAccessibleInterface
-
- The QAccessibleInterface class has undergone some API changes in
- Qt 4, to make it more consistent with the rest of the Qt API.
-
- If you have classes that inherit QAccessibleInterface or one of
- its subclasses (QAccessibleObject, QAccessibleWidget, etc.), you
- must port them the new QAccessibleInterface API.
-
- See \l{Porting to Qt 4 - Virtual Functions}{Virtual Functions}
- for a list of QAccessibleInterface virtual member functions in
- Qt 3 that are no longer virtual in Qt 4.
-
- \section1 QAccessibleTitleBar
-
- The \c QAccessibleTitleBar has been renamed Q3AccessibleTitleBar
- and moved to the Qt3Support library.
-
- \target qaction.section
- \section1 QAction
-
- The QAction class has been redesigned in Qt 4 to integrate better
- with the rest of the menu system. It unifies the old \c QMenuItem
- class and the old \c QAction class into one class, avoiding
- unnecessary data duplication and the need to learn two different
- APIs.
-
- The old \c QAction and \c QActionGroup classes have been renamed
- Q3Action and Q3ActionGroup and moved to Qt3Support. In addition,
- the new QAction class has compatibility functions to ease
- transition to Qt 4. Note that when using Q3ToolBar and
- Q3PopupMenu, their actions must be \l {Q3Action}s.
-
- See \l{Porting to Qt 4 - Virtual Functions}{Virtual Functions}
- for a list of QAction virtual member functions in Qt 3 that are
- no longer virtual in Qt 4.
-
- \section1 QActionGroup
-
- The QAction class has been completely redesigned in Qt 4 to
- integrate better with the rest of the menu system. See the
- \l{#qaction.section}{section on QAction} for details.
-
- \section1 QApplication
-
- The QApplication class has been split into two classes:
- QCoreApplication and QApplication. The new QApplication class
- inherits QCoreApplication and adds GUI-related functionality. In
- practice, this has no consequences for existing Qt applications.
-
- In addition, the following API changes were made:
-
- \list 1
- \o QApplication::allWidgets() and QApplication::topLevelWidgets()
- used to return a pointer to a QWidgetList. Now they return a
- QWidgetList.
-
- Also, QWidgetList has changed from being a typedef for
- QPtrList<QWidget> to being a typedef for QList<QWidget *>.
- See the \l{#qwidgetlist.section}{section on QWidgetList} below
- for details.
-
- \oldcode
- QWidgetList *list = QApplication::topLevelWidgets();
- QWidgetListIt it(*list);
- QWidget *widget;
- while ((widget = it.current())) {
- if (widget->inherits("MainWindow"))
- ((MainWindow *)widget)->updateRecentFileItems();
- ++it;
- }
- delete list;
- \newcode
- QWidgetList list = QApplication::topLevelWidgets();
- for (int i = 0; i < list.size(); ++i) {
- if (MainWindow *mainWin = qobject_cast<MainWindow *>(list.at(i)))
- mainWin->updateRecentFileItems();
- }
- \endcode
- \o QApplication::setMainWidget() is no longer used. When all an application's
- windows are closed, the application will exit normally.
- \endlist
-
- \section1 QAquaStyle
-
- The \c QAquaStyle class first appeared in Qt 3.0, when the Qt for
- Mac OS X port was first released. It emulated Apple's "Aqua" theme.
- In Qt 3.1, QAquaStyle was obsoleted by QMacStyle, which uses Appearance
- Manager to perform its drawing.
-
- The \c QAquaStyle class is no longer provided in Qt 4. Use
- QMacStyle instead.
-
- \target qasciidict.section
- \section1 QAsciiCache<T>
-
- \c QAsciiCache<T> has been renamed Q3AsciiCache<T> and moved to
- the Qt3Support library. It has been replaced by
- QCache<QByteArray, T>.
-
- For details, read the \l{#qcache.section}{section on QCache<T>},
- mentally substituting QByteArray for QString.
-
- \section1 QAsciiDict<T>
-
- QAsciiDict<T> and QAsciiDictIterator<T> have been renamed
- Q3AsciiDict<T> and Q3AsciiDictIterator<T> and moved to the
- Qt3Support library. They have been replaced by the
- more modern QHash<Key, T> and QMultiHash<Key, T> classes and
- their associated iterator classes.
-
- When porting old code that uses Q3AsciiDict<T> to Qt 4, there are
- four classes that you can use:
-
- \list
- \o QMultiHash<QByteArray, T *>
- \o QMultiHash<QByteArray, T>
- \o QHash<QByteArray, T *>
- \o QHash<QByteArray, T>
- \endlist
-
- For details, read the \l{#qdict.section}{section on QDict<T>},
- mentally substituting QByteArray for QString.
-
- \section1 QAsyncIO
-
- The \c QAsyncIO class was used internally in Qt 2.x in
- conjunction with QImageConsumer. It was obsoleted in Qt 3.0.
-
- \input porting4-obsoletedmechanism.qdocinc
-
- \section1 QBackInsertIterator
-
- The undocumented \c QBackInsertIterator class has been removed
- from the Qt library. If you need it in your application, feel
- free to copy the source code from the Qt 3 \c <qtl.h> header
- file.
-
- \section1 QBitArray
-
- In Qt 3, QBitArray inherited from QByteArray. In Qt 4, QBitArray
- is a totally independent class. This makes very little difference
- to the user, except that the new QBitArray doesn't provide any of
- QByteArray's byte-based API anymore. These calls will result in a
- compile-time error, except calls to QBitArray::truncate(), whose
- parameter was a number of \e bytes in Qt 3 and a number of bits
- in Qt 4.
-
- QBitArray was an explicitly shared class in Qt 3. See \l{Explicit
- Sharing} for more information.
-
- The \c QBitVal class has been renamed QBitRef.
-
- \section1 QButton
-
- The \c QButton class has been replaced by QAbstractButton in Qt
- 4. Classes like QPushButton and QRadioButton inherit from
- QAbstractButton. As a help when porting older Qt applications,
- the Qt3Support library contains a Q3Button class
- implemented in terms of the new QAbstractButton.
-
- If you used the \c QButton class as a base class for your own
- button type and want to port your code to the newer
- QAbstractButton, you need to be aware that QAbstractButton has no
- equivalent for the Q3Button::drawButton(QPainter *) virtual
- function. The solution is to reimplement QWidget::paintEvent() in
- your QAbstractButton subclass as follows:
-
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 0
-
- \table
- \header \o Q3Button function \o QAbstractButton equivalent
- \row \o Q3Button::autoResize() \o Call QWidget:setFixedSize(QWidget::sizeHint()) whenever you change the contents.
- \row \o Q3Button::isExclusiveToggle() \o Use QAbstractButton::group() or QAbstractButton::autoExclusive() instead.
- \row \o Q3Button::pixmap() const \o QAbstractButton::icon()
- \row \o Q3Button::setAutoResize() \o N/A
- \row \o Q3Button::setPixmap(const QPixmap &) \o QAbstractButton::setIcon(const QIcon &)
- \row \o Q3Button::setState(ToggleState) \o See remark below
- \row \o Q3Button::setToggleType(ToggleType) \o See remark below
- \row \o Q3Button::state() \o See remark below
- \row \o Q3Button::stateChanged(int) \o See remark below
- \row \o Q3Button::toggleType() \o See remark below
- \endtable
-
- Remarks:
-
- \list 1
- \o In Qt 3, \c QButton had a "toggle type", which could be
- QButton::SingleShot, QButton::Toggle, or QButton::Tristate.
- The new QAbstractButton class doesn't support "tristate"
- directly; this feature is implemented in QCheckBox instead.
- The two other "toggle types" (\c QButton::SingleShot and \c
- QButton::Toggle) are replaced by a QAbstractButton::checkable
- property.
- \o In Qt 3, QButton had a "toggle state", which could be \c
- QButton::Off, \c QButton::NoChange, or \c QButton::On. In Qt
- 4, this mechanism has been moved to QCheckBox.
- \endlist
-
- See \l{Porting to Qt 4 - Virtual Functions}{Virtual Functions} for
- a list of \c QButton virtual member functions in Qt 3 that aren't
- virtual in Qt 4.
-
- See \l{#properties}{Properties} for a list of \c QButton properties
- in Qt 3 that have changed in Qt 4.
-
- \section1 QButtonGroup
-
- The \c QButtonGroup class has been completely redesigned in Qt 4.
- For compatibility, the old \c QButtonGroup class has been renamed
- Q3ButtonGroup and has been moved to Qt3Support.
- Likewise, the \c QHButtonGroup and \c QVButtonGroup convenience
- subclasses have been renamed \c Q3HButtonGroup and \c Q3VButtonGroup and
- moved to the Qt3Support library.
-
- The old \c QButtonGroup, as well as Q3ButtonGroup, can be used in two ways:
-
- \list 1
- \o The button group is the parent widget of a number of buttons,
- i.e. the button group is the parent argument in the button
- constructor. The buttons are assigned identifiers 0, 1, 2, etc.,
- in the order they are created. A Q3ButtonGroup can display a frame
- and a title because it inherits Q3GroupBox.
- \o The button group is an invisible widget and the contained
- buttons have some other parent widget. In this usage, each
- button must be manually inserted, using
- Q3ButtonGroup::insert(), into the button group and given an
- ID number.
- \endlist
-
- Unlike Q3ButtonGroup, the new QButtonGroup doesn't inherit
- QWidget. It is very similar to a "hidden Q3ButtonGroup".
-
- If you use a Q3ButtonGroup, Q3HButtonGroup, or Q3VButtonGroup as
- a widget and want to port to Qt 4, you can replace it with
- QGroupBox. In Qt 4, radio buttons with the same parent are
- automatically part of an exclusive group, so you normally don't
- need to do anything else. See also the
- \l{#qgroupbox.section}{section on QGroupBox} below.
-
- See \l{Porting to Qt 4 - Virtual Functions}{Virtual Functions} for
- a list of QButtonGroup virtual member functions in Qt 3 that are no
- longer virtual in Qt 4.
-
- \target qbytearray.section
- \section1 QByteArray
-
- In Qt 3, QByteArray was simply a typedef for QMemArray<char>. In
- Qt 4, QByteArray is a class in its own right, with a higher-level
- API in the style of QString.
-
- Here are the main issues to be aware of when porting to Qt 4:
-
- \list 1
- \o The QMemArray(int size) constructor has been replaced with
- QByteArray(int size, char ch). The second argument specifies
- which character should be used for initializing the array;
- pass '\\0' if you have no specific needs.
-
- \oldcode
- QByteArray ba(64);
- \newcode
- QByteArray ba(64, '\0');
- \endcode
-
- \o QMemArray::at() returned a non-const reference, whereas the
- new QByteArray::at() returns a const value. Code like
-
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 1
-
- will no longer compile. Instead, use QByteArray::operator[]:
-
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 2
-
- \o The QMemArray::contains(char) function has been renamed
- QByteArray::count(char). In addition, there now exists a
- QByteArray::contains(char) function that returns a boolean
- value. Replace old calls to contains() with either count() or
- contains(), depending on whether you care about the specific
- number of occurrences of a character in the byte array or
- only care about whether the array contains that character or
- not.
-
- \o The new QByteArray has no assign() function. Calls to
- QMemArray::assign(const QMemArray &) can be replaced by calls
- to QByteArray::operator=(). Calls to QMemArray::assign(const
- T *, uint) have no equivalent in Qt 4; if you use it, the
- solution is either to use QByteArray::fromRawData() and to
- call free() yourself to avoid a memory leak, or to use the
- QByteArray(const char *, int) constructor, which will take a
- deep copy of the data.
-
- \o QMemArray::bsearch() and QMemArray::sort() have no equivalent
- in the new QByteArray class. Use \l qBinaryFind() and \l qSort()
- if you need that functionality.
- \endlist
-
- QByteArray was an explicitly shared class in Qt 3. See
- \l{Explicit Sharing} for more information.
-
- \target qcache.section
- \section1 QCache<T>
-
- QCache<T> has been renamed Q3Cache<T> and moved to Qt3Support.
- The new QCache class has a different API, and takes different
- template parameters: QCache<Key, T>.
-
- When porting to Qt 4, QCache<QString, T> is the obvious
- substitute for Q3Cache<T>. The following table summarizes the API
- differences.
-
- \table
- \header \o Q3Cache<T> function \o QCache<QString, T> equivalent
- \row \o Q3Cache::Q3Cache(int maxCost, int size, bool caseSensitive) \o See remark below
- \row \o Q3Cache::autoDelete() \o N/A
- \row \o Q3Cache::count() \o QCache::count() or QCache::size() (equivalent)
- \row \o Q3Cache::setAutoDelete() \o See remark below
- \row \o Q3Cache::size() \o N/A
- \row \o Q3Cache::statistics() \o N/A
- \row \o Q3Cache::operator=() \o See remark below
- \endtable
-
- Remarks:
-
- \list 1
- \o Q3Cache requires the user to allocate a specific number of
- buckets by passing a prime number (17 by default) to the
- constructor. In contrast, the new QCache's hash table
- automatically grows and shrinks as needed, and the
- constructor doesn't take a prime number.
-
- \o Q3Cache supportes case-insensitive lookups by passing false as
- second argument to the constructor. This feature has no
- equivalent in QMultiHash. Instead, call QString::toLower()
- before you insert or lookup a key in the hash.
-
- \o The Q3Cache::insert() function returns a \c bool value that
- indicates whether or not the item actually was inserted in
- the cache. If the item wasn't inserted, it was the caller's
- responsibility to delete the item. The new QCache::insert()
- function returns \c void and either adds it to the cache or
- deletes it right away. Old code like
-
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 3
-
- becomes
-
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 4
-
- \o The new QCache class \e always takes ownership of the items
- it stores (i.e. auto-delete is always on). If you use Q3Cache
- with auto-delete turned off (the rarely useful default), you
- cannot use QCache as a direct substitute. One unelegant trick
- that works well in practice is to use QCache<QString, T *>
- instead of QCache<QString, T>. In that case, QCache owns the
- pointers, not the objects that the pointers refer to. For
- example,
-
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 5
-
- becomes
-
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 6
-
- An alternative is to stick to using Q3Cache.
- \endlist
-
- QCacheIterator<T> has been renamed Q3CacheIterator<T> and moved
- to the Qt3Support library. The new QCache class
- doesn't offer any iterator types.
-
- \section1 QCanvas
-
- The canvas module classes have been
- renamed and moved to the Qt3Support library.
-
- \table
- \header \o Qt 3 class name \o Compatibility class in Qt 4
- \row \o \c QCanvas \o Q3Canvas
- \row \o \c QCanvasEllipse \o Q3CanvasEllipse
- \row \o \c QCanvasItem \o Q3CanvasItem
- \row \o \c QCanvasItemList \o Q3CanvasItemList
- \row \o \c QCanvasLine \o Q3CanvasLine
- \row \o \c QCanvasPixmap \o Q3CanvasPixmap
- \row \o \c QCanvasPixmapArray \o Q3CanvasPixmapArray
- \row \o \c QCanvasPolygon \o Q3CanvasPolygon
- \row \o \c QCanvasPolygonalItem \o Q3CanvasPolygonalItem
- \row \o \c QCanvasRectangle \o Q3CanvasRectangle
- \row \o \c QCanvasSpline \o Q3CanvasSpline
- \row \o \c QCanvasSprite \o Q3CanvasSprite
- \row \o \c QCanvasText \o Q3CanvasText
- \row \o \c QCanvasView \o Q3CanvasView
- \endtable
-
- \l{The Graphics View Framework} replaces QCanvas. For more on porting to
- Graphics View, see \l{Porting to Graphics View}.
-
- \section1 QColor
-
- In Qt 4, QColor is a value type like QPoint or QRect. Graphics
- system-specific code has been implemented in QColormap.
-
- The \c QColor::maxColors() function has been replaced
- by QColormap::size().
-
- The \c QColor::numBitPlanes() function has been replaced
- by QColormap::depth().
-
- The \c QColor::setNamedColor() function no longer supports
- the named color in the same way as Qt 3. Qt 4's
- \l{QColor::}{setNamedColor()} uses the new W3C convention
- as stated
- \l{http://www.w3.org/TR/SVG/types.html#ColorKeywords}{here}.
-
- \table
- \header \o{4,1} Predefined Qt Colors
- \row \o Qt::color0 \o Qt::color1 \o Qt::black \o Qt::white
- \row \o Qt::darkGray \o Qt::gray \o Qt::lightGray \o Qt::red
- \row \o Qt::green \o Qt::blue \o Qt::cyan \o Qt::magenta
- \row \o Qt::yellow \o Qt::darkRed \o Qt::darkGreen \o Qt::darkBlue
- \row \o Qt::darkCyan \o Qt::darkMagenta \o Qt::darkYellow \o Qt::transparent
- \endtable
-
- The predefined colors listed in the table above were static
- QColor objects in Qt 3. In Qt 4, they are enum values of type
- Qt::GlobalColor. Thanks to the implicit QColor(Qt::GlobalColor)
- constructor, the enum values are automatically converted to
- \l{QColor}s in most contexts. Occasionally, you might need a
- cast.
-
- \oldcode
- QColor lightCyan = Qt::cyan.light(180);
- \newcode
- QColor lightCyan = QColor(Qt::cyan).light(180);
- \endcode
-
- \section1 QColorGroup
-
- In Qt 3, a QPalette consisted of three QColorGroup objects. In Qt
- 4, the (rarely used) QColorGroup abstraction has been eliminated.
- For source compatibility, a QColorGroup class is available when
- \c QT3_SUPPORT is defined.
-
- The new QPalette still works in terms of color groups, specified
- through enum values (QPalette::Active, QPalette::Disabled, and
- QPalette::Inactive). It also has the concept of a \e current
- color group, which you can set using
- QPalette::setCurrentColorGroup().
-
- The QPalette object returned by QWidget::palette() returns a
- QPalette initialized with the correct current color group for the
- widget. This means that if you had code like
-
- \badcode
- painter.setBrush(colorGroup().brush(QColorGroup::Text));
- \endcode
-
- you can simply replace colorGroup() with palette():
-
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 7
-
- \section1 QColorDrag
-
- The \c QColorDrag class has been renamed Q3ColorDrag and moved to
- the Qt3Support library. In Qt 4, use QMimeData
- instead and call QMimeData::setColor() to set the color.
-
- \section1 QComboBox
-
- In Qt 3, the list box used to display the contents of a \c QComboBox
- widget could be accessed by using the \c listBox() function. In Qt 4,
- the standard list box is provided by a QListView widget, and can be
- accessed with the \l{QComboBox::view()}{view()} function.
-
- \omit ### \endomit
-
- See \l{Porting to Qt 4 - Virtual Functions}{Virtual Functions} for
- a list of QComboBox virtual member functions in Qt 3 that are no longer
- virtual in Qt 4.
-
- \section1 QCString
-
- In Qt 3, QCString inherited from QByteArray. The main drawback
- of this approach is that the user had the responsibility of
- ensuring that the string is '\\0'-terminated. Another important
- issue was that conversions between \c QCString and QByteArray often
- gave confusing results. (See the
- \l{http://qt.nokia.com/doc/qq/qq05-achtung.html#qcstringisastringofchars}{Achtung!
- Binary and Character Data} article in \e{Qt Quarterly} for an
- overview of the pitfalls.)
-
- Qt 4 solves that problem by merging the QByteArray and \c QCString
- classes into one class called QByteArray. Most functions that
- were in \c QCString previously have been moved to QByteArray. The
- '\\0' issue is handled by having QByteArray allocate one extra
- byte that it always sets to '\\0'. For example:
-
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 8
-
- The Qt3Support library contains a class called
- Q3CString that inherits from the new QByteArray class and that
- extends it to provide an API that is as close to the old \c QCString
- class as possible. Note that the following functions aren't
- provided by Q3CString:
-
- \list
- \o QCString::find(const QRegExp &, int)
- \o QCString::findRev(const QRegExp &, int)
- \o QCString::contains(const QRegExp &)
- \o QCString::replace(const QRegExp &, const char *)
- \endlist
-
- The following functions have lost their last parameter, which
- specified whether the search was case sensitive or not:
-
- \list
- \o QByteArray::find(char, int)
- \o QByteArray::find(const char *, int)
- \o QByteArray::findRev(char, int)
- \o QByteArray::findRev(const char *, int)
- \o QByteArray::contains(char)
- \o QByteArray::contains(const char *)
- \endlist
-
- In both cases, the solution is to convert the \c QCString to a
- QString and use the corresponding QString functions instead.
-
- Also be aware that \c QCString::size() (inherited from
- QByteArray) used to return the size of the character data \e
- including the '\\0'-terminator, whereas the new
- QByteArray::size() is just a synonym for QByteArray::length().
- This brings QByteArray in line with QString.
-
- When porting to Qt 4, occurrences of \c QCString should be
- replaced with QByteArray or QString. The following table
- summarizes the API differences between the Q3CString
- class and the Qt 4 QByteArray and QString classes:
-
- \table
- \header \o Q3CString function \o Qt 4 equivalent
- \row \o Q3CString::Q3CString(const char *, uint) \o See remark below
- \row \o Q3CString::Q3CString(int) \o QByteArray::QByteArray(int, char)
- \row \o Q3CString::leftJustify() \o QString::leftJustified()
- \row \o Q3CString::length() \o QByteArray::length() or QByteArray::size() (equivalent)
- \row \o Q3CString::lower() \o QByteArray::toLower()
- \row \o Q3CString::rightJustify() \o QString::rightJustified()
- \row \o Q3CString::setExpand() \o See remark below
- \row \o Q3CString::simplifyWhiteSpace() \o QByteArray::simplified()
- \row \o Q3CString::sprintf() \o QString::sprintf()
- \row \o Q3CString::stripWhiteSpace() \o QByteArray::trimmed()
- \row \o Q3CString::toDouble() \o QString::toDouble()
- \row \o Q3CString::toFloat() \o QString::toFloat()
- \row \o Q3CString::toInt() \o QString::toInt()
- \row \o Q3CString::toLong() \o QString::toLong()
- \row \o Q3CString::toShort() \o QString::toShort()
- \row \o Q3CString::toUInt() \o QString::toUInt()
- \row \o Q3CString::toULong() \o QString::toULong()
- \row \o Q3CString::toUShort() \o QString::toUShort()
- \row \o Q3CString::upper() \o QByteArray::toUpper()
- \endtable
-
- Remarks:
-
- \list 1
- \o Q3CString(const char *str, uint max) constructs a string of
- length strlen(str) or \e max - 1, whichever is shorter.
- QByteArray(const char *data, int size) constructs a byte
- array containing exactly \e size bytes.
-
- \oldcode
- QCString str1("Hello", 4); // "Hel"
- QCString str2("Hello world!", n);
- \newcode
- QByteArray str1("Hello", 3);
- QByteArray str2("Hello world!");
- str2.truncate(n - 1);
- \endcode
-
- \o Q3CString::setExpand(uint index, char ch) has no equivalent in
- Qt 4.
-
- \oldcode
- QCString str("Hello world");
- str.setExpand(16, '\n'); // "Hello world \n"
- \newcode
- QByteArray str("Hello world");
- while (str.size() < 16)
- str += ' ';
- str += '\n';
- \endcode
- \endlist
-
- Since the old \c QCString class inherited from QByteArray,
- everything that is said in the \l{#qbytearray.section}{QByteArray
- section} applies for \c QCString as well.
-
- \section1 QCustomEvent
-
- In Qt 3, developers could create a custom event by constructing
- a new QCustomEvent, and send relevant data to other components in
- the application by passing a void pointer, either on construction or
- using the setData() function. Objects could receive custom events
- by reimplementing the \l{QObject::customEvent()}{customEvent()}
- function, and access the stored data using the event's data()
- function.
-
- In Qt 4, custom events are created by subclassing
- QEvent. Event-specific data can be stored in a way that is
- appropriate for your application. Custom events are still
- delivered to each object's
- \l{QObject::customEvent()}{customEvent()} handler function, but as
- QEvent objects rather than as deprecated QCustomEvent objects.
-
- \section1 QDataBrowser
-
- The \c QDataBrowser class has been renamed Q3DataBrowser and
- moved to the Qt3Support library. In Qt 4.2, you should use the
- QDataWidgetMapper class to create data-aware forms.
-
- See \l{QtSql Module} for an overview of the new SQL
- classes.
-
- \section1 QDataPump
-
- The \c QDataPump class was used internally in Qt 2.x in
- conjunction with QImageConsumer. It was obsoleted in Qt 3.0.
-
- \input porting4-obsoletedmechanism.qdocinc
-
- \section1 QDataSink
-
- The \c QDataSink class was used internally in Qt 2.x in conjunction
- with QImageConsumer. It was obsoleted in Qt 3.0.
-
- \input porting4-obsoletedmechanism.qdocinc
-
- \section1 QDataSource
-
- The \c QDataSource class was used internally in Qt 2.x in
- conjunction with QImageConsumer. It was obsoleted in Qt 3.0.
- \input porting4-obsoletedmechanism.qdocinc
-
- \section1 QDataTable
-
- The \c QDataTable class has been renamed Q3DataTable and moved to
- the Qt3Support library. In Qt 4.2, you should use the
- QDataWidgetMapper class to create data-aware forms.
-
- See \l{QtSql Module} for an overview of the new SQL classes.
-
- \section1 QDataView
-
- The \c QDataView class has been renamed Q3DataView and moved to
- the Qt3Support library. In Qt 4.2, you should use the
- QDataWidgetMapper class to create data-aware forms.
-
- See \l{QtSql Module} for an overview of the new SQL classes.
-
- \section1 QDateEdit
-
- The QDateEdit class in Qt 4 is a convenience class based on
- QDateTimeEdit. The old class has been renamed Q3DateEdit and moved
- to the Qt3Support library.
-
- See \l{Porting to Qt 4 - Virtual Functions}{Virtual Functions} for
- a list of \c QDateEdit virtual member functions in Qt 3 that are
- no longer virtual in Qt 4.
-
- \section1 QDateTimeEditBase
-
- The \c QDateTimeEditBase class has been renamed
- Q3DateTimeEditBase and moved to Qt3Support. Use QDateTimeEdit or
- QAbstractSpinBox instead.
-
- \section1 QDateTimeEdit
-
- The old \c QDateTimeEdit class has been renamed
- Q3DateTimeEditBase and moved to Qt3Support. The new QDateTimeEdit
- in Qt 4 has been rewritten from scratch to provide a more
- flexible and powerful API.
-
- See \l{Porting to Qt 4 - Virtual Functions}{Virtual Functions} for
- a list of QDateTimeEdit virtual member functions in Qt 3 that are no
- longer virtual in Qt 4.
-
- \section1 QDeepCopy<T>
-
- The \c QDeepCopy<T> class in Qt 3 provided a means of ensuring that
- implicitly shared and explicitly shared classes referenced unique
- data. This was necessary because the reference counting in Qt's
- container classes was done in a thread-unsafe manner.
-
- With Qt 4, \c QDeepCopy<T> has been renamed Q3DeepCopy<T> and
- moved to the Qt3Support library. Removing it from
- existing code is straightforward.
-
- \oldcode
- QString str1 = "I am a string";
- QDeepCopy<QString> str2 = str1;
- QString str3 = QDeepCopy<QString>(str2);
- \newcode
- QString str1 = "I am a string";
- QString str2 = str1;
- QString str3 = str2;
- \endcode
-
- \section1 QDial
-
- See \l{Porting to Qt 4 - Virtual Functions}{Virtual Functions} for
- a list of QDial virtual member functions in Qt 3 that are no longer
- virtual in Qt 4.
-
- See \l{#properties}{Properties} for a list of QDial properties in
- Qt 3 that have changed in Qt 4.
-
- \target qdict.section
- \section1 QDict<T>
-
- \c QDict<T> has been renamed Q3Dict<T> and moved to Qt3Support.
- It has been replaced by the more modern QHash<Key, T> and
- QMultiHash<Key, T> classes.
-
- When porting old code that uses QDict<T> to Qt 4, there are four
- classes that you can use:
-
- \table
- \header \o Qt 4 class \o When to use it
- \row \o QMultiHash<QString, T *>
-
- \o Since Q3Dict<T> is pointer-based and allows duplicate
- keys, this is usually the most straightforward conversion.
-
- \row \o QMultiHash<QString, T>
-
- \o If type \c T is an \l{assignable data type}, you can use
- \c T as the value type rather than \c{T *}. This often
- leads to nicer code.
-
- \row \o QHash<QString, T *>
-
- \o{1,2} If you don't use duplicate keys, you can use QHash
- instead of QMultiHash. QMultiHash inherits from QHash.
-
- \row \o QHash<QString, T>
- \endtable
-
- The APIs of Q3Dict<T> and QMultiHash<QString, T *> are quite
- similar. The main issue is that Q3Dict supports auto-delete
- whereas QMultiHash doesn't.
-
- \omit
- (See \l{What's Wrong with
- Auto-Delete} for an explanation of why the Qt 4 containers don't
- offer that feature.)
- \endomit
-
- The following table summarizes the API differences between the
- two classes:
-
- \table
- \header \o Q3Dict function \o QMultiHash equivalent
- \row \o Q3Dict::Q3Dict(int size, bool caseSensitive) \o See remarks below
- \row \o Q3Dict::autoDelete() \o N/A
- \row \o Q3Dict::count() \o QMultiHash::count() or QMultiHash::size() (equivalent)
- \row \o Q3Dict::find(const QString &) \o QMultiHash::value(const QString &)
- \row \o Q3Dict::remove(const QString &) \o QMultiHash::take(const QString &)
- \row \o Q3Dict::resize(uint) \o QMultiHash::reserve(int)
- \row \o Q3Dict::setAutoDelete() \o See discussion below
- \row \o Q3Dict::size() \o QMultiHash::capacity()
- \row \o Q3Dict::statistics() \o N/A
- \row \o Q3Dict::operator[](const QString &) \o See remark below
- \endtable
-
- Remarks:
-
- \list 1
- \o Q3Dict requires the user to allocate a specific number of
- buckets by passing a prime number (17 by default) to the
- constructor and/or calling Q3Dict::resize() later on. In
- contrast, QMultiHash's hash table automatically grows and
- shrinks as needed, and the constructor doesn't take a prime
- number.
-
- \o Q3Dict supportes case-insensitive lookups by passing false as
- second argument to the constructor. This feature has no
- equivalent in QMultiHash. Instead, call QString::toLower()
- before you insert or lookup a key in the hash.
-
- \o Q3Dict::size() and QMultiHash::size() have different semantics.
- The former returns the number of buckets in the container, whereas
- the latter returns the number of \e items in the container.
-
- \o If there are multiple items with the same key,
- Q3Dict::remove() removes only the most recently inserted item,
- whereas QMultiHash::remove() removes all items that share a
- particular key. To remove only the most recently inserted item,
- call QMultiHash::take().
-
- \o Q3Dict has only one [] operator (Q3Dict::operator[]()),
- providing const access to an item's value. QMultiHash also
- has a non-const overload that can be used on the left side of
- the assignment operator. If you use the [] operator on a
- non-const QHash with an unexisting item, QHash will created
- an element and initialize it to be a null pointer. For that
- reason, Q3Dict::operator[] should be converted to
- QMultiHash::value(), not QMultiHash::operator[].
-
- \endlist
-
- If you use Q3Dict's auto-delete feature (by calling
- Q3Dict::setAutoDelete(true)), you need to do some more work. You
- have two options: Either you call \c delete yourself whenever you
- remove an item from the container, or you use
- QMultiHash<QString, T> instead of QMultiHash<QString, T *> (i.e.
- store values directly instead of pointers to values). Here, we'll
- see when to call \c delete.
-
- The following table summarizes the idioms that you need to watch
- out for if you want to call \c delete yourself.
-
- \table
- \header \o Q3Dict idiom \o QMultiHash idiom
- \row
- \o
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 9
- \o
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 10
- \row
- \o
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 11
- \o
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 12
- \row
- \o
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 13
-
- (also called from Q3Dict's destructor)
-
- \o
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 14
-
- In 99% of cases, the following idiom also works:
-
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 15
-
- However, it may lead to crashes if \c hash is referenced from
- the value type's destructor, because \c hash contains
- dangling pointers until clear() is called.
- \endtable
-
- Be aware that Q3Dict's destructor automatically calls clear(). If
- you have a Q3Dict data member in a custom class and use the
- auto-delete feature, you will need to call \c delete on all the
- items in the container from your class destructor to avoid a
- memory leak.
-
- Finally, \c QDictIterator<T> (renamed Q3DictIterator<T>) must
- also be ported. There are no fewer than four iterator classes
- that can be used as a replacement: QHash::const_iterator,
- QHash::iterator, QHashIterator, and QMutableHashIterator. The
- most straightforward class to use when porting is
- QHashIterator<QString, T *>. The following table summarizes the
- API differences:
-
- \table
- \header \o Q3DictIterator functions \o Qt 4 equivalent
- \row \o Q3DictIterator::count() \o QHash::count() or QHash::size()
- \row \o Q3DictIterator::current() \o QHashIterator::value()
- \row \o Q3DictIterator::currentKey() \o QHashIterator::key()
- \row \o Q3DictIterator::isEmpty() \o QHash::isEmpty()
- \row \o Q3DictIterator::toFirst() \o QHashIterator::toFront()
- \row \o Q3DictIterator::operator()() \o QHashIterator::value()
- \row \o Q3DictIterator::operator*() \o QHashIterator::value()
- \row \o Q3DictIterator::operator++() \o See remark below
- \endtable
-
- Be aware that QHashIterator has a different way of iterating than
- Q3DictIterator. A typical loop with Q3DictIterator looks like this:
-
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 16
-
- Here's the equivalent QHashIterator loop:
-
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 17
-
- See \l{Java-style iterators} for details.
-
- \section1 QDir
-
- The following functions used to have a boolean \c{acceptAbsPath}
- parameter that defaulted to true:
-
- \list
- \i QDir::filePath()
- \i QDir::absFilePath()
- \i QDir::cd()
- \i QDir::mkdir()
- \i QDir::rmdir()
- \i QDir::remove()
- \i QDir::rename()
- \i QDir::exists()
- \endlist
-
- In Qt 3, if \c acceptAbsPath is true, a file name starting with
- '/' is be returned without change; if \c acceptAbsPath is false,
- an absolute path is prepended to the file name. For example:
-
- \table
- \header \i Current directory \i File name \i \c acceptAbsPath \i File path
- \row \i{1,2} /home/tsmith \i{1,2} index.html \i true \i /home/tsmith/index.html
- \row \i false \i /home/tsmith/index.html
- \row \i{1,2} /home/tsmith \i{1,2} /index.html \i true \i /index.html
- \row \i false \i /home/tsmith/index.html
- \endtable
-
- In Qt 4, this parameter is no longer available. If you use it
- in your code, you can check that QDir::isRelativePath() returns
- false instead.
-
- \oldcode
- QDir dir("/home/tsmith");
- QString path = dir.filePath(fileName, false);
- \newcode
- QDir dir("/home/tsmith");
- QString path;
- if (dir.isRelativePath(fileName))
- path = dir.filePath(fileName);
- else
- path = fileName;
- \endcode
-
- QDir::encodedEntryList() has been removed.
-
- fileInfoList(), entryInfoList(), and drives() now return a QList<QFileInfo>
- and not a QPtrList<QFileInfo> *. Code using these methods will not work with
- the Qt3Support library and must be adapted instead.
-
- See \l{Porting to Qt 4 - Virtual Functions}{Virtual Functions} for
- a list of QDir virtual member functions in Qt 3 that are no longer
- virtual in Qt 4.
-
- QDir::match() now always matches case insensitively.
-
- QDir::homeDirPath() has been removed. Use QDir::home() instead, and
- extract the path separately.
-
- \section1 QDns
-
- Qt 3 used its own implementation of the DNS protocol and provided
- a low-level \c QDns class. Qt 4's QHostInfo class uses the system's \c
- gethostbyname() function from a thread instead.
-
- The old \c QDns class has been renamed Q3Dns and moved to the
- Qt3Support library. The new QHostInfo class has a
- radically different API: It consists mainly of two static
- functions, one of which is blocking (QHostInfo::fromName()), the
- other non-blocking (QHostInfo::lookupHost()). See the QHostInfo
- class documentation for details.
-
- \section1 QDockArea
-
- The \c QDockArea class has been renamed Q3DockArea and moved to
- the Qt3Support library. In Qt 4, QMainWindow handles
- the dock and toolbar areas itself. See the QMainWindow
- documentation for details.
-
- \section1 QDockWindow
-
- The old \c QDockWindow class has been renamed Q3DockWindow and
- moved to the Qt3Support library. In Qt 4, there is a
- new QDockWidget class with a different API. See the class
- documentation for details.
-
- See \l{Porting to Qt 4 - Virtual Functions}{Virtual Functions} for
- a list of QDockWidget virtual member functions in Qt 3 that are no
- longer virtual in Qt 4.
-
- \note \l{Q3DockWindow}'s
- \l{Q3DockWindow::setHorizontallyStretchable()}{horizontallyStretchable}
- property can be achieved in QDockWidget with
- \l{QWidget#Size Hints and Size Policies}{size policies}.
-
- \section1 QDragObject
-
- The \c QDragObject class has been renamed Q3DragObject and
- moved to the Qt3Support library. In Qt 4, it has been
- replaced by the QMimeData class. See the class documentation for
- details.
-
- Note that the Q3DragObject::DragCopyOrMove drag and drop mode is
- interpreted differently to Qt 3's QDragObject::DragCopyOrMove mode.
- In Qt 3, a move operation was performed by default, and the user had
- to hold down the \key{Ctrl} key to perform a copy operation.
- In Qt 4, a copy operation is performed by default; the user has to
- hold down the \key{Shift} key to perform a move operation.
-
- See \l{Porting to Qt 4 - Drag and Drop} for a comparison between
- the drag and drop APIs in Qt 3 and Qt 4.
-
- \section1 QDropSite
-
- The \c QDropSite class has been renamed Q3DropSite and moved to
- the Qt3Support library.
-
- The QDropSite class has been obsolete ever since Qt 2.0. The only
- thing it does is call QWidget::setAcceptDrops(true).
-
- \oldcode
- class MyWidget : public QWidget, public QDropSite
- {
- public:
- MyWidget(const QWidget *parent)
- : QWidget(parent), QDropSite(this)
- {
- }
- ...
- }
- \newcode
- class MyWidget : public QWidget
- {
- public:
- MyWidget(const QWidget *parent)
- : QWidget(parent)
- {
- setAcceptDrops(true);
- }
- ...
- }
- \endcode
-
- See \l{Porting to Qt 4 - Drag and Drop} for a comparison between
- the drag and drop APIs in Qt 3 and Qt 4.
-
- \section1 QEditorFactory
-
- The \c QEditorFactory class has been renamed Q3EditorFactory and
- moved to the Qt3Support library.
-
- See \l{QtSql Module} for an overview of the new SQL classes.
-
- \section1 QEventLoop
-
- In Qt 3, \c QEventLoop combined the Qt event loop and the event
- dispatching. In Qt 4, these tasks are now assigned to two
- distinct classes: QEventLoop and QAbstractEventDispatcher.
-
- If you subclassed QEventLoop to integrate with another library's
- event loop, you must subclass QAbstractEventDispatcher instead. See
- the class documentation for details.
-
- Developers using \c{QEventLoop::loopLevel()} in Qt 3 should use
- QCoreApplication::loopLevel() instead. Note that this function is
- marked as obsolete, but it is expected to be available for the
- lifetime of Qt 4.
- \omit ### mention virtual functions that aren't virtual anymore \endomit
-
- \omit
- \section1 QFile
-
- The QFile::readLine(QString&, Q_ULONG) method from qt3 has been removed
- in qt4, but this change in the QFile interface is not documented in the
- porting documentation as of qt-4.0.0-b1.
- \endomit
-
- \section1 QFileDialog
-
- The QFileDialog class in Qt 4 has been totally rewritten. It
- provides most of the functionality of the old \c QFileDialog
- class, but with a different API. Some functionality, such as the
- ability to preview files, is expected to be added in a later Qt 4
- release.
-
- The old \c QFileDialog, \c QFileIconProvider, and \c QFilePreview
- classes has been renamed Q3FileDialog, Q3FileIconProvider, and
- Q3FilePreview and have been moved to Qt3Support. You can use them
- if you need some functionality not provided yet by the new
- QFileDialog class.
-
- The following table lists which functions have been renamed or
- removed in Qt 4.
-
- \table
- \header \o Old function \o Qt 4 equivalent
- \row \o Q3FileDialog::addFilter(const QString &) \o See remark below
- \row \o Q3FileDialog::addLeftWidget(QWidget *) \o N/A
- \row \o Q3FileDialog::addRightWidget(QWidget *) \o N/A
- \row \o Q3FileDialog::addToolButton(QAbstractButton *, bool separator) \o N/A
- \row \o Q3FileDialog::addWidgets(QLabel *, QWidget *, QPushButton *) \o N/A
- \row \o Q3FileDialog::dir() \o QFileDialog::directory()
- \row \o Q3FileDialog::dirPath() \o QFileDialog::directory().path()
- \row \o Q3FileDialog::iconProvider() \o N/A
- \row \o Q3FileDialog::isContentsPreviewEnabled() \o N/A
- \row \o Q3FileDialog::isInfoPreviewEnabled() \o N/A
- \row \o Q3FileDialog::previewMode() \o N/A
- \row \o Q3FileDialog::rereadDir() \o N/A
- \row \o Q3FileDialog::resortDir() \o N/A
- \row \o Q3FileDialog::selectAll(bool) \o N/A
- \row \o Q3FileDialog::setContentsPreview(QWidget *, Q3FilePreview *) \o N/A
- \row \o Q3FileDialog::setContentsPreviewEnabled(bool) \o N/A
- \row \o Q3FileDialog::setDir(const QString &) \o QFileDialog::setDirectory(const QString &)
- \row \o Q3FileDialog::setFilters(const char **) \o Q3FileDialog::setFilters(const QStringList &)
- \row \o Q3FileDialog::setIconProvider(Q3FileIconProvider *) \o N/A
- \row \o Q3FileDialog::setInfoPreview(QWidget *, Q3FilePreview *) \o N/A
- \row \o Q3FileDialog::setInfoPreviewEnabled(bool) \o N/A
- \row \o Q3FileDialog::setPreviewMode(PreviewMode) \o N/A
- \row \o Q3FileDialog::setSelectedFilter(const QString &) \o QFileDialog::selectFilter(const QString &)
- \row \o Q3FileDialog::setSelectedFilter(int) \o See remark below
- \row \o Q3FileDialog::setSelection(const QString &) \o QFileDialog::selectFile(const QString &)
- \row \o Q3FileDialog::setShowHiddenFiles(bool) \o showHidden()
- \row \o Q3FileDialog::setUrl(const QUrlOperator &) \o N/A
- \row \o Q3FileDialog::showHiddenFiles() \o N/A
- \row \o Q3FileDialog::url() \o QUrl::fromLocalFile(QFileDialog::directory())
- \header \o Old signals \o Qt 4 equivalent
- \row \o Q3FileDialog::fileHighlighted(const QString &) \o N/A
- \row \o Q3FileDialog::fileSelected(const QString &) \o QFileDialog::filesSelected(const QStringList &)
- \row \o Q3FileDialog::dirEntered(const QString &) \o N/A
- \row \o Q3FileDialog::filterSelected(const QString &) \o N/A
- \endtable
-
- Remarks:
-
- \list 1
- \o The Q3FileDialog::addFilter(const QString &) function has no
- direct equivalent in the new QFileDialog. Use
- QFileDialog::setFilters() instead.
-
- \oldcode
- fileDialog->addFilter(tr("JPEG files (*.jpg *.jpeg)"));
- \newcode
- QStringList filters = fileDialog->filters();
- filters << tr("JPEG files (*.jpg *.jpeg)");
- fileDialog->setFilters(filters);
- \endcode
-
- \o The Q3FileDialog::setSelectedFilter(int) overload has no direct
- equivalent in the new QFileDialog. Use
- QFileDialog::selectFilter(const QString &) instead.
-
- \oldcode
- fileDialog->setSelectedFilter(3);
- \newcode
- fileDialog->selectFilter(fileDialog->filters().at(3));
- \endcode
- \endlist
-
- There are no equivalent virtual functions to the two
- Q3FileDialog::setSelectedFilter() virtual functions in the QFileDialog
- API. In addition, these functions have been renamed or removed, as
- described above.
-
- \section1 QFocusData
-
- The QFocusData class is not available in Qt 4. Some of its
- functionality is available via the QWidget::nextInFocusChain()
- and QWidget::focusNextPrevChild() functions.
-
- \section1 QFocusEvent
-
- The setReason() function is no longer present in Qt 4. It is
- necessary to define the reason when constructing a focus event.
-
- \section1 QFont
-
- \c QFont::Script has been moved to QFontDatabase::WritingSystem.
-
- \section1 QFrame
-
- The QFrame class has been made more lightweight in Qt 4, by
- reducing the number of properties and virtual functions. The
- reduction in the number of virtual functions is significant
- because QFrame is the base class of many Qt classes.
-
- Here's an overview of the changes:
-
- \list
- \o QFrame no longer has a \c margin property (which wasn't
- honored by Qt's layout managers anyway).
-
- \o QFrame no longer has a frameChanged() function, reimplement
- QFrame::resizeEvent() instead.
-
- \o QFrame used to have drawFrame(QPainter *) and
- drawContents(QPainter *) virtual functions. These are now
- gone. In Qt 4, the frame is drawn by the QFrame::paintEvent()
- function. If you want to change the way QFrame paints itself,
- reimplement this function. To draw the contents of the frame,
- reimplement QFrame:paintEvent() and call the base class
- implementation of the function before you use the
- \l {QWidget::}{contentsRect()} function inherited from QWidget,
- to retrieve the rectangle to paint on.
-
- \endlist
-
- To help with porting, the Qt3Support library contains a Q3Frame
- class that inherits QFrame and provides a similar API to the old
- QFrame class. If you derived from QFrame in your application, you
- might want to use Q3Frame as a base class as a first step in the
- porting process, and later move on to the new QFrame class.
-
- See \l{Porting to Qt 4 - Virtual Functions}{Virtual Functions} for
- a list of QFrame virtual member functions in Qt 3 that are no longer
- virtual in Qt 4.
-
- \section1 QFtp
-
- QFtp no longer inherits from QNetworkProtocol. See the
- \l{#qnetworkprotocol.section}{section on QNetworkProtocol} for
- details.
-
- The old \c QFtp class has been renamed Q3Ftp and moved to the
- Qt3Support library.
-
- \target qglayoutiterator.section
- \section1 QGLayoutIterator
-
- The QGLayoutIterator class no longer exists in Qt 4. This makes
- only a difference if you implemented custom layout managers
- (i.e., QLayout subclasses).
-
- The new approach is much simpler: It consists in reimplementing
- QLayout::itemAt() and QLayout::takeAt(). These functions operate
- on indexes, eliminating the need for a layout iterator class.
-
- \section1 QGrid
-
- The \c QGrid class is now only available as Q3Grid in Qt 4. You
- can achieve the same result as \c QGrid by creating a QWidget
- with a grid layout:
-
- \oldcode
- QGrid *grid = new QGrid(2, Qt::Horizontal);
- QPushButton *child1 = new QPushButton(grid);
- QPushButton *child2 = new QPushButton(grid);
- QPushButton *child3 = new QPushButton(grid);
- QPushButton *child4 = new QPushButton(grid);
- \newcode
- QWidget *grid = new QWidget;
- QPushButton *child1 = new QPushButton(grid);
- QPushButton *child2 = new QPushButton(grid);
- QPushButton *child3 = new QPushButton(grid);
- QPushButton *child4 = new QPushButton(grid);
-
- QVBoxLayout *layout = new QVBoxLayout;
- layout->addWidget(child1, 0, 0);
- layout->addWidget(child2, 0, 1);
- layout->addWidget(child3, 1, 0);
- layout->addWidget(child4, 1, 1);
- grid->setLayout(layout);
- \endcode
-
- \section1 QGridLayout
-
- See \l{Porting to Qt 4 - Virtual Functions}{Virtual Functions} for
- a list of QGridLayout virtual member functions in Qt 3 that are no
- longer virtual in Qt 4.
-
- \section1 QGridView
-
- The \c QGridView class has been renamed Q3GridView and moved to
- the Qt3Support library. In Qt 4, we recommend that
- you use QTableView or QAbstractItemView for presenting tabular
- data.
-
- See \l{Model/View Programming} for an overview of the new item
- view classes.
-
- \target qgroupbox.section
- \section1 QGroupBox
-
- The QGroupBox class has been redesigned in Qt 4. Many of the
- features of the old \c QGroupBox class can be obtained by using
- the Q3GroupBox class from the Qt3Support library.
-
- The new QGroupBox is more lightweight. It doesn't attempt to
- duplicate functionality already provided by QGridLayout, and it
- does not inherit from QFrame. As a result, the following members
- have been removed:
-
- \list
- \o Q3GroupBox::setColumns(), Q3GroupBox::columns()
- \o Q3GroupBox::setOrientation(), Q3GroupBox::orientation()
- \o Q3GroupBox::setInsideMargin(), Q3GroupBox::insideMargin()
- \o Q3GroupBox::addSpace()
- \endlist
-
- Naturally, the \c columns and \c orientation properties have also
- been removed.
-
- If you rely on some of the missing functionality in your
- application, you can use Q3GroupBox instead of QGroupBox as a
- help to porting.
-
- See \l{Porting to Qt 4 - Virtual Functions}{Virtual Functions} for
- a list of QGroupBox virtual member functions in Qt 3 that are no
- longer virtual in Qt 4.
-
- \section1 QHBox
-
- The \c QHBox class is now only available as Q3HBox in Qt 4. You
- can achieve the same result as \c QHBox by creating a QWidget
- with an horizontal layout:
-
- \oldcode
- QHBox *hbox = new QHBox;
- QPushButton *child1 = new QPushButton(hbox);
- QPushButton *child2 = new QPushButton(hbox);
- \newcode
- QWidget *hbox = new QWidget;
- QPushButton *child1 = new QPushButton;
- QPushButton *child2 = new QPushButton;
-
- QHBoxLayout *layout = new QHBoxLayout;
- layout->addWidget(child1);
- layout->addWidget(child2);
- hbox->setLayout(layout);
- \endcode
-
- Note that child widgets are not automatically placed into the widget's
- layout; you will need to manually add each widget to the QHBoxLayout.
-
- \section1 QHeader
-
- The \c QHeader class has been renamed Q3Header and moved to
- the Qt3Support library. In Qt 4, it is replaced
- by the QHeaderView class.
-
- See \l{Model/View Programming} for an overview of the new item
- view classes.
-
- \section1 QHGroupBox
-
- The \c QHGroupBox class has been renamed Q3HGroupBox and moved to
- the Qt3Support library.
- Qt 4 does not provide a specific replacement class for \c QHGroupBox
- since QGroupBox is designed to be a generic container widget. As a
- result, you need to supply your own layout for any child widgets.
-
- See \l{#QGroupBox} for more information about porting code that uses
- group boxes.
-
- \section1 QHttp
-
- QHttp no longer inherits from QNetworkProtocol. See the See the
- \l{#qnetworkprotocol.section}{section on QNetworkProtocol} for
- details.
-
- The old \c QHttp, \c QHttpHeader, \c QHttpRequestHeader, and \c
- QHttpResponseHeader classes have been renamed Q3Http,
- Q3HttpHeader, Q3HttpRequestHeader, and Q3HttpResponseHeader and
- have been moved to the Qt3Support library.
-
- \section1 QIconFactory
-
- The QIconFactory class is no longer part of Qt. It has been replaced by
- the QIconEngine class.
-
- \section1 QIconSet
-
- The QIconSet class is no longer part of Qt. It has been replaced by
- the QIcon class.
-
- \section1 QIconView
-
- The \c QIconView, \c QIconViewItem, \c QIconDrag, and \c
- QIconDragItem classes has been renamed Q3IconView,
- Q3IconViewItem, Q3IconDrag, and Q3IconDragItem and moved to the
- Qt3Support library. New Qt applications should use
- QListWidget or its base class QListView instead, and call
- QListView::setViewMode(QListView::IconMode) to obtain an "icon
- view" look.
-
- See \l{Model/View Programming} for an overview of the new item
- view classes.
-
- \omit
- ###
-
- \section1 QImage
-
- QImage::fromMimeSource(const QString &) -> qImageFromMimeSource(const QString &)
- \endomit
-
- \section1 QImageDrag
-
- The \c QImageDrag class has been renamed Q3ImageDrag and moved to
- the Qt3Support library. In Qt 4, use QMimeData
- instead and call QMimeData::setImage() to set the image.
-
- See \l{Porting to Qt 4 - Drag and Drop} for a comparison between
- the drag and drop APIs in Qt 3 and Qt 4.
-
- \section1 QImageIO
-
- The \c QImageIO class has been split into two classes:
- QImageReader and QImageWriter. The table below shows the
- correspondance between the two APIs:
-
- \table
- \header \o Qt 3 function \o Qt 4 equivalents
- \row \o QImageIO::description() \o QImageWriter::text()
- \row \o QImageIO::fileName() \o QImageReader::fileName() and QImageWriter::fileName()
- \row \o QImageIO::format() \o QImageReader::format() and QImageWriter::format()
- \row \o QImageIO::gamma() \o QImageWriter::gamma()
- \row \o QImageIO::image() \o Return value of QImageReader::read()
- \row \o QImageIO::inputFormats() \o QImageReader::supportedImageFormats()
- \row \o QImageIO::ioDevice() \o QImageReader::device() and QImageWriter::device()
- \row \o QImageIO::outputFormats() \o QImageWriter::supportedImageFormats()
- \row \o QImageIO::parameters() \o N/A
- \row \o QImageIO::quality() \o QImageWriter::quality()
- \row \o QImageIO::read() \o QImageReader::read()
- \row \o QImageIO::setDescription() \o QImageWriter::setText()
- \row \o QImageIO::setFileName() \o QImageReader::setFileName() and QImageWriter::setFileName()
- \row \o QImageIO::setFormat() \o QImageReader::setFormat() and QImageWriter::setFormat()
- \row \o QImageIO::setGamma() \o QImageWriter::setGamma()
- \row \o QImageIO::setIODevice() \o QImageReader::setDevice() and QImageWriter::setDevice()
- \row \o QImageIO::setImage() \o Argument to QImageWriter::write()
- \row \o QImageIO::setParameters() \o N/A
- \row \o QImageIO::setQuality() \o QImageWriter::setQuality()
- \row \o QImageIO::setStatus() \o N/A
- \row \o QImageIO::status() \o QImageReader::error() and QImageWriter::error()
- \row \o QImageIO::write() \o QImageWriter::write()
- \endtable
-
- \section1 QIntCache<T>
-
- QIntCache<T> has been moved to Qt3Support. It has been replaced
- by QCache<int, T>.
-
- For details, read the \l{#qcache.section}{section on QCache<T>},
- mentally substituting \c int for QString.
-
- \section1 QIntDict<T>
-
- QIntDict<T> and QIntDictIterator<T> have been moved to
- Qt3Support. They have been replaced by the more modern QHash<Key,
- T> and QMultiHash<Key, T> classes and their associated iterator
- classes.
-
- When porting old code that uses QIntDict<T> to Qt 4, there are
- four classes that you can use:
-
- \list
- \o QMultiHash<int, T *>
- \o QMultiHash<int, T>
- \o QHash<int, T *>
- \o QHash<int, T>
- \endlist
-
- For details, read the \l{#qdict.section}{section on QDict<T>},
- mentally substituting \c int for QString.
-
- \target qiodevice.section
- \section1 QIODevice
-
- The QIODevice class's API has been simplified to make it easier
- to subclass and to make it work more smoothly with asynchronous
- devices such as QTcpSocket and QProcess.
-
- The following virtual functions have changed name or signature:
-
- \table
- \header \o Qt 3 function \o Comment
- \row \o QIODevice::at() const \o Renamed QIODevice::pos().
- \row \o QIODevice::at(Offset) \o Renamed QIODevice::seek().
- \row \o QIODevice::open(int) \o The parameter is now of type QIODevice::OpenMode.
- \row \o QIODevice::readBlock(char *, Q_ULONG) \o QIODevice::read(char *, qint64)
- \row \o QIODevice::writeBlock(const char *, Q_ULONG) \o QIODevice::write(const char *, qint64)
- \endtable
-
- \note QIODevice::open(QIODevice::OpenMode) is no longer pure virtual.
-
- The following functions are no longer virtual or don't exist anymore:
-
- \table
- \row \o QIODevice::getch() \o Renamed QIODevice::getChar() and implemented in terms of QIODevice::readData().
- \row \o QIODevice::putch(int) \o Renamed QIODevice::putChar() and implemented in terms of QIODevice::writeData().
- \row \o QIODevice::readAll() \o Implemented in terms of QIODevice::readData().
- \row \o QIODevice::readLine(char *, Q_ULONG) \o Implemented in terms of QIODevice::readData()
- \row \o QIODevice::ungetch(int) \o Renamed QIODevice::ungetChar() and simulated using an internal unget buffer.
- \endtable
-
- The \c IO_xxx flags have been revised, and the protected setFlags()
- function removed. Most of the flags have been
- eliminated because errors are best handled by implementing certain
- functions in QIODevice subclasses rather than through the base classes.
- The file access flags, such as \c IO_ReadOnly and \c IO_WriteOnly, have
- been moved to the QIODevice class to avoid polluting the global
- namespace. The table below shows the correspondence between the
- Qt 3 \c IO_xxx flags and the Qt 4 API:
-
- \table
- \header \o Qt 3 constant \o Qt 4 equivalent
- \row \o IO_Direct \o Use !QIODevice::isSequential() instead (notice the \e not).
- \row \o IO_Sequential \o Use QIODevice::isSequential() instead.
- \row \o IO_Combined \o N/A
- \row \o IO_TypeMask \o N/A
- \row \o IO_Raw \o QIODevice::Unbuffered
- \row \o IO_Async \o N/A
- \row \o IO_ReadOnly \o QIODevice::ReadOnly
- \row \o IO_WriteOnly \o QIODevice::WriteOnly
- \row \o IO_ReadWrite \o QIODevice::ReadWrite
- \row \o IO_Append \o QIODevice::Append
- \row \o IO_Truncate \o QIODevice::Truncate
- \row \o IO_Translate \o QIODevice::Text
- \row \o IO_ModeMask \o N/A
- \row \o IO_Open \o Use QIODevice::isOpen() instead.
- \row \o IO_StateMask \o N/A
- \row \o IO_Ok \o N/A
- \row \o IO_ReadError \o N/A
- \row \o IO_WriteError \o N/A
- \row \o IO_FatalError \o N/A
- \row \o IO_ResourceError \o N/A
- \row \o IO_OpenError \o N/A
- \row \o IO_ConnectError \o N/A
- \row \o IO_AbortError \o N/A
- \row \o IO_TimeOutError \o N/A
- \row \o IO_UnspecifiedError \o N/A
- \endtable
-
- \section1 QIODeviceSource
-
- The QIODeviceSource class was used internally in Qt 2.x in
- conjunction with QImageConsumer. It was obsoleted in Qt 3.0.
- \input porting4-obsoletedmechanism.qdocinc
-
- \section1 QLabel
-
- QLabel doesn't enable word-wrap automatically anymore when rich
- text is used. You can enable it by calling
- QLabel::setWordWrap() or by setting the
- \l{QLabel::wordWrap}{wordWrap} property. The reason for this
- change is that the old behavior was confusing to many users.
-
- Also, QLabel no longer offers an \c autoResize property. Instead,
- you can call QWidget::setFixedSize() on the label, with
- QLabel::sizeHint() as the argument, whenever you change the
- contents of the QLabel.
-
- See also \l{Porting to Qt 4 - Virtual Functions}{Virtual Functions}
- for a list of QLabel virtual member functions in Qt 3 that are no
- longer virtual in Qt 4.
-
- \section1 QLayout
-
- In Qt 4, margins are always handled by layouts; there is no
- QLayout::setSupportsMargin() function anymore.
-
- The deleteAllItems() function is now only available if
- \c QT3_SUPPORT is defined. If you maintain a QList of layout
- items, you can use qDeleteAll() to remove all the items in one
- go.
-
- In Qt 3, it was possible to change the resizing behavior for layouts
- in top-level widgets by adjusting the layout's \c resizeMode property.
- In Qt 4, this property has been replaced by the QLayout::sizeConstraint
- property which provides more control over how the layout behaves when
- resized.
-
- See also the \l{#qlayoutiterator.section}{section on
- QLayoutIterator} and the \l{#qglayoutiterator.section}{section on
- QGLayoutIterator}.
-
- \target qlayoutiterator.section
- \section1 QLayoutIterator
-
- The QLayoutIterator class is obsoleted in Qt 4. It is available
- only if \c QT3_SUPPORT is defined. It can be replaced by the
- QLayout::itemAt() and QLayout::takeAt() functions, which operate
- on indexes.
-
- \oldcode
- QLayoutIterator it = layout()->iterator();
- QLayoutItem *child;
- while ((child = it.current()) != 0) {
- if (child->widget() == myWidget) {
- it.takeCurrent();
- return;
- ++it;
- }
- \newcode
- int i = 0;
- QLayoutItem *child;
- while ((child = layout()->itemAt(i)) != 0) {
- if (child->widget() == myWidget) {
- layout()->takeAt(i);
- return;
- }
- ++i;
- }
- \endcode
-
- \section1 QLineEdit
-
- See \l{#properties}{Properties} for a list of QLineEdit
- properties in Qt 3 that have changed in Qt 4.
-
- The default value of QLineEdit's \l{QLineEdit::dragEnabled()}{dragEnabled}
- property was \c true in Qt 3. In Qt 4, the default value is \c false.
-
- Note that QLineEdit in Qt 4 is no longer a subclass of QFrame.
- If you need to visually style a line edit with a frame, we recommend
- either using a QFrame as a container for a QLineEdit or customizing
- the line edit with a \l{Qt Style Sheets}{style sheet}.
-
- \section1 QListBox
-
- The \c QListBox, \c QListBoxItem, \c QListBoxText, and \c
- QListBoxPixmap classes have been renamed Q3ListBox,
- Q3ListBoxItem, Q3ListBoxText, and Q3ListBoxPixmap and have been
- moved to the Qt3Support library. New Qt applications
- should use QListWidget or its base class QListView instead.
-
- See \l{Model/View Programming} for an overview of the new item
- view classes.
-
- \section1 QListView
-
- The \c QListView, \c QListViewItem, \c QCheckListItem, and \c
- QListViewItemIterator classes have been renamed Q3ListView,
- Q3ListViewItem, Q3CheckListItem, and Q3ListViewItemIterator, and
- have been moved to the Qt3Support library. New Qt
- applications should use one of the following four classes
- instead: QTreeView or QTreeWidget for tree-like structures;
- QListWidget or the new QListView class for one-dimensional lists.
-
- See \l{Model/View Programming} for an overview of the new item
- view classes.
-
- \section1 QLocalFs
-
- The \c QLocalFs class is no longer part of the public Qt API. It
- has been renamed Q3LocalFs and moved to Qt3Support. Use QDir,
- QFileInfo, or QFile instead.
-
- \section1 QMainWindow
-
- The QMainWindow class has been redesigned in Qt 4 to provide a
- more modern look and feel and more flexibility. The API has
- changed to reflect that. The old \c QMainWindow class has been
- renamed Q3MainWindow and moved to Qt3Support. See the QMainWindow
- class documentation for details.
-
- \omit ### More detail \endomit
-
- \target qmemarray.section
- \section1 QMemArray<T>
-
- QMemArray<T> has been moved to Qt3Support. It has been replaced
- by the QVector<T> class.
-
- The following table summarizes the API differences between the
- two classes.
-
- \table
- \row \o QMemArray::assign(const QMemArray<T> &) \o QVector::operator=()
- \row \o QMemArray::assign(const T *, uint) \o See remark below
- \row \o QMemArray::duplicate(const QMemArray &) \o QVector::operator=()
- \row \o QMemArray::duplicate(const T *, uint) \o See remark below
- \row \o QMemArray::setRawData(const T *, uint) \o N/A
- \row \o QMemArray::resetRawData(const T *, uint) \o N/A
- \row \o QMemArray::find(const T &, uint) \o QVector::indexOf(const T &, int)
- \row \o QMemArray::contains(const T &) \o QVector::count(const T &)
- \row \o QMemArray::sort() \o \l qSort()
- \row \o QMemArray::bsearch(const T &d) \o \l qBinaryFind()
- \row \o QMemArray::at(uint) \o QVector::operator[]()
- \row \o QMemArray::operator const T *() \o QVector::constData()
- \endtable
-
- Remarks:
-
- \list 1
- \o QMemArray::assign(const T *, uint) and QMemArray::duplicate(const T *, uint)
- can be replaced by QVector::resize() and qCopy().
-
- \oldcode
- QMemArray<QSize> array;
- ...
- array.assign(data, size);
- \newcode
- QVector<QSize> vector;
- ...
- vector.resize(size);
- qCopy(data, data + size, vector.begin());
- \endcode
-
- \o QMemArray is an explicitly shared class, whereas QVector is
- implicitly shared. See \l{Explicit Sharing} for more
- information.
- \endlist
-
- \section1 QMenuBar
-
- In Qt 3, QMenuBar inherited from QFrame and QMenuData; in Qt 4, it is
- a direct subclass of QWidget. Applications that provided customized
- menu bars will need to take advantage of the styling features described
- in the \l{Qt Style Sheets} document.
-
- It is not possible to add widgets to menu bars in Qt 4.
-
- \section1 QMenuData
-
- In Qt 4, the QMenu class provides a menu widget that can be used in all
- the places where menus are used in an application. Unlike \c QMenuData,
- QMenu is designed around the concept of actions, provided by the QAction
- class, instead of the identifiers used in Qt 3.
-
- In Qt 3, it was possible to insert widgets directly into menus by using
- a specific \c QMenuData::insertItem() overload. In Qt 4.2 and later,
- the QWidgetAction class can be used to wrap widgets for use in Qt 4's
- action-based APIs.
-
- \section1 QMessageBox
-
- The QMessageBox::iconPixmap() function used to return a "const
- QPixmap *". In Qt 4, it returns a QPixmap.
-
- \section1 QMimeSourceFactory
-
- The \c QMimeSourceFactory has been renamed Q3MimeSourceFactory
- and moved to the Qt3Support library. New Qt applications should
- use Qt 4's \l{Resource System} instead.
-
- \section1 QMovie
-
- The QMovie API has been revised in Qt 4 to make it more
- consistent with the other Qt classes (notably QImageReader). The
- table below summarizes the changes.
-
- \table
- \header \o Qt 3 function \o Qt 4 equivalent
- \row \o QMovie::connectResize() \o Connect to QMovie::resized()
- \row \o QMovie::connectStatus() \o Connect to QMovie::stateChanged()
- \row \o QMovie::connectUpdate() \o Connect to QMovie::updated()
- \row \o QMovie::disconnectResize() \o Disconnect from QMovie::resized()
- \row \o QMovie::disconnectStatus() \o Disconnect from QMovie::stateChanged()
- \row \o QMovie::disconnectUpdate() \o Disconnect from QMovie::updated()
- \row \o QMovie::finished() \o Use QMovie::state() instead
- \row \o QMovie::frameImage() \o Use QMovie::currentImage() instead
- \row \o QMovie::frameNumber() \o Use QMovie::currentFrameNumber() instead
- \row \o QMovie::framePixmap() \o Use QMovie::currentPixmap() instead
- \row \o QMovie::getValidRect() \o Use frameRect() instead
- \row \o QMovie::isNull() \o Use QMovie::isValid() instead
- \row \o QMovie::pause() \o Use QMovie::setPaused(true) instead
- \row \o QMovie::paused() \o Use QMovie::state() instead
- \row \o QMovie::pushData() \o N/A
- \row \o QMovie::pushSpace() \o N/A
- \row \o QMovie::restart() \o Use QMovie::jumpToFrame(0) instead
- \row \o QMovie::running() \o Use QMovie::state() instead
- \row \o QMovie::step() \o Use QMovie::jumpToFrame() and QMovie::setPaused() instead
- \row \o QMovie::step() \o Use QMovie::jumpToNextFrame() instead
- \row \o QMovie::steps() \o Use QMovie::currentFrameNumber() and QMovie::frameCount() instead
- \row \o QMovie::unpause() \o Use QMovie::setPaused(false) instead
- \endtable
-
- \section1 QMultiLineEdit
-
- The \c QMultiLineEdit class in Qt 3 was a convenience QTextEdit
- subclass that provided an interface compatible with Qt 2's
- QMultiLineEdit class. In Qt 4, it is called Q3MultiLineEdit, it
- inherits Q3TextEdit, and it is part of Qt3Support. Use QTextEdit
- in new code.
-
- \target qnetworkprotocol.section
- \section1 QNetworkProtocol
-
- The QNetworkProtocol, QNetworkProtocolFactoryBase,
- QNetworkProtocolFactory<T>, and QNetworkOperation classes are no
- longer part of the public Qt API. They have been renamed
- Q3NetworkProtocol, Q3NetworkProtocolFactoryBase,
- Q3NetworkProtocolFactory<T>, and Q3NetworkOperation and have been
- moved to the Qt3Support library.
-
- In Qt 4 applications, you can use classes like QFtp and
- QNetworkAccessManager directly to perform file-related actions on
- a remote host.
-
- \section1 QObject
-
- QObject::children() now returns a QObjectList instead of a
- pointer to a QObjectList. See also the comments on QObjectList
- below.
-
- Use QObject::findChildren() (or qFindChildren() if you need MSVC 6
- compatibility) instead of QObject::queryList(). For example:
-
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 18
-
- QObject::killTimers() has been removed because it was unsafe to
- use in subclass. (A subclass normally doesn't know whether the
- base class uses timers or not.)
-
- The \c QObject::name property has been renamed
- QObject::objectName.
-
- \c QObject::objectTrees() has been removed. If you are primarly
- interested in widgets, use QApplication::allWidgets() or
- QApplication::topLevelWidgets().
-
- \section1 QObjectDictionary
-
- The QObjectDictionary class is a synonym for
- QAsciiDict<QMetaObject>. See the \l{#qasciidict.section}{section
- on QAsciiDict<T>}.
-
- \section1 QObjectList
-
- In Qt 3, the QObjectList class was a typedef for
- QPtrList<QObject>. In Qt 4, it is a typedef for QList<QObject *>.
- See the \l{#qptrlist.section}{section on QPtrList<T>}.
-
- \section1 QPaintDevice
-
- To reimplement painter backends one previously needed to reimplement
- the virtual function QPaintDevice::cmd(). This function is taken out
- and should is replaced with the function QPaintDevice::paintEngine()
- and the abstract class QPaintEngine. QPaintEngine provides virtual
- functions for all drawing operations that can be performed on a
- painter backend.
-
- bitBlt() and copyBlt() are now only compatibility functions. Use
- QPainter::drawPixmap() instead.
-
- \section1 QPaintDeviceMetrics
-
- All functions that used to be provided by the \c
- QPaintDeviceMetrics class have now been moved to QPaintDevice.
-
- \oldcode
- QPaintDeviceMetrics metrics(widget);
- int deviceDepth = metrics.depth();
- \newcode
- int deviceDepth = widget->depth();
- \endcode
-
- For compatibility, the old \c QPaintDeviceMetrics class has been
- renamed Q3PaintDeviceMetrics and moved to Qt3Support.
-
- \section1 QPainter
-
- The QPainter class has undergone some changes in Qt 4 because of
- the way rectangles are drawn. In Qt 4, the result of drawing a
- QRect with a pen width of 1 pixel is 1 pixel wider and 1 pixel
- taller than in Qt 3.
-
- For compatibility, we provide a Q3Painter class in Qt3Support
- that provides the old semantics. See the Q3Painter documentation
- for details and for the reasons why we had to make this change.
-
- The \l{http://qt.nokia.com/doc/3.3/qpainter.html#CoordinateMode-enum}{QPainter::CoordinateMode}
- enum has been removed in Qt 4. All clipping
- operations are now defined using logical coordinates and are subject
- to transformation operations.
-
- The
- \l{http://qt.nokia.com/doc/3.3/qpainter.html#RasterOP-enum}{QPainter::RasterOP}
- enum has been replaced with QPainter::CompositionMode.
-
- \section1 QPicture
-
- In Qt 3, a QPicture could be saved in the SVG file format. In Qt
- 4, the SVG support is provided by the QtSvg module, which
- includes classes for \e displaying the contents of SVG files.
-
- If you would like to generate SVG files, you can use the Q3Picture
- compatibility class or the QSvgGenerator class introduced in Qt 4.3.
-
- \section1 QPixmap
-
- The mask() function has been changed to return a reference to a QBitmap
- rather than a pointer. As a result, it is no longer possible simply to
- test for a null pointer when determining whether a pixmap has a mask.
- Instead, you need to explicitly test whether the mask bitmap is null or
- not.
-
- \oldcode
- if (pixmap.mask())
- widget->setMask(*pixmap.mask());
- \newcode
- if (!pixmap.mask().isNull())
- widget->setMask(pixmap.mask());
- \endcode
-
- The \c QPixmap::setOptimization() and \c QPixmap::setDefaultOptimization()
- mechanism is no longer available in Qt 4.
-
-\omit
- QPixmap::fromMimeSource(const QString &) -> qPixmapFromMimeSource(const QString &)
-\endomit
-
- \section1 QPointArray
-
- The \c QPointArray class has been renamed QPolygon in Qt 4 and
- has undergone significant changes. In Qt 3, \c QPointArray
- inherited from QMemArray<QPoint>. In Qt 4, QPolygon inherits from
- QVector<QPoint>. Everything mentioned in the
- \l{#qmemarray.section}{section on QMemArray<T>} apply for
- QPointArray as well.
-
- The Qt3Support library contains a Q3PointArray class
- that inherits from QPolygon and provides a few functions that
- existed in \c QPointArray but no longer exist in QPolygon. These
- functions include Q3PointArray::makeArc(),
- Q3PointArray::makeEllipse(), and Q3PointArray::cubicBezier().
- In Qt 4, we recommend that you use QPainterPath for representing
- arcs, ellipses, and Bezier curves, rather than QPolygon.
-
- The QPolygon::setPoints() and QPolygon::putPoints() functions
- return \c void in Qt 4. The corresponding Qt 3 functions returned
- a \c bool indicating whether the array was successfully resized
- or not. This can now be checked by checking QPolygon::size()
- after the call.
-
-\omit
- X11 Specific:
-
- ::appDisplay() -> QX11Info::display()
- QPaintDevice::x11Display() -> QX11Info::display()
- QPaintDevice::x11AppDisplay() -> QX11Info::display()
- QPaintDevice::x11Screen() -> QX11Info::appScreen()
- QPaintDevice::x11AppScreen() -> ???
- QPaintDevice::x11Depth() -> QX11Info::appDepth()
- QPaintDevice::x11ColorMap() -> QX11Info::appColorMap()
- QPaintDevice::x11DefaultColorMap() -> ???
- QPaintDevice::x11Visual() -> QX11Info::appVisual()
- QPaintDevice::x11DefaultVisual() -> ???
-
- QPaintDevice::x11AppDpiX() -> QX11Info::appDpiX()
- QPaintDevice::x11AppDpiY() -> QX11Info::appDpiY()
- QPaintDevice::x11SetAppDpiX() -> QX11Info::setAppDpiX()
- QPaintDevice::x11SetAppDpiY() -> QX11Info::setAppDpiY()
-
- QPaintDevice::x11AppDepth() -> ???
- QPaintDevice::x11AppCells() -> ???
- QPaintDevice::x11AppRootWindow() -> ???
- QPaintDevice::x11AppColorMap() -> ???
- QPaintDevice::x11AppDefaultColorMap() -> ???
- QPaintDevice::x11AppVisual() -> ???
- QPaintDevice::x11AppDefaultVisual() -> ???
-
- End of X11 Specific
-\endomit
-
- \section1 QPopupMenu
-
- For most purposes, QPopupMenu has been replaced by QMenu in Qt
- 4. For compatibility with older applications, Q3PopupMenu provides
- the old API and features that are specific to pop-up menus. Note
- that, when using Q3PopupMenu, the menu's actions must be \l
- {Q3Action}s.
-
- In Qt 3, it was common practice to add entries to pop-up menus using the
- insertItem() function, maintaining identifiers for future use; for
- example, to dynamically change menu items.
- In Qt 4, menu entries are completely represented
- by actions for consistency with other user interface components, such as
- toolbar buttons. Create new menus with the QMenu class, and use the
- overloaded QMenu::addAction() functions to insert new entries.
- If you need to manage a set of actions created for a particular menu,
- we suggest that you construct a QActionGroup and add them to that.
-
- The \l{Qt Examples#Main Windows}{Main Window examples} provided
- show how to use Qt's action system to construct menus, toolbars, and other
- common user interface elements.
-
- \section1 QPrinter
-
- The QPrinter class now expects printing to be set up from a
- QPrintDialog.
-
- \section1 QProcess
-
- The QProcess class has undergone major improvements in Qt 4. It
- now inherits QIODevice, which makes it possible to combine
- QProcess with a QTextStream or a QDataStream.
-
- The old \c QProcess class has been renamed Q3Process and moved to
- the Qt3Support library.
-
- \section1 QProgressBar
-
- The QProgressBar API has been significantly improved in Qt 4. The
- old \c QProgressBar API is available as Q3ProgressBar in the
- Qt3Support library.
-
- \section1 QProgressDialog
-
- The QProgressDialog API has been significantly improved in Qt 4.
- The old \c QProgressDialog API is available as Q3ProgressDialog
- in the Qt3Support library.
-
- See \l{#properties}{Properties} for a list of QProgressDialog
- properties in Qt 3 that have changed in Qt 4.
-
- \section1 QPtrCollection<T>
-
- The \c QPtrCollection<T> abstract base class has been renamed
- Q3PtrCollection<T> moved to the Qt3Support library.
- There is no direct equivalent in Qt 4.
-
- \omit
- ###
- The QPtrCollection entry is unsatisfactory. The xref is missing
- its list and saying "no direct equivalent" with so suggestions
- seems feeble.
- \endomit
-
- See \l{Generic Containers} for a list of Qt 4 containers.
-
- \section1 QPtrDict<T>
-
- \c QPtrDict<T> and \c QPtrDictIterator<T> have been renamed
- Q3PtrDict<T> and Q3PtrDictIterator<T> and have been moved to the
- Qt3Support library. They have been replaced by the
- more modern QHash<Key, T> and QMultiHash<Key, T> classes and
- their associated iterator classes.
-
- When porting old code that uses Q3PtrDict<T> to Qt 4, there are
- four classes that you can use:
-
- \list
- \o QMultiHash<void *, T *>
- \o QMultiHash<void *, T>
- \o QHash<void *, T *>
- \o QHash<void *, T>
- \endlist
-
- (You can naturally use other types than \c{void *} for the key
- type, e.g. \c{QWidget *}.)
-
- To port Q3PtrDict<T> to Qt 4, read the \l{#qdict.section}{section
- on QDict<T>}, mentally substituting \c{void *} for QString.
-
- \target qptrlist.section
- \section1 QPtrList<T>
-
- QPtrList<T>, QPtrListIterator<T>, and QPtrListStdIterator<T> have
- been moved to the Qt3Support library. They have been
- replaced by the more modern QList and QLinkedList classes and
- their associated iterator classes.
-
- When porting to Qt 4, you have the choice of using QList<T> or
- QLinkedList<T> as alternatives to QValueList<T>. QList<T> has an
- index-based API and provides very fast random access
- (QList::operator[]), whereas QLinkedList<T> has an iterator-based
- API.
-
- The following table summarizes the API differences between
- QPtrList<T> and QList<T *>:
-
- \table
- \header \o QPtrList function \o QList equivalent
- \row \o QPtrList::contains(const T *) \o QList::count(T *)
- \row \o QPtrList::containsRef(const T *) \o QList::count(T *)
- \row \o QPtrList::find(const T *) \o See remark below
- \row \o QPtrList::findRef(const T *) \o See remark below
- \row \o QPtrList::getFirst() \o QList::first()
- \row \o QPtrList::getLast() \o QList::last()
- \row \o QPtrList::inSort(const T *) \o N/A
- \row \o QPtrList::remove(const T *) \o QList::removeAll(T *)
- \row \o QPtrList::remove(uint) \o QList::removeAt(int)
- \row \o QPtrList::removeNode(QLNode *) \o N/A
- \row \o QPtrList::removeRef(const T *) \o QList::removeAll(T *)
- \row \o QPtrList::sort() \o See remark below
- \row \o QPtrList::takeNode(QLNode *) \o N/A
- \row \o QPtrList::toVector(QGVector *) \o See remark below
- \endtable
-
- Remarks:
-
- \list 1
- \o QPtrList::toVector(QGVector *) can be replaced by
- QVector::resize() and qCopy().
-
- \oldcode
- QPtrList<QWidget> list;
- ...
- QPtrVector<QWidget> vector;
- list.toVector(&vector);
- \newcode
- QList<QWidget *> list;
- ...
- QVector<QWidget *> vector;
- vector.resize(list.size());
- qCopy(list.begin(), list.end(), vector.begin());
- \endcode
-
- \o QPtrList::sort() relied on the virtual compareItems() to
- sort items. In Qt 4, you can use \l qSort() instead and pass
- your "compare item" function as an argument.
-
- \o QPtrList::find(const T *) returns an iterator, whereas
- QList::indexOf(T *) returns an index. To convert an index
- into an iterator, add the index to QList::begin().
-
- \o QPtrList::removeFirst() and QPtrList::removeLast() return a \c
- bool that indicates whether the element was removed or not.
- The corresponding QList functions return \c void. You can
- achieve the same result by calling QList::isEmpty() before
- attempting to remove an item.
- \endlist
-
- If you use QPtrList's auto-delete feature (by calling
- QPtrList::setAutoDelete(true)), you need to do some more work.
- You have two options: Either you call \c delete yourself whenever
- you remove an item from the container, or you can use QList<T>
- instead of QList<T *> (i.e. store values directly instead of
- pointers to values). Here, we'll see when to call \c delete.
-
- \omit
- (See \l{What's Wrong with Auto-Delete} for an explanation of why
- the Qt 4 containers don't offer that feature.)
- \endomit
-
- The following table summarizes the idioms that you need to watch
- out for if you want to call \c delete yourself.
-
- \table
- \header \o QPtrList idiom \o QList idiom
- \row
- \o
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 19
- \o
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 20
- \row
- \o
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 21
- \o
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 22
- \row
- \o
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 23
- \o
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 24
- \row
- \o
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 25
- \o
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 26
- \row
- \o
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 27
- \o
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 28
- \row
- \o
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 29
- (removes the current item)
-
- \o
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 30
- \row
- \o
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 31
-
- (also called from QPtrList's destructor)
-
- \o
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 32
-
- In 99% of cases, the following idiom also works:
-
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 33
-
- However, it may lead to crashes if \c list is referenced from
- the value type's destructor, because \c list contains
- dangling pointers until clear() is called.
- \endtable
-
- Be aware that QPtrList's destructor automatically calls clear().
- If you have a QPtrList data member in a custom class and use the
- auto-delete feature, you will need to call \c delete on all the
- items in the container from your class destructor to avoid a
- memory leak.
-
- QPtrList had the concept of a "current item", which could be used
- for traversing the list without using an iterator. When porting
- to Qt 4, you can use the Java-style QListIterator<T *> (or
- QMutableListIterator<T *>) class instead. The following table
- summarizes the API differences:
-
- \table
- \header \o QPtrList function \o QListIterator equivalent
- \row \o QPtrList::at() \o N/A
- \row \o QPtrList::current() \o QMutableListIterator::value()
- \row \o QPtrList::currentNode() \o N/A
- \row \o QPtrList::findNext(const T *) \o QListIterator::findNext(const T *)
- \row \o QPtrList::findNextRef(const T *) \o QListIterator::findNext(const T *)
- \row \o QPtrList::first() \o QPtrList::toFront()
- \row \o QPtrList::last() \o QPtrList::toBack()
- \row \o QPtrList::next() \o QPtrList::next()
- \row \o QPtrList::prev() \o QPtrList::previous()
- \row \o QPtrList::remove() \o QMutableListIterator::remove()
- \row \o QPtrList::take() \o QMutableListIterator::remove()
- \endtable
-
- Be aware that QListIterator has a different way of iterating than
- QPtrList. A typical loop with QPtrList looks like this:
-
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 34
-
- Here's the equivalent QListIterator loop:
-
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 35
-
- Finally, QPtrListIterator<T> must also be ported. There are no
- fewer than four iterator classes that can be used as a
- replacement: QList::const_iterator, QList::iterator,
- QListIterator, and QMutableListIterator. The most straightforward
- class to use when porting is QMutableListIterator<T *> (if you
- modify the list through the iterator) or QListIterator<T *> (if
- you don't). The following table summarizes the API differences:
-
- \table
- \header \o QPtrListIterator function \o Qt 4 equivalent
- \row \o QPtrListIterator::atFirst() \o !QListIterator::hasPrevious() (notice the \c{!})
- \row \o QPtrListIterator::atLast() \o !QListIterator::hasNext() (notice the \c{!})
- \row \o QPtrListIterator::count() \o QList::count() or QList::size()
- \row \o QPtrListIterator::current() \o QMutableListIterator::value()
- \row \o QPtrListIterator::isEmpty() \o QList::isEmpty()
- \row \o QPtrListIterator::toFirst() \o QListIterator::toFront()
- \row \o QPtrListIterator::toLast() \o QListIterator::toBack()
- \row \o QPtrListIterator::operator() \o QMutableListIterator::value()
- \row \o QPtrListIterator::operator*() \o QMutableListIterator::value()
- \endtable
-
- Again, be aware that QListIterator has a different way of
- iterating than QPtrList. A typical loop with QPtrList looks like
- this:
-
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 36
-
- Here's the equivalent QListIterator loop:
-
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 37
-
- Finally, QPtrListStdIterator<T> must also be ported. This is
- easy, because QList also provides STL-style iterators
- (QList::iterator and QList::const_iterator).
-
- \section1 QPtrQueue<T>
-
- QPtrQueue has been moved to the Qt3Support library.
- It has been replaced by the more modern QQueue class.
-
- The following table summarizes the differences between
- QPtrQueue<T> and QQueue<T *>:
-
- \table
- \header \o QPtrQueue function \o QQueue equivalent
- \row \o QPtrQueue::autoDelete() \o See discussion below
- \row \o QPtrQueue::count() \o QQueue::count() or QQueue::size() (equivalent)
- \row \o QPtrQueue::current() \o QQueue::head()
- \row \o QPtrQueue::remove() \o QQueue::dequeue()
- \row \o QPtrQueue::setAutoDelete() \o See discussion below
- \endtable
-
- If you use QPtrQueue's auto-delete feature (by calling
- QPtrQueue::setAutoDelete(true)), you need to do some more work.
- You have two options: Either you call \c delete yourself whenever
- you remove an item from the container, or you can use QQueue<T>
- instead of QQueue<T *> (i.e. store values directly instead of
- pointers to values). Here, we will show when to call \c delete.
-
- \omit
- (See \l{What's Wrong with Auto-Delete} for an explanation of why
- the Qt 4 containers don't offer that feature.)
- \endomit
-
- \table
- \header \o QPtrQueue idiom \o QQueue idiom
- \row
- \o
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 38
- \o
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 39
- \row
- \o
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 40
- \o
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 41
- \row
- \o
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 42
-
- (also called from QPtrQueue's destructor)
-
- \o
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 43
-
- In 99% of cases, the following idiom also works:
-
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 44
-
- However, it may lead to crashes if \c queue is referenced
- from the value type's destructor, because \c queue contains
- dangling pointers until clear() is called.
- \endtable
-
- \section1 QPtrStack<T>
-
- QPtrStack has been moved to the Qt3Support library.
- It has been replaced by the more modern QStack class.
-
- The following table summarizes the differences between
- QPtrStack<T> and QStack<T *>:
-
- \table
- \header \o QPtrStack function \o QStack equivalent
- \row \o QPtrStack::autoDelete() \o See discussion below
- \row \o QPtrStack::count() \o QStack::count() or QStack::size() (equivalent)
- \row \o QPtrStack::current() \o QStack::top()
- \row \o QPtrStack::remove() \o QStack::pop()
- \row \o QPtrStack::setAutoDelete() \o See discussion below
- \endtable
-
- If you use QPtrStack's auto-delete feature (by calling
- QPtrStack::setAutoDelete(true)), you need to do some more work.
- You have two options: Either you call \c delete yourself whenever
- you remove an item from the container, or you can use QStack<T>
- instead of QStack<T *> (i.e. store values directly instead of
- pointers to values). Here, we will show when to call \c delete.
-
- \omit
- (See \l{What's Wrong with Auto-Delete} for an explanation of why
- the Qt 4 containers don't offer that feature.)
- \endomit
-
- \table
- \header \o QPtrStack idiom \o QStack idiom
- \row
- \o
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 45
- \o
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 46
- \row
- \o
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 47
- \o
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 48
- \row
- \o
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 49
-
- (also called from QPtrStack's destructor)
-
- \o
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 50
-
- In 99% of cases, the following idiom also works:
-
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 51
-
- However, it may lead to crashes if \c stack is referenced
- from the value type's destructor, because \c stack contains
- dangling pointers until clear() is called.
- \endtable
-
- \section1 QPtrVector<T>
-
- QPtrVector<T> has been moved to Qt3Support. It has been replaced
- by the more modern QVector class.
-
- When porting to Qt 4, you can use QVector<T *> as an alternative
- to QPtrVector<T>. The APIs of QPtrVector<T> and QVector<T *> are
- somewhat similar. The main issue is that QPtrVector supports
- auto-delete whereas QVector doesn't.
-
- \omit
- (See \l{What's Wrong with Auto-Delete} for an explanation of why
- the Qt 4 containers don't offer that feature.)
- \endomit
-
- The following table summarizes the API differences between the
- two classes:
-
- \table
- \header \o QPtrVector function \o QVector equivalent
- \row \o QPtrVector::autoDelete() \o See discussion below
- \row \o QPtrVector::bsearch(const T *) \o \l qBinaryFind()
- \row \o QPtrVector::contains(const T *) \o QVector::count(T *)
- \row \o QPtrVector::containsRef(const T *) \o QVector::count(T *)
- \row \o QPtrVector::count() \o See remark below
- \row \o QPtrVector::insert(uint, T *) \o See remark below
- \row \o QPtrVector::isNull() \o N/A
- \row \o QPtrVector::remove(uint) \o See remark below
- \row \o QPtrVector::setAutoDelete() \o See discussion below
- \row \o QPtrVector::sort() \o \l qSort()
- \row \o QPtrVector::take(uint) \o See remark below
- \row \o QPtrVector::toList(QGList *) \o QList::QList(const QVector &)
- \endtable
-
- Remarks:
-
- \list 1
- \o QPtrVector::insert(uint, T *) sets an item to store a certain
- pointer value. This is \e not the same as QVector::insert(int, T *),
- which creates space for the item by moving following items by
- one position. Use \c{vect[i] = ptr} to set a QVector item to
- a particular value.
- \o QPtrVector::remove(uint) sets an item to be 0. This is \e not
- the same as QVector::removeAt(int), which entirely erases the
- item, reducing the size of the vector. Use \c{vect[i] = 0} to
- set a QVector item to 0.
- \o Likewise, QPtrVector::take(uint) sets an item to be 0 and
- returns the previous value of the item. Again, this is easy to
- achieve using QVector::operator[]().
- \o QPtrVector::count() returns the number of non-null items in
- the vector, whereas QVector::count() (like QVector::size())
- returns the number of items (null or non-null) in the vector.
- Fortunately, it's not too hard to simulate QPtrVector::count().
-
- \oldcode
- int numValidItems = vect.count();
- \newcode
- int numValidItems = vect.size() - vect.count(0);
- \endcode
- \endlist
-
- If you use QVector's auto-delete feature (by calling
- QVector::setAutoDelete(true)), you need to do some more work. You
- have two options: Either you call \c delete yourself whenever you
- remove an item from the container, or you use QVector<T> instead
- of QVector<T *> (i.e. store values directly instead of pointers
- to values). Here, we'll see when to call \c delete.
-
- The following table summarizes the idioms that you need to watch
- out for if you want to call \c delete yourself.
-
- \table
- \header \o QPtrVector idiom \o QVector idiom
- \row
- \o
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 52
- \o
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 53
- \row
- \o
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 54
- \o
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 55
- \row
- \o
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 56
- \o
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 57
- \row
- \o
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 58
- \o
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 59
- \row
- \o
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 60
-
- (also called from QPtrVector's destructor)
-
- \o
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 61
-
- In 99% of cases, the following idiom also works:
-
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 62
-
- However, it may lead to crashes if \c vect is referenced from
- the value type's destructor, because \c vect contains
- dangling pointers until clear() is called.
- \endtable
-
- Be aware that QPtrVector's destructor automatically calls
- clear(). If you have a QPtrVector data member in a custom class
- and use the auto-delete feature, you will need to call \c delete
- on all the items in the container from your class destructor to
- avoid a memory leak.
-
- \section1 QPushButton
-
- See \l{#properties}{Properties} for a list of QPushButton
- properties in Qt 3 that have changed in Qt 4.
-
- \section1 QRangeControl
-
- In Qt 3, various "range control" widgets (QDial, QScrollBar,
- QSlider, and QSpin) inherited from both QWidget and
- \c QRangeControl.
-
- In Qt 4, \c QRangeControl has been replaced with the new
- QAbstractSlider and QAbstractSpinBox classes, which inherit from
- QWidget and provides similar functionality. Apart from eliminating
- unnecessary multiple inheritance, the new design allows
- QAbstractSlider to provide signals, slots, and properties.
-
- The old \c QRangeControl class has been renamed Q3RangeControl
- and moved to the Qt3Support library, together with
- the (undocumented) \c QSpinWidget class.
-
- If you use \c QRangeControl as a base class in your application,
- you can switch to use QAbstractSlider or QAbstractSpinBox instead.
-
- \oldcode
- class VolumeControl : public QWidget, public QRangeControl
- {
- ...
- protected:
- void valueChange() {
- update();
- emit valueChanged(value());
- }
- void rangeChange() {
- update();
- }
- void stepChange() {
- update();
- }
- };
- \newcode
- class VolumeControl : public QAbstractSlider
- {
- ...
- protected:
- void sliderChange(SliderChange change) {
- update();
- if (change == SliderValueChange)
- emit valueChanged(value());
- }
- };
- \endcode
-
- \section1 QRegExp
-
- The search() and searchRev() functions have been renamed to indexIn()
- and lastIndexIn() respectively.
-
- \section1 QRegion
-
- The following changes have been made to QRegion in Qt 4:
-
- \list
- \o There is no longer any difference between a \e null region and
- an \e empty region. Use isEmpty() in most places where you
- would have used a null QRegion.
- \o QRegion::rects() used to return a QMemArray<QRect>. It now returns
- a QVector<QRect>.
- \endlist
-
- \section1 QScrollBar
-
- See \l{#properties}{Properties} for a list of QScrollBar
- properties in Qt 3 that have changed in Qt 4.
-
- \section1 QScrollView
-
- The \c QScrollView class has been renamed Q3ScrollView and moved
- to the Qt3Support library. It has been replaced by
- the QAbstractScrollArea and QScrollArea classes.
-
- Note that Qt 4 in general uses the QScrollArea::widget() function
- where Qt 3 used QScrollView::viewport(). The rationale for this is
- that it is no longer possible to draw directly on a scroll
- area. The QScrollArea::widget() function returns the widget set on
- the scroll area.
-
- \c QScrollView was designed to work around the 16-bit limitation
- on widget coordinates found on most window systems. In Qt 4, this
- is done transparently for \e all widgets, so there is no longer a
- need for such functionality in \c QScrollView. For that reason,
- the new QAbstractScrollArea and QScrollArea classes are much more
- lightweight, and concentrate on handling scroll bars.
-
- \section1 QServerSocket
-
- The \c QServerSocket class has been renamed Q3ServerSocket and
- moved to the Qt3Support library. In Qt 4, it has been
- replaced by QTcpServer.
-
- With Q3ServerSocket, connections are accepted by reimplementing a
- virtual function (Q3ServerSocket::newConnection()). With
- QTcpServer, on the other hand, you don't need to subclass.
- Instead, simply connect to the QTcpServer::newConnection()
- signal.
-
- \section1 QSettings
-
- The QSettings class has been rewritten to be more robust and to
- respect existing standards (e.g., the INI file format). The API
- has also been extensively revised. The old API is still provided
- when Qt 3 support is enabled.
-
- Since the format and location of settings have changed between Qt
- 3 and Qt 4, the Qt 4 version of your application won't recognize
- settings written using Qt 3.
-
- \section1 QShared
-
- The \c QShared class has been obsoleted by the more powerful
- QSharedData and QSharedDataPointer as a means of creating custom
- implicitly shared classes. It has been renamed Q3Shared moved to
- the Qt3Support library.
-
- An easy way of porting to Qt 4 is to include this class into your
- project and to use it instead of \c QShared:
-
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 63
-
- If possible, we recommend that you use QSharedData and
- QSharedDataPointer instead. They provide thread-safe reference
- counting and handle all the reference counting behind the scenes,
- eliminating the risks of forgetting to increment or decrement the
- reference count.
-
- \section1 QSignal
-
- The QSignal class has been renamed to Q3Signal and moved to the
- Qt3Support library. The preferred approach is to create your own
- QObject subclass with a signal that has the desired signature.
- Alternatively, you can call QMetaObject::invokeMethod() if you
- want to invoke a slot.
-
- \section1 QSimpleRichText
-
- QSimpleRichText has been obsoleted by QTextDocument. It has
- bene renamed Q3SimpleRichText and moved to the Qt3Support
- library.
-
- Previously, you would do the following with Q3SimpleRichText:
-
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 63a
-
- However, with QTextDocument, you use the following code instead:
-
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 63b
-
- See \l{Rich Text Processing} for an overview of the Qt 4 rich
- text classes.
-
- \section1 QSlider
-
- The QSlider::sliderStart() and QSlider::sliderRect() functions
- have been removed.
-
- The slider's rect can now be retrieved using the code snippet below:
-
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 63c
-
- In addition, the direction of a vertical QSlider has changed,
- i.e. the bottom is now the minimum, and the top the maximum. You
- can use the QAbstractSlider::invertedAppearance property to
- control this behavior.
-
- See \l{#properties}{Properties} for a list of QSlider properties
- in Qt 3 that have changed in Qt 4.
-
- \section1 QSocket
-
- The \c QSocket class has been renamed Q3Socket and moved to the
- Qt3Support library. In Qt 4, it has been replaced by
- the QTcpSocket class, which inherits most of its functionality
- from QAbstractSocket.
-
- \section1 QSocketDevice
-
- The \c QSocketDevice class has been renamed Q3SocketDevice and
- moved to the Qt3Support library. In Qt 4, there is no
- direct equivalent to Q3SocketDevice:
-
- \list \o If you use Q3SocketDevice in a thread to perform blocking
- network I/O (a technique encouraged by the \e{Qt Quarterly}
- article \l{http://qt.nokia.com/doc/qq/qq09-networkthread.html}
- {Unblocking Networking}), you can now use QTcpSocket, QFtp, or
- QNetworkAccessManager, which can be used from non-GUI threads.
-
- \o If you use Q3SocketDevice for UDP, you can now use QUdpSocket instead.
-
- \o If you use Q3SocketDevice for other uses, Qt 4 offers no
- alternative right now. However, there is a \c QAbstractSocketEngine
- internal class that offers a low-level socket API similar to
- Q3SocketDevice. Should the need for such functionality arise in
- Qt 4 applications, we will consider making this class public in a
- future release.
- \endlist
-
- \section1 QSortedList
-
- The QSortedList<T> class has been deprecated since Qt 3.0. In Qt
- 4, it has been moved to the Qt3Support library.
-
- In new code, we recommend that you use QList<T> instead and use
- \l qSort() to sort the items.
-
- \section1 QSplitter
-
- The function setResizeMode() has been moved into Qt3Support. Set
- the stretch factor in the widget's size policy to get equivalent
- functionality.
-
- The obsolete function drawSplitter() has been removed. Use
- QStyle::drawPrimitive() to acheive similar functionality.
-
- \section1 QSpinBox
-
- See \l{#properties}{Properties} for a list of QSpinBox properties
- in Qt 3 that have changed in Qt 4.
-
- \section1 QSqlCursor
-
- The \c QSqlCursor class has been renamed Q3SqlCursor and moved to
- the Qt3Support library. In Qt 4, you can use
- QSqlQuery, QSqlQueryModel, or QSqlTableModel, depending on
- whether you want a low-level or a high-level interface for
- accessing databases.
-
- See \l{QtSql Module} for an overview of the new SQL classes.
-
- \section1 QSqlDatabase
-
- QSqlDatabase is now a smart pointer that is passed around by
- value. Simply replace all QSqlDatabase pointers by QSqlDatabase
- objects.
-
- \section1 QSqlEditorFactory
-
- The \c QSqlEditorFactory class has been renamed
- Q3SqlEditorFactory and moved to Qt3Support.
-
- See \l{QtSql Module} for an overview of the new SQL classes.
-
- \section1 QSqlError
-
- The enum \c{Type} was renamed to \c{ErrorType}, The values were renamed as well:
-
- \list
- \o None - use NoError instead
- \o Connection - use ConnectionError instead
- \o Statement - use StatementError instead
- \o Transaction - use TransactionError instead
- \o Unknown - use UnknownError instead
- \endlist
-
- \section1 QSqlFieldInfo
-
- The QSqlFieldInfo class has been moved to Qt3Support. Its
- functionality is now provided by the QSqlField class.
-
- See \l{QtSql Module} for an overview of the new SQL classes.
-
- \section1 QSqlForm
-
- The \c QSqlForm class has been renamed Q3SqlForm and moved to the
- Qt3Support library.
-
- See \l{QtSql Module} for an overview of the new SQL classes.
-
- \section1 QSqlPropertyMap
-
- The \c QSqlPropertyMap class has been renamed Q3SqlPropertyMap
- moved to the Qt3Support library.
-
- See \l{QtSql Module} for an overview of the new SQL classes.
-
- \section1 QSqlQuery
-
- QSqlQuery::prev() was renamed to QSqlQuery::previous().
- QSqlQuery::prev() remains, but it just calls previous().
- QSqlQuery no longer has any virtual methods, i.e., exec(),
- value(), seek(), next(), prev(), first(), last(), and the
- destructor are no longer virtual.
-
- \section1 QSqlRecord
-
- QSqlRecord behaves like a vector now, QSqlRecord::insert() will
- actually insert a new field instead of replacing the existing
- one.
-
- \section1 QSqlRecordInfo
-
- The QSqlRecordInfo class has been moved to Qt3Support. Its
- functionality is now provided by the QSqlRecord class.
-
- See \l{QtSql Module} for an overview of the new SQL classes.
-
- \section1 QSqlSelectCursor
-
- The \c QSqlSelectCursor class has been renamed Q3SqlSelectCursor
- and moved to the Qt3Support library.
-
- See \l{QtSql Module} for an overview of the new SQL classes.
-
- \section1 QStoredDrag
-
- The \c QStoredDrag class has been renamed Q3StoredDrag and moved
- to the Qt3Support library. In Qt 4, use QMimeData
- instead and call QMimeData::setData() to set the data.
-
- See \l{Porting to Qt 4 - Drag and Drop} for a comparison between
- the drag and drop APIs in Qt 3 and Qt 4.
-
- \section1 QStr(I)List
-
- The QStrList and QStrIList convenience classes have been
- deprecated since Qt 2.0. In Qt 4, they have been moved to the
- Qt3Support library. If you used any of these, we
- recommend that you use QStringList or QList<QByteArray> instead.
-
- \section1 QStr(I)Vec
-
- The QStrVec and QStrIVec convenience classes have been deprecated
- since Qt 2.0. In Qt 4, they have been moved to Qt3Support. If you
- used any of these, we recommend that you use QStringList or
- QList<QByteArray> instead.
-
- \section1 QString
-
- Here are the main issues to be aware of when porting QString to
- Qt 4:
-
- \list 1
- \o The QString::QString(QChar) constructor performed implicit
- conversion in Qt 3. Now, you will need a cast to convert a
- QChar to a QString.
-
- \o The QString::QString(const QByteArray &) constructor used to
- stop at the first '\\0' it encountered, for compatibility
- with Qt 1. This quirk has now been fixed; in Qt 4, the
- resulting QString always has the same length as the
- QByteArray that was passed to the constructor.
-
- \o The QString::null static constant has been deprecated in Qt
- 4. For compatibility, Qt 4 provides a QString::null symbol
- that behaves more or less the same as the old constant. The
- new idiom is to write QString() instead of QString::null, or
- to call clear().
-
- \oldcode
- str1 = QString::null;
- if (str2 == QString::null)
- do_something(QString::null);
- \newcode
- str1.clear();
- if (str2.isNull())
- do_something(QString());
- \endcode
-
- In new code, we recommend that you don't rely on the
- distinction between a null string and a (non-null) empty
- string. See \l{Distinction Between Null and Empty Strings}
- for details.
-
- \o QString::latin1() and QString::ascii() have been replaced
- with QString::toLatin1() and QString::toAscii(), which return
- a QByteArray instead of a (non-reentrant) \c{const char *}.
- For consistency, QString::utf8() and QString::local8Bit(),
- which already returned a QByteArray (actually a \c QCString),
- have been renamed QString::toUtf8() and
- QString::toLocal8Bit().
-
- To obtain a \c{const char *} pointer to ASCII or Latin-1 data,
- use QString::toAscii() or QString::toLatin1() to obtain a
- QByteArray containing the data, then call QByteArray::constData()
- to access the character data directly. Note that the pointer
- returned by this function is only valid for the lifetime of the
- byte array; you should avoid taking a pointer to the data
- contained in temporary objects.
-
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 64
-
- In the above example, the \c goodData pointer is valid for the lifetime
- of the \c asciiData byte array. If you need to keep a copy of the data
- in a non-Qt data structure, use standard C memory allocation and string
- copying functions to do so \e before destroying the byte array.
-
- \o QString::at() returned a non-const reference, whereas the
- new QString::at() returns a const value. Code like
-
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 65
-
- will no longer compile. Instead, use QString::operator[]:
-
- \snippet doc/src/snippets/code/doc_src_porting4.qdoc 66
-
- \o The QString::contains(\e x) function (where \e x is a
- character or a string) has been renamed QString::count(\e x).
- In addition, there now exists a set of QString::contains()
- functions that returns a boolean value. Replace old calls to
- contains() with either count() or contains(), depending on
- whether you care about the specific number of occurrences of
- a character in the string or only care about whether the
- string contains that character or not.
-
- \o Many functions in QString had a \c bool parameter that
- specified case sensitivity. In Qt 4, in the interest of code
- readability and maintainability, the \c bool parameters have
- been replaced by the Qt::CaseSensitivity enum, which can take
- the values Qt::CaseSensitive and Qt::CaseInsensitive.
-
- \oldcode
- if (url.startsWith("http:", false))
- ...
- \newcode
- if (url.startsWith("http:", Qt::CaseInsensitive))
- ...
- \endcode
-
- \o The QString::setExpand(uint, QChar) function, which already
- was obsolete in Qt 3, is no longer available. Use
- QString::operator[] instead.
-
- \oldcode
- str.setExpand(32, '$');
- \newcode
- str[32] = '$';
- \endcode
-
- \o The \c QT_NO_ASCII_CAST and \c QT_NO_CAST_ASCII macros have
- been renamed \c QT_NO_CAST_TO_ASCII and \c
- QT_NO_CAST_FROM_ASCII, respectively.
-
- \o The QString::data() used to return the same as
- QString::ascii(). It now returns a pointer to the Unicode
- data stored in the QString object. Call QString::ascii() if
- you want the old behavior.
-
- \o QString::arg() now converts two-digit place markers, allowing
- up to 99 place markers to be used in any given string.
-
- \o Comparisons between QStrings and \c NULL in order to determine
- whether strings are empty are no longer allowed.
- Use \l{QString::}{isEmpty()} instead.
-
- \endlist
-
- \section1 QStringList
-
- QStringList now inherits from QList<QString> and can no longer be
- converted to a QValueList<QString>. Since QValueList inherits QList a
- cast will work as expected.
-
- This change implies some API incompatibilities for QStringList.
- For example, at() returns the string, not an iterator. See the
- \l{#qvaluelist.section}{section on QValueList} for details.
-
- The static QStringList::split() function for splitting strings into
- lists of smaller strings has been replaced by QString::split(),
- which returns a QStringList.
-
- \section1 QStyle
-
- The QStyle API has been overhauled and improved. Most of the information on
- why this change was done is described in \l{The Qt 4 Style API}{the QStyle overview}.
-
- Since QStyle is mostly used internally by Qt's widgets and styles and since
- it is not essential to the good functioning of an application, there is no
- compatibility path. This means that we have changed many enums and
- functions and the qt3to4 porting tool will not change much in your qstyle
- code. To ease the pain, we list some of the major changes here.
-
- QStyleOption has taken on a more central role and is no longer an optional
- argument, please see the QStyleOption documentation for more information.
-
- The QStyle::StyleFlags have been renamed QStyle::StateFlags and are now prefixed State_
- instead of Style_, in addition the Style_ButtonDefault flag has moved to
- QStyleOptionButton.
-
- The QStyle::PrimitiveElement enumeration has undergone extensive change.
- Some of the enums were moved to QStyle::ControlElement, some were removed
- and all were renamed. This renaming is not done by the qt3to4 porting tool,
- so you must do it yourself. The table below shows how things look
- now.
-
- \table
- \header \o Old name \o New name \o Remark
- \row \o \c PE_ButtonCommand \o QStyle::PE_PanelButtonCommand
- \row \o \c PE_ButtonDefault \o QStyle::PE_FrameDefaultButton
- \row \o \c PE_ButtonBevel \o QStyle::PE_PanelButtonBevel
- \row \o \c PE_ButtonTool \o QStyle::PE_PanelButtonTool
- \row \o \c PE_ButtonDropDown \o QStyle::PE_IndicatorButtonDropDown
- \row \o \c PE_FocusRect \o QStyle::PE_FrameFocusRect
- \row \o \c PE_ArrowUp \o QStyle::PE_IndicatorArrowUp
- \row \o \c PE_ArrowDown \o QStyle::PE_IndicatorArrowDown
- \row \o \c PE_ArrowRight \o QStyle::PE_IndicatorArrowRight
- \row \o \c PE_ArrowLeft \o QStyle::PE_IndicatorArrowLeft
- \row \o \c PE_SpinBoxUp \o QStyle::PE_IndicatorSpinUp
- \row \o \c PE_SpinBoxDown \o QStyle::PE_IndicatorSpinDown
- \row \o \c PE_SpinBoxPlus \o QStyle::PE_IndicatorSpinPlus
- \row \o \c PE_SpinBoxMinus \o QStyle::PE_IndicatorSpinMinus
- \row \o \c PE_SpinBoxSlider \o QStyle::CE_SpinBoxSlider \o uses QStyle::drawControl()
- \row \o \c PE_Indicator \o QStyle::PE_IndicatorCheckBox
- \row \o \c PE_IndicatorMask \o N/A \o use QStyle::styleHint() to retrieve mask
- \row \o \c PE_ExclusiveIndicator \o QStyle::PE_IndicatorRadioButton
- \row \o \c PE_ExclusiveIndicatorMask \o N/A \o use QStyle::styleHint() to retrieve mask
- \row \o \c PE_DockWindowHandle \o QStyle::PE_IndicatorToolBarHandle
- \row \o \c PE_DockWindowSeparator \o QStyle::PE_Q3DockWindowSeparator
- \row \o \c PE_DockWindowResizeHandle \o QStyle::PE_IndicatorDockWindowResizeHandle
- \row \o \c PE_DockWindowTitle \o QStyle::CE_DockWindowTitle \o uses QStyle::drawControl()
- \row \o \c PE_Splitter \o QStyle::CE_Splitter \o uses QStyle::drawControl()
- \row \o \c PE_Panel \o QStyle::PE_Frame
- \row \o \c PE_PanelMenu \o QStyle::PE_FrameMenu
- \row \o \c PE_PanelMenuBar \o QStyle::PE_PanelMenuBar
- \row \o \c PE_PanelDockWindow \o QStyle::PE_FrameDockWindow
- \row \o \c PE_TabBarBase \o QStyle::PE_FrameTabBarBase
- \row \o \c PE_HeaderSection \o QStyle::CE_HeaderSection \o uses QStyle::drawControl()
- \row \o \c PE_HeaderArrow \o QStyle::PE_IndicatorHeaderArrow
- \row \o \c PE_StatusBarSection \o QStyle::PE_FrameStatusBar
- \row \o \c PE_Separator \o QStyle::PE_Q3Separator
- \row \o \c PE_SizeGrip \o QStyle::CE_SizeGrip \o uses QStyle::drawControl()
- \row \o \c PE_CheckMark \o QStyle::PE_IndicatorMenuCheckMark
- \row \o \c PE_ScrollBarAddLine \o QStyle::CE_ScrollBarAddLine \o uses QStyle::drawControl()
- \row \o \c PE_ScrollBarSubLine \o QStyle::CE_ScrollBarSubLine \o uses QStyle::drawControl()
- \row \o \c PE_ScrollBarAddPage \o QStyle::CE_ScrollBarAddPage \o uses QStyle::drawControl()
- \row \o \c PE_ScrollBarSubPage \o QStyle::CE_ScrollBarSubPage \o uses QStyle::drawControl()
- \row \o \c PE_ScrollBarSlider \o QStyle::CE_ScrollBarSlider \o uses QStyle::drawControl()
- \row \o \c PE_ScrollBarFirst \o QStyle::CE_ScrollBarFirst \o uses QStyle::drawControl()
- \row \o \c PE_ScrollBarLast \o QStyle::CE_ScrollBarLast \o uses QStyle::drawControl()
- \row \o \c PE_ProgressBarChunk \o QStyle::PE_IndicatorProgressChunk
- \row \o \c PE_PanelLineEdit \o QStyle::PE_FrameLineEdit
- \row \o \c PE_PanelTabWidget \o QStyle::PE_FrameTabWidget
- \row \o \c PE_WindowFrame \o QStyle::PE_FrameWindow
- \row \o \c PE_CheckListController \o QStyle::PE_Q3CheckListController
- \row \o \c PE_CheckListIndicator \o QStyle::PE_Q3CheckListIndicator
- \row \o \c PE_CheckListExclusiveIndicato\o QStyle::PE_Q3CheckListExclusiveIndicator
- \row \o \c PE_PanelGroupBox \o QStyle::PE_FrameGroupBox
- \row \o \c PE_TreeBranch \o QStyle::PE_IndicatorBranch
- \row \o \c PE_RubberBand \o QStyle::CE_RubberBand \o uses QStyle::drawControl()
- \row \o \c PE_PanelToolBar \o QStyle::PE_PanelToolBar
- \row \o \c PE_ToolBarHandle \o QStyle::PE_IndicatorToolBarHandle
- \row \o \c PE_ToolBarSeparator \o QStyle::PE_IndicatorToolBarSeparator
- \endtable
-
- The QStyle::drawControlMask() and QStyle::drawComplexControlMask()
- functions have been removed. They are replaced with a style hint.
-
- The QStyle::drawItem() overloads that took both a pixmap and a string have
- been removed. Use QStyle::drawItemText() and QStyle::drawItemPixmap() directly.
-
- The QStyle::itemRect() overload that took both a pixmap and a string is also removed, use
- either QStyle::itemTextRect() or QStyle::itemPixmapRect() instead.
-
- \section1 QStyleSheet
-
- The QStyleSheet and QStyleSheetItem classes have been renamed
- Q3StyleSheet and Q3StyleSheetItem, and have been moved to the
- Qt3Support library.
-
- See \l{Rich Text Processing} for an overview of the Qt 4 rich
- text classes, and \l{Qt Style Sheets} for a description of
- CSS-like style sheet support in Qt 4.2 and above.
-
- \section1 QSyntaxHighlighter
-
- The \c QSyntaxHighlighter class from Qt 3 has been renamed
- Q3SyntaxHighlighter and moved to the Qt3Support library. Since Qt
- 4.1, it has been replaced by a new QSyntaxHighlighter class based
- on Qt 4's new rich text engine.
-
- \section1 QTabBar
-
- See \l{#properties}{Properties} for a list of QTabBar properties
- in Qt 3 that have changed in Qt 4.
-
- \section1 QTabDialog
-
- The \c QTabDialog class is no longer part of the public Qt API.
- It has been renamed Q3TabDialog and moved to Qt3Support. In Qt 4
- applications, you can easily obtain the same result by combining
- a QTabWidget with a QDialog and provide \l{QPushButton}s
- yourself.
-
- See also the \l{dialogs/tabdialog} example, which shows how to
- implement tab dialogs in Qt 4.
-
- \section1 QTabWidget
-
- See \l{#properties}{Properties} for a list of QTabWidget
- properties in Qt 3 that have changed in Qt 4.
-
- \section1 QTable
-
- The \c QTable, \c QTableItem, \c QComboTableItem, \c
- QCheckTableItem, and \c QTableSelection classes have been renamed
- Q3Table, Q3TableItem, Q3ComboTableItem, Q3CheckTableItem, and
- Q3TableSelection and moved to the Qt3Support library.
- New Qt applications should use the new QTableWidget or QTableView
- class instead.
-
- Some of these classes behave differently with respect to the way
- they handle \c NULL pointers. For example, Q3TableItem::setPixmap()
- no longer accepts \c NULL or 0 to indicate that the item should
- contain a null pixmap; in this case, a null pixmap should be
- constructed and passed explicitly to the function.
-
- See \l{Model/View Programming} for an overview of the new item
- view classes.
-
- \section1 QTextCodec
-
- The loadCharmap() and loadCharmapFromFile() functions are no longer
- available in Qt 4. You need to create your own codec if you want to
- create a codec based on a POSIX2 charmap definition.
-
- \section1 QTextDrag
-
- The \c QTextDrag class has been renamed Q3TextDrag and moved to
- the Qt3Support library. In Qt 4, use QMimeData
- instead and call QMimeData::setText() to set the data.
-
- See \l{Porting to Qt 4 - Drag and Drop} for a comparison between
- the drag and drop APIs in Qt 3 and Qt 4.
-
- \section1 QTextEdit
-
- The old QTextEdit and QTextBrowser classes have been renamed
- Q3TextEdit and Q3TextBrowser, and have been moved to Qt3Support.
- The new QTextEdit and QTextBrowser have a somewhat different API.
-
- The \c QTextEdit::setWrapPolicy() function has been renamed to \l{QTextEdit::setWordWrapMode()}{setWordWrapMode()} and the
- \c QTextEdit::setWrapColumnOrWidth() function has been renamed to \l{QTextEdit::setLineWrapColumnOrWidth()}
- {setLineWrapColumnOrWidth()}. The Q3TextEdit::setWrapPolicy() and Q3TextEdit::setWrapColumnOrWidth() still provide this
- functionality in the Q3TextEdit class.
-
-
- See \l{Rich Text Processing} for an overview of the Qt 4 rich
- text classes.
-
- \section1 QTextIStream
-
- The QTextIStream convenience class is no longer provided in Qt 4. Use
- QTextStream directly instead.
-
- \section1 QTextOStream
-
- The QTextOStream convenience class is no longer provided in Qt 4. Use
- QTextStream directly instead.
-
- \section1 QTextOStreamIterator
-
- The undocumented \c QTextOStreamIterator class has been removed
- from the Qt library. If you need it in your application, feel
- free to copy the source code from the Qt 3 \c <qtl.h> header
- file.
-
- \section1 QTextStream
-
- QTextStream has undergone a number of API and implementation enhancements,
- and some of the changes affect QTextStream's behavior:
-
- \list
- \o QTextStream now uses buffered writing, which means that you need to
- call QTextStream::flush(), or use the streaming manipulators \c endl or
- \c flush if you need QTextStream to flush its write buffer. The stream is
- flushed automatically if QTextStream is deleted or when the device is
- closed.
- \o QTextStream now uses buffered reading, so if you read a line from the
- stream, QTextStream will read as much as it can from the device to
- fill up its internal read buffer. This speeds up reading significantly,
- but Qt 3 code that mixed QTextStream access and direct device access
- may need to be updated.
- \o While QTextStream in Qt 3 always translated end-of-line characters from
- Windows style ("\\r\\n") to Unix style ("\\n") on Windows, QTextStream in
- Qt 4 only does this on devices opened with the \c{QIODevice::Text} mode
- (formerly \c{IO_Translate}).
- \endlist
-
- Note that when using a QTextStream on a QFile in Qt 4, calling
- QIODevice::reset() on the QFile will not have the expected result
- because QTextStream now buffers the file. Use the
- QTextStream::seek() function instead.
-
- \section1 QTextView
-
- The \c QTextView class has been renamed Q3TextView and moved to the
- Qt3Support library.
-
- \section1 QTimeEdit
-
- The QTimeEdit class in Qt 4 is a convenience class based on
- QDateTimeEdit. The old class has been renamed Q3TimeEdit and moved
- to the Qt3Support library.
-
- See \l{Porting to Qt 4 - Virtual Functions}{Virtual Functions} for
- a list of \c QTimeEdit virtual member functions in Qt 3 that are no
- longer virtual in Qt 4.
-
- \section1 QTimer
-
- Windows restricts the granularity of timers, but starting with Qt 4,
- we emulate a finer time resolution. On Windows XP we use the
- multimedia timer API, which gives us 1 millisecond resolution for
- QTimer.
-
- Note that other versions of Windows have a lower timer resolution,
- and that code relying on underlying system timer restrictions
- encounters no such limitations using Qt 4 (e.g., setting an
- interval of 0 millisecond results in Qt occupying all of the
- processor time when no GUI events need processing).
-
- \section1 QToolBar
-
- The old \c QToolBar class, which worked with the old \c
- QMainWindow and \c QDockArea classes and inherited from \c
- QDockWindow, has been renamed Q3ToolBar and moved to
- Qt3Support. Note that, when using Q3ToolBar, the toolbar's actions
- must be \l {Q3Action}s.
-
- Use the new QToolBar class in new applications.
-
- \note \l{Q3ToolBar}'s
- \l{Q3DockWindow::setHorizontallyStretchable()}{horizontallyStretchable}
- property can be achieved in QToolBar with
- \l{QWidget#Size Hints and Size Policies}{size policies}.
-
- \section1 QToolButton
-
- See \l{#properties}{Properties} for a list of QToolButton properties
- in Qt 3 that have changed in Qt 4.
-
- Note that many of the properties that could previously be set in
- the constructor must now be set separately.
-
- \section1 QToolTip
-
- The QToolTip::setGloballyEnabled() function no longer exists.
- Tooltips can be disabled by \l{QObject::installEventFilter()}{installing
- an event filter} on qApp (the unique QApplication object) to block events
- of type QEvent::ToolTip.
-
- \section1 QUriDrag
-
- The \c QUriDrag class has been renamed Q3UriDrag and moved to the
- Qt3Support library. In Qt 4, use QMimeData instead
- and call QMimeData::setUrl() to set the URL.
-
- See \l{Porting to Qt 4 - Drag and Drop} for a comparison between
- the drag and drop APIs in Qt 3 and Qt 4.
-
- \section1 QUrl
-
- The QUrl class has been rewritten from scratch in Qt 4 to be more
- standard-compliant. The old QUrl class has been renamed Q3Url and
- moved to the Qt3Support library.
-
- The new QUrl class provides an extensive list of compatibility
- functions to ease porting from Q3Url to QUrl. A few functions
- require you to change your code:
-
- \list
- \o Q3Url::Q3Url(const Q3Url &, const QString &, bool) can be
- simulated by combining the URLs manually (using
- QString::operator+(), for example).
- \o Q3Url::setEncodedPathAndQuery(const QString &) is replaced by
- QUrl::setPath() and QUrl::setEncodedQuery().
- \o Q3Url::encodedPathAndQuery() is replaced by QUrl::path() and
- QUrl::encodedQuery().
- \o Q3Url::isLocalFile() can be simulated by checking that
- QUrl::protocol() is "file".
- \o Q3Url::toString(bool, bool) is replaced by
- QUrl::toString(int), where the \c int parameter specifies a
- combination of \l{QUrl::FormattingOptions}{formatting
- options}.
- \endlist
-
- \section1 QUrlOperator
-
- The \c QUrlOperator class is no longer part of the public Qt API.
- It has been renamed Q3UrlOperator and moved to Qt3Support.
-
- From Qt 4.4, the Network Access API provides a subset of the features
- provided by \c QUrlOperator that are mostly intended for use with
- applications that use the HTTP and FTP protocols. See the
- QNetworkRequest, QNetworkReply, and QNetworkAccessManager documentation
- for further details.
-
- \target qvaluelist.section
- \section1 QValueList<T>
-
- The QValueList<T> class has been replaced by QList<T> and
- QLinkedList<T> in Qt 4. As a help when porting older Qt
- applications, the Qt3Support library contains a
- QValueList<T> class implemented in terms of the new
- QLinkedList<T>. Similarly, it contains QValueListIterator<T> and
- QValueListConstIterator<T> classes implemented in terms of
- QLinkedList<T>::iterator and QLinkedList<T>::const_iterator.
-
- When porting to Qt 4, you have the choice of using QList<T> or
- QLinkedList<T> as alternatives to QValueList<T>. QList<T> has an
- index-based API and provides very fast random access
- (QList::operator[]), whereas QLinkedList<T> has an iterator-based
- API.
-
- Here's a list of problem functions:
-
- \list
- \o QValueList(const std::list<T> &) doesn't exist in QList or
- QLinkedList. You can simulate it by calling
- \l{QLinkedList::append()}{append()} in a loop.
-
- \o QValueList::insert(iterator, size_type, const T& x) doesn't
- exist in QList or QLinkedList. Call
- \l{QLinkedList::insert()}{insert()} repeatedly instead.
-
- \o QValueList::fromLast() doesn't exist in QList or QLinkedList. Use
- QValueList::end() instead.
-
- \oldcode
- for (QValueList<T>::iterator i = list.fromLast(); i != list.begin(); --i)
- do_something(*i);
- \newcode
- QLinkedList<T>::iterator i = list.end();
- while (i != list.begin()) {
- --i; // decrement i before using it
- do_something(*i);
- }
- \endcode
-
- \o QValueList::append() and QValueList::prepend() return an
- iterator to the inserted item. QList's and QLinkedList's
- corresponding functions don't, but it's not a problem because
- QValueList::prepend() always returns begin() and append()
- always returns QValueList::end() - 1.
-
- \o QValueList::at(\e i) return an iterator to the item at index
- \e i. This corresponds to QList::begin() + \e i.
-
- \o QValueList::contains(const T &) corresponds to
- QList::count(const T &) and QLinkedList::count(const T &).
- \endlist
-
- \section1 QValueVector<T>
-
- The QValueVector<T> class has been replaced by QVector<T> in Qt
- 4. As a help when porting older Qt applications, the Qt3Support
- library contains a Q3ValueVector<T> class implemented in terms of
- the new QVector<T>.
-
- When porting from QValueVector<T> to QVector<T>, you might run
- into the following incompatibilities:
-
- \list
- \o QValueVector(const std::vector<T> &) doesn't exist in QVector.
- You can simulate it by calling QVector::append()} in a loop.
- \o QValueVector::resize(int, const T &) doesn't exist in QVector.
- If you want the new items to be initialized with a particular
- value, use QVector::insert() instead.
- \o QValueVector::at() on a non-const vector returns a non-const
- reference. This corresponds to QVector::operator[]().
- \o Both QValueVector::at() functions have an \e ok parameter of
- type \c{bool *} that is set to true if the index is within
- bounds. This functionality doesn't exist in QVector; instead,
- check the index against QVector::size() yourself.
- \endlist
-
- See \l{Generic Containers} for an overview of the Qt 4 container
- classes.
-
- \section1 QVariant
-
- Some changes to the rest of the Qt library have
- implications on QVariant:
-
- \list 1
- \o The \c QVariant::ColorGroup enum value is defined only
- if \c QT3_SUPPORT is defined.
- \o The \c QVariant::IconSet enum value has been renamed
- QVariant::Icon.
- \o The \c QVariant::CString enum value is now a synonym for
- QVariant::ByteArray.
- \endlist
-
- Also, the QVariant(bool, int) constructor has been replaced by QVariant(bool).
- Old code like QVariant(true, 0) should be replaced with QVariant(true); otherwise,
- the QVariant(int, void *) overload might accidentally be triggered.
-
- Many of QVariant's convenience functions in Qt 3, such as toColor() and
- toKeySequence(), have been removed to enable QVariant to be part of the
- QtCore module. QVariant is still able to hold values of these types.
-
- Types which are not supported by any of the QVariant constructors can be
- stored as variants with the QVariant::fromValue() function. Types with no
- suitable convenience function for unpacking can be retrieved with the
- QVariant::value() function or passed directly to classes that implement
- the QVariant() operator.
-
- \table
- \header \o Qt 3 function \o Qt 4 function
- \input porting4-removedvariantfunctions.qdocinc
- \endtable
-
- See the QVariant::Type enum for a list of types supported by QVariant.
-
- \section1 QVBox
-
- The \c QVBox class is now only available as Q3VBox in Qt 4. You
- can achieve the same result as \c QVBox by creating a QWidget
- with a vertical layout:
-
- \oldcode
- QVBox *vbox = new QVBox;
- QPushButton *child1 = new QPushButton(vbox);
- QPushButton *child2 = new QPushButton(vbox);
- \newcode
- QWidget *vbox = new QWidget;
- QPushButton *child1 = new QPushButton;
- QPushButton *child2 = new QPushButton;
-
- QVBoxLayout *layout = new QVBoxLayout;
- layout->addWidget(child1);
- layout->addWidget(child2);
- vbox->setLayout(layout);
- \endcode
-
- Note that child widgets are not automatically placed into the widget's
- layout; you will need to manually add each widget to the QVBoxLayout.
-
- \section1 QVGroupBox
-
- The \c QVGroupBox class has been renamed Q3VGroupBox and moved to
- the Qt3Support library.
- Qt 4 does not provide a specific replacement class for \c QVGroupBox
- since QGroupBox is designed to be a generic container widget. As a
- result, you need to supply your own layout for any child widgets.
-
- See \l{#QGroupBox} for more information about porting code that uses
- group boxes.
-
- \section1 QWhatsThis
-
- The QWhatsThis class has been redesigned in Qt 4. The old \c
- QWhatsThis class is available as Q3WhatsThis in Qt3Support.
-
- \section1 QWidget
-
- Widget background painting has been greatly improved, supporting
- flicker-free updates and making it possible to have
- semi-transparent widgets. This renders the following background
- handling functions obsolete:
-
- \list
- \o QWidget::repaint(bool noErase) - the \c noErase boolean parameter is gone
- \o QWidget::setBackgroundMode(BackgroundMode m)
- \o QWidget::backgroundBrush() const
- \o QWidget::setBackgroundPixmap(const QPixmap &pm)
- \o QWidget::backgroundPixmap() const
- \o QWidget::setBackgroundColor(const QColor &c)
- \o QWidget::backgroundColor() const
- \o QWidget::foregroundColor() const
- \o QWidget::eraseColor() const
- \o QWidget::setEraseColor(const QColor &c)
- \o QWidget::erasePixmap() const
- \o QWidget::setErasePixmap(const QPixmap &p)
- \o QWidget::paletteForegroundColor()
- \o QWidget::setPaletteForegroundColor(const QColor &c)
- \o QWidget::paletteBackgroundColor()
- \o QWidget::setPaletteBackgroundColor(const QColor &c)
- \o QWidget::paletteBackgroundPixmap() const
- \o QWidget::setPaletteBackgroundPixmap(const QPixmap &p)
- \o QWidget::erase()
- \o QWidget::erase(const QRect &r)
- \o QWidget::setBackgroundOrigin( BackgroundOrigin )
- \o QWidget::BackgroundOrigin backgroundOrigin() const
- \o QWidget::backgroundOffset()
- \endlist
-
- Sample code on how to do obtain similar behavior from Qt 4, previously
- handled by some of the above functions can be found in the
- \l{http://qt.nokia.com/doc/qwidget-qt3.html}{Qt 3 Support Members for QWidget}
- page.
-
- A widget now receives change events in its QWidget::changeEvent()
- handler. This makes the following virtual change handlers obsolete:
-
- \list
- \o QWidget::styleChange - use QEvent::StyleChange
- \o QWidget::enabledChange - use QEvent::EnabledChange
- \o QWidget::paletteChange - use QEvent::PaletteChange
- \o QWidget::fontChange - use QEvent::FontChange
- \o QWidget::windowActivationChange - use QEvent::ActivationChange
- \o QWidget::languageChange - use QEvent::LanguageChange
- \endlist
-
- The following functions were slots, but are no more:
- \list
- \o QWidget::clearFocus()
- \o QWidget::setMouseTracking()
- \o QWidget::stackUnder(QWidget*)
- \o QWidget::move(int x, int y)
- \o QWidget::move(const QPoint &)
- \o QWidget::resize(int w, int h)
- \o QWidget::resize(const QSize &)
- \o QWidget::setGeometry(int x, int y, int w, int h)
- \o QWidget::setGeometry(const QRect &)
- \o QWidget::adjustSize()
- \o QWidget::update(int x, int y, int w, int h)
- \o QWidget::update(const QRect&)
- \o QWidget::repaint(bool erase)
- \o QWidget::repaint(int x, int y, int w, int h, bool erase)
- \o QWidget::repaint(const QRect &, bool erase)
- \o QWidget::repaint(const QRegion &, bool erase)
- \o QWidget::setCaption(const QString &)
- \o QWidget::setIcon(const QPixmap &)
- \o QWidget::setIconText(const QString &)
- \endlist
-
- The following functions were incorrectly marked as virtual:
-
- \list
- \o QWidget::close(bool alsoDelete)
- \o QWidget::create(WId, bool, bool)
- \o QWidget::destroy(bool)
- \o QWidget::move(int x, int y)
- \o QWidget::reparent(QWidget *parent, WFlags, const QPoint &, bool)
- \o QWidget::resize(int w, int h)
- \o QWidget::setAcceptDrops(bool on)
- \o QWidget::setActiveWindow()
- \o QWidget::setAutoMask(bool)
- \o QWidget::setBackgroundColor(const QColor &)
- \o QWidget::setBackgroundMode(BackgroundMode)
- \o QWidget::setBackgroundOrigin(BackgroundOrigin)
- \o QWidget::setBackgroundPixmap(const QPixmap &)
- \o QWidget::setCaption(const QString &)
- \o QWidget::setCursor(const QCursor &)
- \o QWidget::setEnabled(bool)
- \o QWidget::setEraseColor(const QColor &)
- \o QWidget::setErasePixmap(const QPixmap &)
- \o QWidget::setFocus()
- \o QWidget::setFocusPolicy(FocusPolicy)
- \o QWidget::setFocusProxy(QWidget *)
- \o QWidget::setFont(const QFont &)
- \o QWidget::setGeometry(const QRect &)
- \o QWidget::setGeometry(int x, int y, int w, int h)
- \o QWidget::setIcon(const QPixmap &)
- \o QWidget::setIconText(const QString &)
- \o QWidget::setKeyCompression(bool)
- \o QWidget::setMask(const QBitmap &)
- \o QWidget::setMask(const QRegion &)
- \o QWidget::setMaximumSize(int maxw, int maxh)
- \o QWidget::setMicroFocusHint(int x, int y, int w, int h, bool, QFont *f)
- \o QWidget::setMinimumSize(int minw, int minh)
- \o QWidget::setMouseTracking(bool enable)
- \o QWidget::setPalette(const QPalette &)
- \o QWidget::setPaletteBackgroundColor(const QColor &)
- \o QWidget::setPaletteBackgroundPixmap(const QPixmap &)
- \o QWidget::setSizeIncrement(int w, int h)
- \o QWidget::setSizePolicy(QSizePolicy)
- \o QWidget::setUpdatesEnabled(bool enable)
- \o QWidget::setWState(uint)
- \o QWidget::show()
- \o QWidget::showFullScreen()
- \o QWidget::showMaximized()
- \o QWidget::showMinimized()
- \o QWidget::showNormal()
- \o QWidget::sizePolicy()
- \o QWidget::unsetCursor()
- \endlist
-
- The internal clearWState() function was removed. Use
- QWidget::setAttribute() instead.
-
- setWFlags() was renamed QWidget::setWindowFlags().
-
- clearWFlags() has no direct replacement. You can use
- QWidget::setAttribute() instead. For example,
- \c{setAttribute(..., false)} to clear an attribute. More information
- is available \l{http://qt.nokia.com/doc/qwidget.html#setAttribute}{here}.
-
- testWFlags() was renamed to \l{QWidget::testAttribute()}{testAttribute()}.
-
- See \l{#properties}{Properties} for a list of QWidget properties
- in Qt 3 that have changed in Qt 4.
-
- \section1 QWidgetFactory
-
- The \c QWidgetFactory class has been replaced by QFormBuilder in Qt 4.
-
- \section1 QWidgetIntDict
-
- The QWidgetIntDict class was a synonym for QIntDict<QWidget>. It
- is no longer available in Qt 4. If you link against Qt3Support,
- you can use Q3IntDict<QWidget> instead; otherwise, see the
- \l{#qdict.section}{section on QDict<T>}.
-
- \target qwidgetlist.section
- \section1 QWidgetList
-
- In Qt 3, the QWidgetList class was a typedef for
- QPtrList<QWidget>. In Qt 4, it is a typedef for QList<QWidget *>.
- See the \l{#qptrlist.section}{section on QPtrList<T>}.
-
- \section1 QWidgetPlugin
-
- The QWidgetPlugin class is no longer available in Qt 4. To create
- custom widget plugins, subclass QDesignerCustomWidgetInterface to
- provide information about the custom widget, and build a plugin in
- the way described in the \l{designer/customwidgetplugin}{Custom
- Widget Plugin} example.
-
- \section1 QWidgetStack
-
- The QWidgetStack class is no longer part of the Qt public API. It
- has been renamed Q3WidgetStack and moved to Qt3Support. In Qt 4
- applications, you can use QStackedWidget instead to obtain the
- same results.
-
- \section1 QWizard
-
- The \c QWizard class was reintroduced in Qt 4.3. See the
- \l{Trivial Wizard Example}, \l{License Wizard Example} and
- \l{Class Wizard Example} for more details.
-
- \section1 QWorkspace
-
- The \c QWorkspace in Qt 4 class requires explicit adding of MDI
- windows with QWorkspace::addWindow().
-*/
-
-/*!
- \page porting4-virtual-functions.html
- \title Porting to Qt 4 - Virtual Functions
- \contentspage {Porting Guides}{Contents}
- \previouspage Porting to Qt 4
- \nextpage Porting to Qt 4 - Drag and Drop
- \ingroup porting
- \brief An overview of changes to virtual functions in Qt 4.
-
- \section1 Virtual Functions
-
- Virtual functions that changed their signature in Qt 4:
-
- \table
- \header \o Qt 3 function signature \o Qt 4 function signature
- \input porting4-modifiedvirtual.qdocinc
- \endtable
-
- Virtual functions that are not virtual in Qt 4:
-
- \table
- \header \o Qt 3 function \o Comment
- \input porting4-removedvirtual.qdocinc
- \endtable
-*/