将某个Qt4项目升级到Qt5遇到的问题(13条方法)

摘要:
今天Qt5.0.1-MinGW预编译版本发布了,于是就拿它练手,将它升级到Qt5,以减少系统中存在的多个Qt版本。在Qt4时代,使用ActiveQt时,老提示没有这个文件,需要自己找到源代码手工uicqaxselect.ui˃ui_qaxselect.h来生成一下,Qt5中则解决了该问题。所以,对主题样式依赖比较严重的程序,要衡量一下是否要升级到Qt5了。总体来说:从Qt4到Qt5的升级比较平稳,不会像Qt3到Qt4那样相当于重新写了一遍。并且QtQuick的升级也算平稳,还将一些原来QtMobility中的内容移到了Qt5中。

本文转载自http://hi.baidu.com/xchinux/item/9044d8ce986accbb0d0a7b87

一、将某个QT4项目改成QT5遇到的问题

该Qt4项目以前是使用Qt4.7.4MSVC2008开发的,因为使用到了OWC10(OfficeWebComponents),使用MSVC编译器的话无法正常升级到Qt4.8.x和Qt5,于是将编译器转成了MinGW4.7,Qt升级到了4.8.4。今天Qt5.0.1-MinGW预编译版本发布了,于是就拿它练手,将它升级到Qt5,以减少系统中存在的多个Qt版本。遇到的问题如下:

1.由于Qt5将大部分桌面部件移到了QtWidgets模块中,所以在.pro中要增加下面一行

QT+=widgets

2.程序中使用了OWC10,用到了ActiveQt,原来的做法是在.pro中加CONFIG+=qaxcontainer,现在需要改成

QT+=axcontainer

当然了,原来的CONFIG+=qaxcontainer也将去除

3.为了充分使用C++11特性,在.pro中加下面一行

CONFIG+=c++11

4.在源文件中,凡是涉及到原QtGui中可视部件的,全要修改头文件引用,或者增加QtWidgets头文件,比如:

#include<QtGui/QPushButton>要改成#include<QPushButton>或者#include<QtWidgets/QPushButton>

在以前使用#include<QtGui>的地方,要加上#include<QtWidgets>

5.由于Qt5去除了QTextCodec::setCodecForCStrings()函数,所以在涉及到在cpp中直接写汉字的情况,有如下两种修改方法:

a)如果以前的源文件编码是GBK的,则需要使用QString::fromLocal8Bit()函数将原来的汉字括起来;或者直接将源文件编码转换成UTF-8的(缺点是MSVC编译器不能方便的使用了)。我使用了使用QString::fromLocal8Bit()来调用的方式(当然了,另写便捷函数或宏来处理)

b)如果以前的源文件编码是UTF-8的,则什么都不用动。

6.以前使用QDesktopServices::storageLocation(QDesktopServices::xxxx)来获取一些系统目录,现在则要改成

QStandardPaths::writableLocation(QStandardPaths::xxxx)

7.以前调用QFileDialog::getSaveFileName()时,如果在Windows下使用NativeDialog形式指定文件名,则能正常显示,如今Qt5不能正常显示文件名。所以将它的后两个参数加上了,即QFileDialog::getSaveFileName(xxx,xxx,xxx,xxx,0,QFileDialog::DontUseNativeDialog),这样就正常了,只是它的对话框不是系统形式的,暂且将就吧。

8.还有,Qt5解决了ui_qaxselect.h文件的问题。在Qt4时代,使用ActiveQt时,老提示没有这个文件,需要自己找到源代码手工uicqaxselect.ui>ui_qaxselect.h来生成一下,Qt5中则解决了该问题。

9.使用到打印相关的类,Qt5单独放到了QtPrintSupport模块中,所以得加头文件#include<QtPrintSupport>,在.pro中要加QT+=printsupport

10.使用到QWebPage等webkit相关可视部件的,Qt5单独放到了QtWebKitWidgets模块中,所以得加头文件#include<QtWebKitWidgets>,在.pro中要加QT+=webkitwidgets

11.Qt4中的cleanlooks、plastique、cde、motif等主题样式没有,新加了个fusion,好吧,问题是我的一个项目框架使用的是cleanlooks主题样式然后加自定义样式表,这下可好,升级Qt5后,样子有的就与windowsvista或fusion不相符或有缺陷,得调整一下了。所以,对主题样式依赖比较严重的程序,要衡量一下是否要升级到Qt5了。

12..pro文件中的TARGET在Qt4(qmakev2)中是可以不填写的,那么它就从自动采用.pro文件名字,而在Qt5中(qmakev3)这个TARGET不可不写。

13.Q_WS_XX的宏不可用了,使用Q_OS_XX代替.

