该文档描述了将程序从Qt3引到Qt4的步骤。如果你还没有做出转移的决定,或者还不确定是否必要,可以先看一下Qt4提供的关键特性(key features)。也可以参考Moving from Qt 3 to Qt 4,了解下怎么写Qt3代码能更简单的转到Qt4。
其它的转移指导:
Porting to Qt 4(Drag and Drop)
Porting .ui Files to Qt 4
Porting to Graphics View
qt3to4 – The Qt 3 to 4 Porting Tool
Qt 4版本在二进制层次与版本3不兼容。意思是在Qt3下编译过的程序必须在Qt4下重新编译。Qt 4在代码级与版本3也并不全兼容,然而几乎所有的不相容点都引起编译器错误或者运行消息(比一些奇怪的结果好多了)。Qt 4包含了许多附加的特性并且丢弃了许多废旧的功能。Qt 3转移到Qt 4需要一些努力,但是一旦完成了,Qt 4的相当多的附加功能和适应性对你的程序非常有用。
Qt 3转移到Qt 4:
1.简要的阅读以下条目大致明白需要什么。
2.确定你的代码能在Qt 3下的目标平台上编译和运行。
3.如果是用qmake请在工程文件.pro里面加上QT += qt3support这一行,否则,编辑你的makefile或者工程文件以链接到Qt3Support库并且将-DQT3_SUPPORT增加到你的编译器标记中。(你可能还需要指定其它的库,参考What’s New in Qt 4中的详细信息。)
4.运行qt3to4这个转移工具,这个工具能遍历代码并调整到Qt 4。
5.参考Porting .ui Files to Qt 4文档页来转移Qt Designer文件。
6.在Qt 4下重新编译,对每个错误,从下面找到相关的标识符(例如,函数名称,类名称)。这个文档提出了所有相应的标识符来帮助你得到你需要的信息。
qt3to4工具用Qt 3中相应支持的类替换了不再存在于Qt4中的Qt 3中的类;例如,QListBox转变成Q3ListBox。
有些时候,你可能不想再链接到Qt 3 支持库(Qt3Support)并且想利用Qt4的新特性。以下的说明解释了对每个兼容的类怎么去支持。
除了Qt3Support的类(比如Q3Action,Q3ListBox和Q3ValueList)外,在旧的API能和新的可能共存的情况下,Qt4提供了兼容的函数。例如,QString提供了QString::simplifyWhiteSpace()这个声明为内联的并且能简单的调用QString::simplified()的兼容函数。
如果你已经在.pro文件里面加上了QT += qt3support,qmake能自动定义QT3_SUPPORT符号,开启兼容的函数支持。你也可以手动的定义符号(例如,如果你想链接到Qt3Support库),或者你可以定义QT3_SUPPORT_WARNINGS来代替,告诉编译器发送一个warning,当一个兼容的函数被调用的时候。(这个只可用在GCC 3.2+ 和MSVC 7下。)
Casting and Object Types
在Qt 3,可以用qt_cast()函数确定QObject子类的实例是否能安全的cast to这些子类的基类。例如,如果一个QFrame的实例传到一个定义了QWidget指针作为参数的函数,可以用qt_cast()获得一个QFrame指针,那么就能访问这个实例的函数了。
在Qt 4下,许多的功能都由qobject_cast()函数提供,并且附加的一些函数也能给一些non-QObject类提供类似的功能:
Qt 3 function Qt 4 function
T *qt_cast<T *>(QObject *) T *qobject_cast<T *>(QObject *)
T qgraphicsitem_cast<T>(QGraphicsItem *)
T qstyleoption_cast<T>(QStyleOption *)
T qvariant_cast<T>(const QVariant &)
T qdbus_cast(const QDBusArgument &)
Type Names
下面的表格列出了在Qt4下重命名了的类。如果你在定义了QT3_SUPPORT后编译你的应用程序,这些旧的名字是不可用的。
任何时候你看到出现在左边的名字,你都可以用Qt 4相对应的来代替。qt3to4工具能自动地完成这个转换。
Qt 3 class name Qt 4 class name
QIconSet QIcon
QWMatrix QMatrix
QGuardedPtr QPointer
下面的表格列出了已经在Qt4种改名了的枚举类和类型定义类。如果你用QT3_SUPPORT编译,那些旧的类名就不可用了。
当你看到左边的名字,你可以用Qt4下的等价类去替换。qt3to4工具能自动执行这个转换。表格太大,不细列了。
Enum Values
下面的表格列出了在Qt4种已经改名了的枚举值。如果你用QT3_SUPPORT编译,那些旧的值就不可用了。
当你看到左边的名字,你可以用Qt4下的等价类去替换。qt3to4工具能自动执行这个转换。这个表格太长,不浪费空间了。
另外,下列window flags已经被widget attributes替代或者已经取消了。
Qt 3 type Qt 4 equivalent
Qt::WDestructiveClose Use QWidget::setAttribute(Qt::WA_DeleteOnClose) instead.
Qt::WStaticContents Use QWidget::setAttribute(Qt::WA_StaticContents) instead.
Qt::WNorthWestGravity
Qt::WNoAutoErase Use QWidget::setAttribute(Qt::WA_NoBackground) instead.
Qt::WResizeNoErase
Qt::WRepaintNoErase
Qt::WPaintClever Unnecessary in Qt 4.
Qt::WMacNoSheet Unnecessary in Qt 4.
在Qt4.1版本,用来决定窗口形式的widget flags已经被一些简单的枚举值替代,这些值能够指定最高层窗口的模式行为。
Qt 3 type Qt 4 equivalent
Qt::WShowModal Use QWidget::setWindowModality(Qt::ApplicationModal) instead.
Qt::WGroupLeader Use QWidget::setWindowModality(Qt::WindowModal) for each child dialog of the group leader, but do not change the modality of the group leader itself.
Properties
Qt4下许多属性已经改名,以使Qt的API更加相容更加直观。例如,QWidget的标题属性已经改名为windowTitle以使得让人能够更加清楚的知道它指的是窗口的标题栏上显示的标题。
另外,属性系统已经作了扩展,利用Q_PROPERTY()宏,允许属性能够在子类中重新定义,取消了Q_ONERRIDE()宏。
下面的表格列出了在Qt4下改名了的Qt属性。其中的出现在Qt Designer的.ui文件中的能被uic自动转为新的名字。
Qt 3 name Qt 4 name
QButton::accel QButton::shortcut
QButton::on QButton::checked
QButton::toggleButton QAbstractButton::checkable
QDial::lineStep QDial::singleStep
QDial::maxValue QDial::maximum
QDial::minValue QDial::minimum
QDialog::modal QDialog::isModal
QLineEdit::edited QLineEdit::modified
QLineEdit::hasMarkedText QLineEdit::hasSelectedText
QLineEdit::markedText QLineEdit::selectedText
QObject::name QObject::objectName
QProgressDialog::progress QProgressDialog::value
QProgressDialog::totalSteps QProgressDialog::maximum
QProgressDialog::wasCancelled QProgressDialog::wasCanceled
QPushButton::iconSet QPushButton::icon
QScrollBar::draggingSlider QScrollBar::sliderDown
QScrollBar::lineStep QScrollBar::singleStep
QScrollBar::maxValue QScrollBar::maximum
QScrollBar::minValue QScrollBar::minimum
QSlider::lineStep QSlider::singleStep
QSlider::maxValue QSlider::maximum
QSlider::minValue QSlider::minimum
QSpinBox::lineStep QSpinBox::singleStep
QSpinBox::maxValue QSpinBox::maximum
QSpinBox::minValue QSpinBox::minimum
QTabBar::currentTab QTabBar::currentIndex
QTabWidget::currentPage QTabWidget::currentWidget
QToolButton::iconSet QToolButton::icon
QToolButton::textLabel QToolButton::text
QWidget::caption QWidget::windowTitle
QWidget::icon QWidget::windowIcon
QWidget::iconText QWidget::windowIconText
少数在Qt 3下的属性在Qt4下已经不存在,但是入口函数依然作为Qt4API的一部分存在。这些函数不需要被Qt Designer使用,只有在利用Qt的meta-object系统去访问属性的高动态软件中你需要注意它们。这里是这些属性及其可替代的读写函数的列表:
Qt 3 property Qt 4 read function Qt 4 write function
QSqlDatabase::connectOptions QSqlDatabase::connectOptions() QSqlDatabase::setConnectOptions()
QSqlDatabase::databaseName QSqlDatabase::databaseName() QSqlDatabase::setDatabaseName()
QSqlDatabase::hostName QSqlDatabase::hostName() QSqlDatabase::setHostName()
QSqlDatabase::password QSqlDatabase::password() QSqlDatabase::setPassword()
QSqlDatabase::port QSqlDatabase::port() QSqlDatabase::setPort()
QSqlDatabase::userName QSqlDatabase::userName() QSqlDatabase::setUserName()
一些属性已经从Qt4中移除,但是如果定义了QT3_SUPPORT还是提供了关联的入口函数以助于转换到Qt4。当转换Qt3的.ui文件到Qt4时,uic对Qt3兼容函数产生调用。注意这只适用于Qt3Support库里的属性,也就是说当转换Qt3的.ui文件到Qt4时,其他库里面的QT3_SUPPORT属性必须手动转换。
下面的表格列出了这些属性以及你能用来替换的读写函数。个别函数的文件解释了怎么样用不兼容的Qt4函数去替代它们。
Qt 3 property Qt 4 read function (QT3_SUPPORT) Qt 4 write function (QT3_SUPPORT)
QMenuBar::separator QMenuBar::separator() QMenuBar::setSeparator()
QPushButton::menuButton QPushButton::isMenuButton() N/A
QTabWidget::margin QTabWidget::margin() QTabWidget::setMargin()
QTextEdit::textFormat QTextEdit::textFormat() QTextEdit::setTextFormat()
QWidget::backgroundBrush QWidget::backgroundBrush() N/A
QWidget::backgroundMode QWidget::backgroundMode() QWidget::setBackgroundMode()
QWidget::backgroundOrigin QWidget::backgroundOrigin() QWidget::setBackgroundOrigin()
QWidget::colorGroup QWidget::colorGroup() QWidget::setColorGroup()
QWidget::customWhatsThis QWidget::customWhatsThis() QWidget::setCustomWhatsThis()
QWidget::inputMethodEnabled QWidget::inputMethodEnabled() QWidget::setInputMethodEnabled()
QWidget::ownCursor QWidget::ownCursor() N/A
QWidget::ownFont QWidget::ownFont() N/A
QWidget::ownPalette QWidget::ownPalette() N/A
QWidget::paletteBackgroundColor QWidget::paletteBackgroundColor() QWidget::setPaletteBackgroundColor()
QWidget::paletteBackgroundPixmap QWidget::paletteBackgroundPixmap() QWidget::setPaletteBackgroundPixmap()
QWidget::paletteForegroundColor QWidget::paletteForegroundColor() QWidget::setPaletteForegroundColor()
QWidget::underMouse QWidget::underMouse() N/A
下列Qt3属性及其入口函数在Qt4中已经不可用。许多情况下,Qt4提供了相似的功能。
Qt 3 property Qt 4 equivalent
QButton::autoRepeat N/A
QButton::autoResize Call QWidget:setFixedSize(QWidget::sizeHint()) whenever you change the contents.
QButton::exclusiveToggle See QAbstractButton::autoExclusive.
QButton::pixmap Use QAbstractButton::icon instead.
QButton::toggleState Use QCheckBox::setState() and QCheckBox::state() instead.
QButton::toggleType Use QCheckBox::setTristate() instead.
QComboBox::autoResize Call QWidget:setFixedSize(QWidget::sizeHint()) whenever you change the contents.
QFrame::contentsRect Use Q3Frame::contentsRect() instead.
QFrame::margin Use QWidget::setContentsMargins() instead.
QTabBar::keyboardFocusTab N/A
QToolButton::offIconSet Use the off component of QAbstractButton::icon instead.
QToolButton::onIconSet Use the on component of QAbstractButton::icon instead.
QWidget::microFocusHint N/A
Explicit Sharing
Qt4是Qt里第一个不包含显性共享类的版本。所有在Qt3里显性共享的类在Qt4中都是隐式共享。
QImage
QBitArray
QByteArray
Q3PointArray
这就意味着,如果你拷贝一个类的实例(用“=”或者类的拷贝构造函数),对这个拷贝的任何修改都将影响源类并且覆盖全部。毫无疑问,这种行为是不值得的。
幸运的是,几乎所有的Qt3应用程序都不依赖显性共享。转移的时候,你只需去掉对detach()和/或copy()这些不再必须的函数的调用。
如果你有意在你的应用程序中依赖显性共享,在Qt4里你可以利用指针或者引用来达到同样的目的。
例如,如果有像下列的代码:
void asciify(QByteArray array)
{
for (int i = 0; i < (int)array.size(); ++i) {
if ((uchar)array[i] >= 128)
array[i] = '?';
}
}
你可以修改为:
void asciify(QByteArray &array)
{
for (int i = 0; i < array.size(); ++i) {
if ((uchar)array[i] >= 128)
array[i] = '?';
}
}
注意&在参数中的声明。
Painting and Redrawing Widgets
当实现Qt3下自定义的widgets时,在外部绘画事件中可以使用QPainter来画widget。这样能使得Qt应用程序同具有自己表现模式的第三方的库和工具结成整体。例如,一个widget可能在一个槽中被重画,利用从外部消息源获得的数据。
在Qt4,只可能在paintEvent()处理函数内部画widget。这种约束简化了Qt同本地窗口系统的交互,通过减少重画工作的次数改善了应用程序的性能,并且实现了能够改善widgets的外观的性能,比如存储备份。
一般说,我们推荐重新设计应用程序在paintEvent()函数执行所有的绘画操作,延迟现行的绘画直到下一次调用这个函数。应用程序能发送绘画事件来触发重画,并且它能够检查你的widget的内部状态以决定widget的哪一部分需要重画。
如果在你的程序里面异步重画被广泛应用,并且重新设计表现模式以在widget的paintEvent()内部执行所有的绘画操作也不太实际,就可能需要考虑利用中间的绘画步骤。在这种方法里,一个或更多的图片能被交互更新并且在绘画事件中被画在widget上。为了避免更多的缓冲,设置widget的Qt::WA_PaintOnScreen窗口属性来使存储备份失效可能是值得一做的。
在某一种平台下,可以设置Qt::WA_PaintOutsidePaintEvent窗口属性来允许通过外部绘画事件画窗口。
注意:设置widget属性使Qt的窗口延迟模式的关键特性失效可能会导致其它的特性不可用。
QAccel
QAccel类已经改名为Q3Accel并且转移到了Qt3Support模块,在新的应用程序中,你有三个选项:
1.你可以用QAction类并且用QAction::setShortcut()设置一个关键序列
2.你可以用QShortcut,它是一个提供了与Q3Accel类似功能的类。
3.你可以用QWidget::grabShortcut()并且通过重新实现QWidget::event()来处理“shortcut”。
Q3Accel用同一个对象通过多次调用Q3Accel::insertItem()还能支持多重加速器。Qt4里,这个解决方案需要创建多个QShortcut对象。
QAccessibleInterface
QAccessibleInterface在Qt4种已经经过一些API的改变,来使它与剩下的Qt的API更加谐和。
如果你有继承自QAccessibleInterface的类或者它的一个子类(QAccessibleObject,QAccessibleWidget,等等),你必须把它们转换成新的QAccessibleInterface的API。
查看QAccessibleInterface虚拟成员函数存在于Qt3不再在Qt4中是虚拟的Virtual Functions列表。
QAccessibleTitleBar
QAccessibleTitleBar已经改名为Q3AccessibleTitleBar,并且挪到了Qt3Support库。
QAction
QAction类已经在Qt4作了重新设计,为了和其他的菜单体系结合的更好。它融合了旧的QMenuItem类和旧的QAction类为一个类,避免了不必要的数据复制和学习两种不同API的需要。
旧的QAction和QActionGroup类已经改名为Q3Action和Q3ActionGroup并转移到Qt3Support。另外,新的QAction类有兼容函数使转换到Qt4简单些。注意当使用Q3ToolBar和Q3PopupMenu时,它们的actions必须是Q3Actions。
参考Qt3中Virtual Functions中的QAction虚拟成员函数列表,这些函数在Qt4中不再是虚拟的。
QActionGroup
参考QAction。
QApplication
QApplication已经被分成两个类:QCoreApplication和QApplication。新的Application类继承了QCoreApplication并且增加了GUI相关的功能。实际上,对现有的Qt应用程序这个并不重要。
另外,作了一些下列的API修改:
1.QApplication::allWidgets()和QApplication::topLevelWidgets()用来返回指向QWidgetList的指针。现在它们返回一个QWidgetList。
同样,QWidgetList已经从作为一个QPtrList<QWidget>的类定义改为QList<QWidget>的类定义。
例如,如果有这样的代码:
QWidgetList *list = QApplication::topLevelWidgets();
QWidgetListIt it(*list);
QWidget *widget;
while ((widget = it.current())) {
if (widget->inherits("MainWindow"))
((MainWindow *)widget)->updateRecentFileItems();
++it;
}
delete list;
你可以重写为:
QWidgetList list = QApplication::topLevelWidgets();
for (int i = 0; i < list.size(); ++i)
{
if (MainWindow *mainWin = qobject_cast<MainWindow>(list.at(i)))
mainWin->updateRecentFileItems();
}
2.不再使用QApplication::setMainWidget()了。当一个应用程序的所有窗口都关闭的时候,程序会正常退出。
QAquaStyle
QAquaStyle在Qt3.0版第一次出现,当Qt/Mac接口第一次被释放的时候。它仿照了Apple的“Aqua”主题。在Qt3.1中,QAquaStyle被QMacStyle废弃,QMacStyle是利用外观管理器执行它的绘画的。
QAquaStyle类不再在Qt4中被提供。可用QMacStyle代替。
QAsciiCache<T>
QAsciiCache<T>已经改名为Q3AsciiCache<T>并且挪到了Qt3Support库。它已经被QCache<QByteArray, T>替代。
学习QCache<T>章目有详细解释,主旨是substituting QByteArray for QString。
QAsciiDict<T>
QAsciiDict<T>和QAsciiDictIterator<T>已经改名为Q3AsciiDict和Q3AsciiDictIterator,并转移到了Qt3Support库中。它们已经被更现代的QHash<Key, T>和QMultiHash<Key, T>这些类和它们相关联的iterator类替代。
当转移使用Q3AsciiDict<T>的旧代码到Qt4下,你能用下面的4个类:
QMultiHash<QByteArray, T*>
QMultiHash<QByteArray, T>
QHash<QByteArray, T*>
QHash<QByteArray, T>
更详细的请参考QDict<T>章节,mentally substituting QByteArray for QString。
……
QButton
在Qt4里,QButton已经被QAbstractButton替代。像QPushButton和QRadioButton类都继承自QAbstractButton类。作为帮助,当转移旧的Qt应用程序时,Qt3Support库包含了一个Q3Button类,是根据新的QAbstractButton类实现的。
如果你使用QButton类作为基类为你自己的按钮类,并且想将你的代码转移到新类QAbstractButton,你需要意识到QAbstractButton没有等同于Q3Button::drawButton(QPainter *)的虚拟函数。解决方法是在你的QAbstractButton子类中重载QWidget::paintEvent(),如下:
void MyButton::paintEvent(QPaintEvent *)
{
QPainter painter(this);
drawButton(&painter);
}
Q3Button function QAbstractButton equivalent
Q3Button::autoResize() Call QWidget:setFixedSize(QWidget::sizeHint()) whenever you change the contents.
Q3Button::isExclusiveToggle() Use QAbstractButton::group() or QAbstractButton::autoExclusive() instead.
Q3Button::pixmap() const QAbstractButton::icon()
Q3Button::setAutoResize() N/A
Q3Button::setPixmap(const QPixmap &) QAbstractButton::setIcon(const QIcon &)
Q3Button::setState(ToggleState) See remark below
Q3Button::setToggleType(ToggleType) See remark below
Q3Button::state() See remark below
Q3Button::stateChanged(int) See remark below
Q3Button::toggleType() See remark below
1.在Qt3,QButton有一个“toggle type”,可能是QButton::SingleShot,QButton::Toggle,或者是QButton::Tristate。新的QAbstractButton类不直接支持“tristate”;这个特性改在QCheckBox中实现。另外两个“toggle types”(QButton::singleShot和QButton::Toggle)都被QAbstractButton::checkable属性替代。
2.在Qt3,QButton有一个“toggle state”,可能是QButton::Off,QButton::NoChange,或者是QButton::On。在Qt4,这些机制已经转移到QCheckBox中。
Virtual Functions项中有Qt3中QButton的虚拟成员函数,在Qt4中不是虚拟的了。
查看Properties有QButton在Qt3中的属性列表,在Qt4下已经改变的了。
QButtonGroup
QButtonGroup在Qt4中已经完全重新设计。为了兼容性,旧的QButtonGroup已经改名为Q3ButtonGroup并且转移到Qt3Support中。同样的,QButtonGroup和QVButtonGroup有用的子类已经改名为Q3HButtonGroup和Q3VButtonGroup并且转移到Qt3Support库。
旧的QButtonGroup,以及Q3ButtonGroup,有两种使用方式:
1.button group是许多button的父窗口,也就是说button group在button构造器中是父参数。Buttons被分配成0、1、2,等等,按照顺序被创建。Q3ButtonGroup可以显示一个框架和一个标题,因为它继承了Q3GroupBox。
2.button group是个无形的窗口并且所包含的button具有一些别的父窗口。这种用法里,每一个button必须手动加入,利用Q3ButtonGroup::insert()加到button group中并且得到一个ID。
与Q3ButtonGroup不同,新的QButtonGroup不是继承的QWidget。它非常类似于一个“隐藏的Q3ButtonGroup”。
如果你用了Q3ButtonGroup,Q3HButtonGroup或者Q3VButtonGroup作为一个窗口并且向转移到Qt4,你可以用QGroupBox代替。在Qt4里,同一个父窗口的单选按钮自动的成为一个唯一组的一部分,所以一般的你不需要另外做任何事。也可以参考下面section on QGroupBox章节。
参考Virtual Functions中QButtonGroup在Qt3中的虚拟成员函数列表,在Qt4中不再虚拟了的。
QHttp
QHttp不在继承QNetworkProtocol。详细请参考section on QNetworkProtocol。
旧得QHttp,QHttpHeader,QHttpRequestHeader,和QHttpResponseHeader类已经改名为Q3Http,Q3HttpHeader,Q3HttpRequestHeader和Q3HttpResponseHeader,并且移到了Qt3Support库。
QLabel
QLabel在用rich text不再能自动换行,你可以通过调用QLabel::setWordWrap()或者设置wordWrap属性来激活。这个变化是因为以前的操作迷惑了许多用户。
另外,QLabel不再提供autoResize属性。取而代之的是,对这个label你可以调用QWidget::setFixedSize(),用QLabel::sizeHint()作为参数,在任何你改变QLabel内容的时候。
参考Virtual Functions……。
QNetworkProtocol
QNetworkProtocol,QNetworkProtocolFactoryBase,QNetworkProtocolFactory<T>,和QNetworkOperation类都不再是公共Qt API的部分。它们已经改名为Q3NetworkProtocol,Q3NetworkProtocol,Q3NetworkProtocolFactoryBase,Q3NetworkProtocolFactory<T>,和Q3NetworkOperation并且都转到了Qt3Support库。
在Qt4的应用程序中,你可以使用QFtp和QHttp类直接在远程主机上执行文件相关的操作。
QString
以下是转移QString到Qt4下要注意的主要条目:
1.QString::QString(QChar)构造器完成了Qt3中的固有转换。现在,你需要认真的将QChar转换到QString。
2.QString::QString(const QByteArray&)构造器用来截止第一次遇到的’\0’,兼容了Qt1。这个怪招现在已经固定了。在Qt4,作为结果的QString经常与传递给构造器的QByteArray具有相同的长度。
3.QString::null静态常量在Qt4已经被禁止。为了兼容,Qt4提供了QString::null符号具有或多或少与旧的常量相同的作用。新的习惯是写QString(),或者调用clear()来代替QString::null。
例如,有这样的代码:
str1 = QString::null;
if (str2 == QString::null)
do_something(QString::null);
你可以重写成:
str1.clear();
if (str2.isNull())
do_something(QString());
在新的代码里,我们推荐你不要依赖于一个null串和一个(non-null)empty串的区别。详细的请参考Distinction Between Null and Empty Strings。
4.QString::latin1()和QString::ascii()已经被QString::toLatin1()和QString::toAscii()替代,它返回一个QByteArray而不是一个(non-reentrant)的const char*。为了一致性,QString::utf8()和QString::local8Bit(),已经返回一个QByteArray(实际上是一个QCString),已经被改名为QString::toUtf8()和QString::toLocal8Bit()。
要获得一个指向ASCII或者Latin-1数据的const char*指针,可以用QString::toAscii()或者QString::toLatin1()去获得一个包含这些数据的QByteArray,然后调用QByteArray::constData()去直接访问这些字符数据。注意这些函数返回的指针只在byte array的生存期有效;你必须避免去取包含临时对象的数据指针。
QString greeting = "Hello";
const char *badData = greeting.toAscii().constData(); // data is invalid
QByteArray asciiData = greeting.toAscii();
const char *goodData = asciiData.constData();
在上面的例子中,goodData指针在QByteArray类型的asciiData的生存期有效。如果你需要得到non-Qt数据结构的数据的拷贝,那就在释放QByteArray数据前使用标准C内存分配和字符串拷贝函数。
5.QString::at()返回一个non-const应用,而新的QString::at()返回一个常量。像这样的代码:
str.at(0) = 'X';
将不能被编译,用QString::operator[]来代替:
str[0] = 'X';
6.QString::contains(x)函数(x指的是一个字符或字符串)已经改名为QString::count()。另外,还存在一个返回bool值的QString::contains()函数集合。用count()还是用contains()代替旧的contains()调用,依赖于你是否关心string串的字符中出现的特殊数字,或者只关心string串是否包含那些字符。
7.许多QString中的函数都有一个bool型参数specified case sensitivity。在Qt4里,为了代码的可读性和可维护性,这个bool参数已经被Qt::CaseSensitivity枚举更替,能得到Qt::CaseSensitive和Qt::CaseInsensitive的值。
例如,你有这样的代码:
if (url.startsWith("http:", false))
...
你可以改写为:
if (url.startsWith("http:", Qt::CaseInsensitive))
...
8.QString::setExpand(uint, QChar)函数,在Qt3已经废弃不再可用。利用QString::operator[]代替。
例如,你有如下的代码:
str.setExpand(32, '$');
你可以重写为:
str[32] = '$';
9.QT_NO_ASCII_CAST和QT_NO_CAST_ASCII已经分别改名为QT_NO_CAST_TO_ASCII和QT_NO_CAST_FROM_ASCII。
10.QString::data()与QString::ascii()有相同的返回值。现在它返回一个指向存储在QString对象的Unicode数据的指针。调用QString::ascii()如果你想要以前的那种操作。
11.QString::arg()转换两数字位标记,一个字符串允许最多99处标记。
12.不再允许比较QStrings和NULL为了判断strings是不是否为空。用isEmpty()函数代替。
QStringList
QStingList现在继承自QList<QString>并且不再能转换到一个QValueList<QString>。以后QValueList继承QList的特性就能如想象的那么工作了。
这种改变意味着一些API对QStringList的不兼容。例如at()返回的是string,不是一个iterator。详细参考section on QValueList。
静态函数QStringList::split()用来分割字符串成小串列,已经被QString::split()取代,它返回一个QStringList。
QTextEdit
老的QTextEdit和QTextBrowser类已经改名为Q3TextEdit和Q3TextBrower,并且移到了Qt3Support库。新的QTextEdit和QTextBrowser利用了稍微不同的API。
QTextEdit::setWrapPolicy()函数已经改名为setWordWrapMode()并且QTextEdit::setWrapColumnOrWidth()函数已经改名为setLineWrapColumnOrWidth()。Q3TextEdit::setWrapPolicy()和Q3TextEdit::setWarpColumnOrWidth()在Q3TextEdit类仍然提供这种功能。
QTextView
QTextView类已经改名为Q3TextView并且移到了Qt3Support库。