Qt4过渡至Qt5

5 篇文章 0 订阅

 技术在不断进步,新知识也理应不断学习!Qt5的发布带给我无尽的好奇心,然而,受项目影响,一直使用VS2008+Qt4.8.3也未曾及时更新。这几天,果断装上VS2010+Qt5.1.0,开始研究。 Qt4过渡到Qt5不算显著, 然而,“模块化”的Qt代码需要项目配置的变化,如使用“ headers ”,和配置项目构建( 如改变*.pro文件 )。

QtWidgets作为一个独立的模块

例如编译时错误

  1. error :   QMainWindow :  No such file or directory
  2. error  :    QToolButton  :  No such file or directory
  3. error  :    QWidget :  No such file or directory

解决办法:

在*.pro文件里添加:

  1. QT   +=   widgets

更改

  1. # include <QtGui>

  1. # include <QtWidgets>

程序现在应该就可以运行了, 但是有时可能需要更加明确的包含

  1. # include <QtWidgets/QToolButton>

QtWebKitWidgets也是一个独立的模块:

例如编译时错误

  1. error :  invalid use of incomplete type  'class QWebFrame'
  2. error  :  forward declaration of   'class QWebFrame'

解决办法:

在*.pro文件里添加:

  1. QT   +=   webkitwidgets

注意 :当有QT += webkitwidgets的时候,就不再需要QT += widgets

此外,更改

  1. # inclue <QtWebKit>

  1. # include <QtWebKitWidgets>

打印机不工作

如果你的代码有以下几行:

  1. # include <QPrinter>
  2. #include <QPrintDialog>

将以下内容添加到项目文件中:

  1. Qt  +=  printsupport

同样,有时可能仍无法正常工作,需要指定:

  1. #include <QtPrintSupport/  QPrinter  >
  2. #include   <QtPrintSupport/  QPrintDialog >

toAscii()和fromAscii()已被弃用

替换

  1. fromAscii()
  2. toAscii()

  1. fromLatin1()
  2. toLatin1()

例如,给定的Qt4代码 

  1. QByteArry  configfileti   =   TMP_Config.  toAscii()  ;

变为 

  1. QByteArry configfileti   =   TMP_Config.  toLatin1()  ;

QCoreApplication::UnicodeUTF8已被弃用

此枚举类型用于定义8位编码的字符串参数translate()。 此枚举现在已经过时, 所有的情况将使用 UTF -8  所以 删除了 QCoreApplication::UnicodeUTF8的所有实例。 例如:

  1. Href_Gui  ->  setWindowTitle  (  QApplication  ::  translate  (  "Href_Gui"  ,    "Url / www"  ,   0  ,    QApplication  ::  UnicodeUTF8  )  )  ;
  2. label  ->  setText  (  QApplication  ::  translate  (  "Href_Gui"  ,    "Text:"  ,    0  ,   QApplication  ::  UnicodeUTF8  )  )  ;
  3. label_2  ->  setText  (  QApplication  ::  translate  (  "Href_Gui"  ,    "Url:"  ,    0  ,   QApplication  ::  UnicodeUTF8  )  )  ;
  4. label_3  ->  setText  (  QApplication  ::  translate  (  "Href_Gui"  ,    "Target / Name:"  ,    0  ,   QApplication  ::  UnicodeUTF8  )  )  ;

变为

  1. Href_Gui  ->  setWindowTitle  (  QApplication  ::  translate  (  "Href_Gui"  ,     "Url / www"  ,     0  )  ) ;
  2. label  ->  setText  (  QApplication  ::  translate  (  "Href_Gui"  ,     "Text:"  ,     0  )  )  ;
  3. label_2  ->  setText  (  QApplication  ::  translate  (  "Href_Gui"  ,     "Url:"  ,     0  )  )  ;
  4. label_3  ->  setText  (  QApplication  ::  translate  (  "Href_Gui"  ,     "Target / Name:"  ,     0  )  )  ;

QWorkspace 已被弃用

这个类已经过时,在Qt4.3中被替换为QMdiArea。 在Qt5中QWorkspace已被删除。 新的类与 QWorkspace 有类似的 API, 移植只涉及改变几个方法、信号和槽的名字。

更换

  1. #include <QWorkspace>

  1. #include <QMdiAre>

QDrag问题

拖动功能的应用程序将需要一些调整。如:

  1.  QDrag  * drag  = new QDrag ( event -> widget ( )) ;

在Qt5中将产生错误

  1. error  :  no matching function for call to   'QDrag::QDrag(QWidget*)'

要解决这个附加组件,其中包括:

  1. #include <QWidget>

qFindChildren 已被弃用

这种方式会弹出一个错误:

  1. error  :    'qFindChildren'  was not declared in   this  scope