至于c++11支持的连接信号与槽时可以不使用SLOT、SIGNAL宏的问题,现在先不改吧,虽然新方法去除了这两个宏,并且加强了类型检查,但也又增加了类名和一个&符号,先偷懒不动吧。

--------------------------------------------------------------------------------------------

二、QT5.0的改动

1. Qt5加入了JSON支持
2. Qt5支持的平台有: 桌面平台:Windows, Linux/X11, Mac OS X
嵌入式平台: Embedded Linux(DirectFB, EGLFS, KMS, Wayland), WIndows Embedded(Compact and Standard), Real-Time OS(QNX, VxWorks, INTEGRITY)
移动平台:Android, iOS, Windows 8(WinRT), BlackBerry 103. QtQuick2,
新增了许多新QML Elements,要求有OpenGL(ES)或DirectX支持,还有关于图形效果、多媒体方面的加 强
4. 新增了QGuiApplication 和QWindow,用于QtQuick,如果是开发传统的基于QWidgrets的程序,仍然使用以前的QApplication和QMainWindow
5. 新的QtGui中只包含了少量GUI核心的内容,原来Qt4中的QtGui中包含的大多数Widgets、ItemView、GraphicsView相关内容都被移到了QtWidgets模块中,所以在Qt5中,如果开发QtQuick2应用,就可以去除QtWidgets模块了,不是必须的了。
6. 单独的QtMultimedia模块,可在C++和QML中使用,支持audio、video、radio、mediaplayer、camera等接口
7. QtNetwork模块中新增了bearer managemtn,来控制系统的(网络等)连接状态
8. QtQml模块提供基本的QML引擎、类型、对象等以及与其有关的C++支持,而QtQuick模块则提供了基本的QML Elements。
总体来说 :从Qt4到Qt5的升级比较平稳,不会像Qt3到Qt4那样相当于重新写了一遍。并且QtQuick的升级也算平稳(C++中主程序要有所变化),还将一些原来QtMobility中的内容移到了Qt5中。开始支持主流移动平台(Android、iOS、Window 8(WinRT)、BlackBerry 10),Symbian已经不再更新发展,就让它远去吧。至于MeeGo/Sailfish,应该将它归类到Linux/X11中去,嵌入式平台中则增加了QNX(其实BlackBerry 10也是基于QNX的)。
http://blog.csdn.net/ccf19881030/article/details/11992967

免责声明:文章转载自《将某个Qt4项目升级到Qt5遇到的问题(13条方法)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇pyCharm中使用pytest结合allure运行报错module 'allure' has no attribute 'title'天天基金网数据接口下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

qmake的使用(可设置c编译器flag参数)

本文由乌合之众 lym瞎编,欢迎转载 my.oschina.net/oloroso***还是先说一下当前的系统环境:Ubuntu 14.04 + Qt5.4如果没有安装过QT,可以安装下面几个qt软件 sudo apt-get install qt5-default qt5-doc-html qt5-qmake qt5-doc qt5-image-form...

QT5:网络

QNetworkAccessManager的post方法 多线程 同步 异步 八.QT5多线程和多进程 1.多线程 QThread是Qt线程中一个公共的抽象类,所有的线程类都是从QThread抽象类中派生的,需要实现QThread中的虚函数run(),通过调用start()函数 QThread对多线程的支持: 1.QThreadStorag...

QT5静态编译教程,主要针对vs2012(渡世白玉)

QT5,VS2012静态编译,所有的库准备充分的话qwebkit也可以静态编译通过,但是我编译的版本使用中如果用了QWEBVIEW控件在连接时会出错。注:我自己编译的环境是:win server 2012 dc版 , vs2012 with update1,qt-everywhere-opensource-src-5.0.2,perl和rupy都是在qt官...

QT5 Failed to load platform plugin &amp;amp;quot;windows&amp;amp;quot; 终极解决方式 命令行问题

Failed to load platform plugin "windows" 这个错误在双击exe运行时不会出现,当传递命令行參数时出问题 ,解决方法: intmain(intargc,char*argv[]) { Q_INIT_RESOURCE(rc); //解决库路径问题============info@seatrix.com QTextCod...

Clion+Cmake+Qt5+Qwt+msys2+MinGW在Windows下的安装配置使用教程

摘要: CLion, a cross-platform C/C++ IDE. 本文主要介绍基于Clion作为IDE, MinGW作为编译器,CMake作为项目构建工具,开发基于Qt5、qwt的C++图形GUI项目的安装、配置、编译过程。 KeyWords:Clion;Cmake;Qt5;Qwt;msys2;MinGW;Windows 目录: 软件安装 环...

Qt5-控件-QRadioButton-单选按钮-用于从多个选项中选取一个-单选神器

#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QRadioButton> #include <QButtonGroup> class MainWindow : public QMainWindow { Q_...