博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Qt4过渡至Qt5
阅读量:7078 次
发布时间:2019-06-28

本文共 5727 字,大约阅读时间需要 19 分钟。

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


QtWidgets作为一个独立的模块

例如编译时错误

  1. error
    : 
    : No such file or directory
  2. error
    : 
    : No such file or directory
  3. error
    : 
    : 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
    (
    ::
    translate
    (
    "Href_Gui"
    , 
    "Url / www"
    , 
    0
    , 
    ::
    UnicodeUTF8
    )
    )
    ;
  2. label
    ->
    setText
    (
    ::
    translate
    (
    "Href_Gui"
    , 
    "Text:"
    , 
    0
    , 
    ::
    UnicodeUTF8
    )
    )
    ;
  3. label_2
    ->
    setText
    (
    ::
    translate
    (
    "Href_Gui"
    , 
    "Url:"
    , 
    0
    , 
    ::
    UnicodeUTF8
    )
    )
    ;
  4. label_3
    ->
    setText
    (
    ::
    translate
    (
    "Href_Gui"
    , 
    "Target / Name:"
    , 
    0
    , 
    ::
    UnicodeUTF8
    )
    )
    ;

变为

  1. Href_Gui
    ->
    setWindowTitle
    (
    ::
    translate
    (
    "Href_Gui"
    ,
     
    "Url / www"
    ,
     
    0
    )
    )
    ;
  2. label
    ->
    setText
    (
    ::
    translate
    (
    "Href_Gui"
    ,
     
    "Text:"
    ,
     
    0
    )
    )
    ;
  3. label_2
    ->
    setText
    (
    ::
    translate
    (
    "Href_Gui"
    ,
     
    "Url:"
    ,
     
    0
    )
    )
    ;
  4. label_3
    ->
    setText
    (
    ::
    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 
    * obj
    , 
    int indentLevel
    ) 
    const 
    {
  2. [...
    ]
  3.     
  4.     
    if 
    (m_children
    ) 
    {
  5.         
    <</span>*> childlist = qFindChildren<</span>*>(obj, ());
  6. [...
    ]

替换

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

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


qVariantValue已被弃用

编译器会出现

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

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

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

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

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

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

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


qVariantCanConvert已被弃用

替换

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

  1. Q_ASSERT
    (variant.
    canConvert
    (
    ::
    )
    )
    ;
  2. Q_ASSERT
    (variant.
    canConvert
    (
    ::
    )
    )
    ;
  3. Q_ASSERT
    (fontVariant.
    canConvert
    (
    ::
    )
    )
    ;

  

Qt::escape已被弃用

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

所以应该更改下面代码:

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

  1.     
    if 
    (result 
    == 
    (
    )
    )
  2.         result 
    = 
    (val.
    toString
    (
    )
    ).
    toHtmlEscaped
    (
    )
    ;
  3.     
    else
  4.         result 
    = 
    (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.  path 
    = s.
    value
    (
    "db.path"
    ,
    ::
    storageLocation
    (
    ::
    DataLocation
    )
    ).
    toString
    (
    )
    ;

  1.  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 
    +=testlib instead.

  

QWeakPointer怪异

如下代码

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

结果

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

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

  1. DEFINES 
    += QT_DISABLE_DEPRECATED_BEFORE
    =
    0


QtConcurrent库的失踪了?

  1. C
    :\
    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图像格式的插件,请查看: .


部署的系统没有使用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配置选项。


推荐阅读

  •  [qt-project.org]
  •  [qt-project.org]
  •  [blog.ics.com]
  •  [kdab.com]
  •  [kdab.com]
  •  [codeproject.com]

类别:

 

转载地址:http://yicml.baihongyu.com/

你可能感兴趣的文章
阿里云:面向5G时代的物联网无线连接服务
查看>>
spring cloud微服务分布式云架构-Spring Cloud Bus
查看>>
Java springcloud B2B2C o2o多用户商城 springcloud架构(十):服务网关zuul初级篇
查看>>
WebVeiw播放H5的video标签的问题
查看>>
为什么说BCH是最安全的数字货币之一?
查看>>
Spring Cloud--Honghu Cloud分布式微服务云系统—组件化
查看>>
Java知识点杂谈
查看>>
C++/Debug模式查看EFL(标志寄存器)详解
查看>>
我的友情链接
查看>>
jsp页面中出现的java代码之国际化
查看>>
Win8应用管理工具 精简( 软件在网上找的)
查看>>
找回删除掉的文件方法,清除回收站也可以。
查看>>
Linux getrlimit和setrlimit函数
查看>>
APT***防护方案–采用整合产品进行全方位防护
查看>>
wampserver 的apache 配置
查看>>
ttlsa教程系列之mongodb——(四)mongodb索引&explain&profile
查看>>
flume分布式日志收集测试
查看>>
asp.net core 2.0 bundleconfig.json
查看>>
linux扩展根分区详细步骤
查看>>
监控数据库服务器的shell脚本
查看>>