为了解决这个问题,将qFindChildren替换为findChildren,例如

  1. toString  (  const    QObject  *  obj  ,    int  indentLevel  )    const    {
  2. [ ...  ]
  3.     
  4.       if    ( m_children  )    {
  5.           QList  <</span> QObject *>  childlist  =  qFindChildren <</span> QObject *> ( obj ,  QString ( ) ) ;
  6. [ ...  ]

替换

  1. QList  <</span> QObject *>  childlist  =  qFindChildren <</span> QObject *> ( obj ,  QString ( ) ) ;

  1. QList  <</span> QObject *>  childlist  =  obj -> findChildren <</span> QObject *> (QString ( ) ) ;

qVariantValue 已被弃用

编译器会出现

  1. error  :    'qVariantValue'  was not declared in   this  scope

此功能相当于的 QVariant::value(value)。 因此,如果指定QVariant val应改写

  1. QTime  t   =  qVariantValue  <</span> QTime > ( val ) ;

  1. QTime  t   =  val.  value  <</span> QTime > ( ) ;

QTime用尖括号括起来,则告知编译器QVariant将返回。 但是,如果变量不是一个QVariable,则类型用尖括号括起来就不应该被使用(这样做将导致一个模糊的编译时错误)。 所以指定的m_color(QColor类型),应改写

  1. s.  setValue  (  "color/favorite"  ,  qVariantValue  <</span> QColor > ( m_color ) ) ;

  1. s.  setValue  (  "color/favorite"  ,  m_color.  value  (  )  )  ;

qVariantCanConvert 已被弃用

替换

  1. Q_ASSERT  ( qVariantCanConvert  <</span> QString > ( variant ) ) ;
  2. Q_ASSERT  ( qVariantCanConvert  <</span> QSize > ( variant ) ) ;
  3. Q_ASSERT  ( qVariantCanConvert  <</span> QFont > ( fontVariant ) ) ;

  1. Q_ASSERT  ( variant.  canConvert  (  QMetaType  ::  QString  )  )  ;
  2. Q_ASSERT  ( variant.  canConvert  (  QMetaType  ::  QSize  )  )  ;
  3. Q_ASSERT  ( fontVariant.  canConvert  (  QMetaType  ::  QFont  )  )  ;

Qt::escape 已被弃用

  1. error  :    'escape'  is not a member of   'Qt'

所以应该更改下面代码:

  1.       if    ( result   ==    QString  (  )  )
  2.         result   =    Qt  ::  escape  ( val.  toString  (  )  )  ;
  3.       else
  4.         result   =    Qt  ::  escape  ( result  )  ;
  5.       return  result  ;

  1.       if    ( result   ==    QString  (  )  )
  2.         result   =    QString  ( val.  toString  (  )  ) .  toHtmlEscaped  (  )  ;
  3.       else
  4.         result   =    QString  ( result  ) .  toHtmlEscaped  (  )  ;
  5.       return  result  ;

  

QDesktopServices::storageLocation 已被弃用

  1. error  :    'storageLocation'  is not a member of   'QDesktopServices'
  2. error  :    'DataLocation'  is not a member of   'QDesktopServices'

使用QStandardPaths::StandardLocation,替换

  1. QString  path   =  s.  value  (  "db.path"  ,  QDesktopServices  ::  storageLocation  ( QDesktopServices  ::  DataLocation  )  ) .  toString  (  )  ;

  1. QString  path   =  s.  value  (  "db.path"  , QStandardPaths  ::  standardLocations  (QStandardPaths  ::  DataLocation  )  ) .  toString  (  )  ;

QtMutimedia替换了Phonon

音频、视频已不再使用  phonon,  如果你还在研究phonon,那么你已经out了!好好研究一下  QMediaPlayer、QMediaMetaData ...吧!

CONFIG  += qtestlib 已被弃用

如果在项目文件中使用,则编译器会发出警告,尽管如此代码将照常运行:

  1. Project WARNING  :  CONFIG  += qtestlib is deprecated.   Use    QT  += testlib instead.

QWeakPointer怪异

如下代码

  1. quint64 decodedPointer   =  line.  toULongLong  (  )  ;
  2. MetaData   * md   =    reinterpret_cast  <</span>MetaData *> ( decodedPointer ) ;
  3. QWeakPointer  <</span>MetaData >  wp ( md ) ;

结果

  1. error  :  no matching function   for  call to  'QWeakPointer::QWeakPointer(MetaData*&)'

为了解决这个问题,将下面代码添加到项目文件:

  1. DEFINES   +=  QT_DISABLE_DEPRECATED_BEFORE  =  0

QtConcurrent库的失踪了?

  1. : \ Qt \Qt5.0.2\5.0.2\mingw47_32\include\QtConcurrent\qtconcurrentthreadengine.h : 133 :  error :  undefined reference to `_imp___ZN12QtConcurrent16ThreadEngineBaseD2Ev '

在Qt4中,QtConcurrent是QtCore的一部分,所以,没有必要包括特定的头。 这已不再是用Qt5的情况下。 如果源代码如下

  1. m_current   =  QtConcurrent  ::  blockingMappedReduced  ( slices  ,  functor  ,  stitchReduce , QtConcurrent  ::  UnorderedReduce    )  ;

则将需要包含头:

  1. #include <QtConcurrent/  QtConcurrent  >

到项目文件,并添加下面一行:

  1. LIBS   +=   -  lQt5Concurrent

固定的#include <>头

 qtbase/bin/中 存在一个 “fixqt4headers.pl”这样的 Perl脚本。运行于 Qt源代码运行,为Qt组件 纠正#include <>指令还要考虑 模块名称。

插件加载

Q_EXPORT_PLUGIN,Q_EXPORT_PLUGIN2宏已经过时,新的宏为Q_PLUGIN_METADATA。 新系统的优点是,它允许Qt 来查询元数据的插件没有实际dlopen'ing它。 这极大地提高了插件系统的性能和可靠性。

新Q_PLUGIN_METADATA宏包含QObject的派生类中加载插件时返回的Q_OBJECT宏。 它包含插件 IID并 指向一个包含插件元数据的json文件。 json文件被编译成插件,并不需要安装。

例如如何改变插件可以通过查找补丁,改变GIF图像格式的插件,请查看:http://qt.gitorious.org/qt/qtbase/commit/963b4c1647299fd023ddbe7c4a25ac404e303c5d  .

部署的系统没有使用C++11

当Qt的系统上安装了C++11,建立从源代码的Qt库/框架链接,系统的C++ 11库(libc++)。 这意味着Qt库/框架没有部署到 没有安装C++11(如out-of-the-box Mac OS X 10.6)的 系统。 为了能够部署到系统仅支持较旧的C++标准(libstdc++),构建Qt源代码没有C++11配置选项。

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值