QT4项目升级到QT5遇到的问题和解决方法
QT4升级到QT5改动:
PC部分:
【改QTDIR变量】
在工程根目录下找到.user文件, 如InnoTabPlugin.vcxproj.user
修改指向你的QT5根目录:
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Template|Win32'">
<QTDIR>C:\qt\Qt5.2.1\5.2.1\msvc2010</QTDIR>
</PropertyGroup>
或者找到这个文件Qt4VSPropertySheet.props,在里面修改:
<PropertyGroup Label="UserMacros">
<QTDIR>c:\Qt\Qt5.2.1\5.2.1\msvc2010</QTDIR>
</PropertyGroup>
【新增QtWidgets模块】
相对于QT4, QT5的一个主要的基础架构修改是,将widget从QtGui模块剥离开来,
新增QtWidgets模块,头文件包含“QtWidgets”。
#include <QtGui/QDialog>
#include <QtGui/QTableView> ......
修改为:
#include<QtWidgets/qdialog.h>
#include <QtWidgets/QTableView> ......
#include <QWidget> 修改为 #include <QtWidgets/QWidget> ......
#include <QListWidgetItem>修改为 #include <QtWidgets/qlistwidget.h>
.pro文件中Qt += widgets
【QApplication放入QtWidgets】
#include <QApplication>改成:
#include <QtWidgets/QApplication>
【新增QtWetKitWidgets模块】
头文件包含要加QtWebKitWidgets目录.
#include <QtWebKit/QWebFrame> 替换为: #include<QtWebKitWidgets/ QWebFrame >
#include <QtWebkit/QWebView> 替换为:#include<QtWebKitWidgets/ QWebView >
.pro文件中Qt += webkitwidgets
【QSortFilterProxyModel】
#include <QtGui/QSortFilterProxyModel>
修改为: #include <QtCore/QSortFilterProxyModel>
【QDesktopServices::storageLocation系统目录问题】
前使用QDesktopServices::storageLocation(QDesktopServices::xxxx)来获取一些系统目录,
现在则要改成
QStandardPaths::writableLocation(QStandardPaths::xxxx)
如:
QString directory = QDesktopServices::storageLocation(QDesktopServices::DataLocation);
可修改为:
QString directory = QStandardPaths::writableLocation(QStandardPaths::DataLocation);
而
QString location = QDesktopServices::storageLocation(QDesktopServices::CacheLocation);
修改为:
QString location = QStandardPaths::writableLocation(QStandardPaths::CacheLocation);
【QHttp用QNetworkAccessManager代替】
QHttp类已经被废弃,请用以下的类替换
QNetworkAccessManager
QNetworkReply
QNetworkRequest (代替QHttpRequestHeader)
m_pReply = m_httpManager.get(QNetworkRequest(url));
connect(m_pReply, SIGNAL(readyRead()), this,SLOT(readyRead()));
connect(m_pReply, SIGNAL(finished()),this, SLOT(finishDownload ()));
connect(m_pReply, SIGNAL(error(QNetworkReply::NetworkError)), this,SLOT(networkError(QNetworkReply::NetworkError)));
m_pFile = new QFile(localPath);
void MyClass::readyRead()
{
if(m_pFile)
m_pFile->write(m_pReply->readAll());
}
void MyClass::finishDownload()
{
if(m_pFile->handle() != NULL)
{
m_pFile->flush();
m_pFile->close();
}
}
【qInstallMsgHandler函数废弃】
可修改为:qInstallMessageHandler,
MessageOutput要多加一个参数: QMessageLogContext& Context
void MessageOutput( QtMsgType type, const QMessageLogContext& Context, const QString &sMsg )
QtMsgHandler 改为 QtMessageHandler
【#include <QX11Info>问题】
加路径:C:\Qt\Qt5.2.1\5.2.1\Src\qtx11extras\include
修改为:#include <QtX11Extras\qx11info_x11.h>
【RegisterDeviceNotification问题】
RegisterDeviceNotification(this->winId(), &NotificationFilter, DEVICE_NOTIFY_WINDOW_HANDLE);改成
RegisterDeviceNotification((HANDLE)this->winId(), &NotificationFilter, DEVICE_NOTIFY_WINDOW_HANDLE);
【setYMD不是成员函数的问题】
把setYMD改为:setDate
QDate.setYMD() 修改成 QDate.setDate()
【Q_WS_WIN问题】
宏修改, Q_WS_WIN 可替换为:Q_OS_WIN
【network模块引用问题】
#ifdef WIN32
#include "../../src/network/access/qnetworkreply.h"
#include "../../src/network/access/QNetworkAccessManager.h"
#include "../../src/network/kernel/QNetworkInterface.h"
#else
#include "src/network/access/s.h"
#include "src/network/access/QNetworkAccessManager.h"
#include "src/network/kernel/QNetworkInterface.h"
#endif
修改为:
#include <QtNetwork/qnetworkreply.h>
#include <QtNetwork/qnetworkaccessmanager.h>
#include <QtNetwork/qnetworkinterface.h>
【QAxWidget放入ActiveQt】
#include <QAxWidget>
修改为:
#include <ActiveQt\QAxWidget>
【QTextCodec编码函数已废弃】
Qt5发布之时,默认将会是utf8编码,这些函数请去掉:
QTextCodec::setCodecForTr(...)
QTextCodec::setCodecForCStrings(...)
QTextCodec::setCodecForLocale(...)
【QWindowsStyle问题】
窗体风格类QWindowsStyle移除了,
使用QCommonStyle代替。
【错误"std::numeric_limits<qint64>::min()....解决方法】
方法:#define NOMINMAX before including windows.h header.
代码:
#define NOMINMAX
#include <windows.h>
如果不行, 将#include<windows.h>改为#include<qt_windows.h>试试.
如果还不行,把static inline qint64 nullJd() { return std::numeric_limits<qint64>::min(); }
加括号,改成:
static inline qint64 nullJd() { return (std::numeric_limits<qint64>::min)(); }
【QCoreApplication::UnicodeUTF8问题】
QCoreApplication::UnicodeUTF8被废弃了,用到的地方,直接去掉就可以了,如
label->setText(QApplication::translate("hello", "Text:", 0, QApplication::UnicodeUTF8));
改成:
label->setText(QApplication::translate("hello", "Text:", 0));
【QWorkspace废弃】
QWorkspace遗弃了
#include <QWorkspace> 改成:
#include <QMdiArea>
【Ascii编码问题】
toAscii() and fromAscii() 用下面的来代替:
toLatin1()
fromLatin1()
【QT_WA的错误解决】
如果提示 QT_WA的错误,自定义一个宏:
#if QT_VERSION >= 0x050000
#define QT_WA(unicode, ansi) unicode
#endif
【winEvent问题】
添加 QByteArray eventType;
修改 return QMyPopupDlg::nativeEvent(eventType, message, result);
【winId()类型不匹配问题】
SetWindowPos(this->winId(), HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);(299)
修改为:
SetWindowPos((HWND)this->winId(), HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
或者... (HANDLE)this->winId().....
【提示找不到GLES2/gl2.h】
解决方法
# include <GLES2/gl2.h>
换成
#include <QtANGLE/GLES2/gl2.h>
或者#include <QtANGLE/KHR/GLES2/gl2.h>
【新增QUrlQuery类】
QUrl u(url);
修改为:QUrlQuery u(url);
m_request.setUrl(u);
修改为: m_request.setUrl(QUrl(url));
【khrplatform.h找不到问题】
#include <KHR/khrplatform.h>
换成:
#include <QtANGLE/KHR/khrplatform.h>
【提示不是QObject*类型的问题】
QState assignProperty函数如果不是QObject*类型,要强制转换:
state->assignProperty(wList[0], "geometry", positions[0]);
也是一样的道理,如:
connect()和QPropertyAnimation构造函数也是同样的道理.
【QString: toWCharArray链接错误问题】
TCHAR volstr[50] = {0};
volume.toWCharArray(volstr);
改成:
TCHAR *volstr = (wchar_t*)volume.utf16();
【already defined in LIBCMTD.lib(typinfo.obj)问题】
先在Configuration Properties->Liner->Input->Ignore Specific Default Libraries中输入:LIBCMTD.lib;msvcrtd.lib
再在Configuration Properties->Liner->Input->Additional Dependecies中添加:msvcrtd.lib;LIBCMTD.lib
如果不行,撤销上面的改动,单单在Additional Dependecies中添加上msvcrt.lib或msvcrtd.lib。
【unresolved external symbol "const type_info::`vftable'" 】
用楼上的解决方法。不行,试试这个:
http://support.microsoft.com/default.aspx?scid=kb;%5BLN%5D;830482
【QString::fromStdWString()引起的link错误】
解决方法:
【Qt::WFlags问题】
Qt::WFlags改成 Qt::WindowFlags
【QSound::isAvailable()问题】
return QSound::isAvailable();可替换成
return !QAudioDeviceInfo::availableDevices(QAudio::AudioOutput).isEmpty();
【reset()问题】
QAbstractItemModel::reset()在QT5中被移除
使用下面两句代替
QAbstractItemModel::beginResetModel();
QAbstractItemModel::endResetModel();
【链接失败】
在Configuration Properties->Liner->Input->Ignore Specific Default Librarie里添加相应的库。
vlib.lib;qtmaind.lib;Qt5XML.lib;Qt5XmlPatterns.lib;Qt5Test.lib;Qt5WebKit.lib;Qt5Network.lib;Qt5Widgets.lib;Qt5WebKitWidgets.lib;Qt5Guid.lib;Qt5Cored.lib;gdi32.lib;comdlg32.lib;oleaut32.lib;imm32.lib;winmm.lib;netapi32.lib
============================华丽的分割线===========================
MAC部分:
【OS X和Xcode版本选择】
请用OS X10.7及以上的mac来build工程。
xcode则请用4.0以上版本。
【更新修改QT pro工程文件】
在windows上生成新的.pro文件
c:\qt\Qt5.2.1\5.2.1\msvc2010\bin\qmake.exe -project
修改pro文件
QT += core gui network webkit xml xmlpatterns widgets webkitwidgets
在拷贝工程到Mac上,把QT pro工程文件转成xcode工程:
qmake -spec macx-xcode yourproject.pro
【调用webservice soap问题】
在工程中添加soap库,
soap库要用新的, 用qt5重新编译网上下载的soap源码。
【提示soap库文件找不到】
提示soap库文件找不到,请修改链接路径,或改soap文件名: xxxx.1.dylib。
【xcode设置release版本】
如果要编译release版本,
在xocde顶部选择 "Edit Scheme"-->选择"Release"
【error: expected unqualified-id before 'OTHER' token】
代码文件头多了个字符,在windows上用notepad++等文本编辑工具打开,
另存为新文件,再重新拷贝到MacOS上编译即可。
【duplicate symbols链接不了的问题】
多个资源源文件(qrc_xxxxx.cpp)被加到工程,链接时会有下面类似的提示:
ld: 2 duplicate symbols for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
解决方法,把重复的资源代码文件qrc_xxxxx.cpp从工程中移除再build。
【library architecture不对链接错误的问题】
在MAC上的编译时引用到库需要支持x86_64架构, QT5的QT库都是支持x86_64架构的,用QT5 的qmake 生成的工程必需要xcode4才能打开,xcode4的工程生来就必需先择支持x86_64架构,
这就要求我们用到的库都必需支持x86_64架构,查看库是不是支持x86_64架构可以用“otool -h filepath”
有红框里的就是支持x86_64架构
只有绿框的只支持i386和ppc.
如果我们手头有库的源码,把源代码在xcode4上重新生成。
编译选项“Architectures”设置成x86_64
参考:http://blog.csdn.net/zenghao0708/article/details/24244293
===============================================================
我自己的体会:
1. 可在源代码中区分QT的版本,让C++编译器自行选择:
#include <QtGlobal>
#if QT_VERSION >= 0x050000
#include <QApplication>
#else
#include <QtGui/QApplication>
#endif
2. 也可在项目文件中,让qmake自行选择:
QT += core gui
greaterThan(4, QT_MAJOR_VERSION): QT += widgets multimedia
lessThan(5, QT_MAJOR_VERSION): CONFIG += mobility
lessThan(5, QT_MAJOR_VERSION): MOBILITY += multimedia
3. 碰到连接WinMain的错误:
MSVCRTD.lib(crtexew.obj) : error LNK2019: unresolved external symbol _WinMain@16 referenced in function ___tmainCRTStartup
结果是要:
Try to change Properties -> Linker -> System -> SubSystem (in Visual Studio).
from Windows (/SUBSYSTEM:WINDOWS) to Console (/SUBSYSTEM:CONSOLE)
但是在QT里是因为缺乏qtmain.lib 或者 qtmaind.lib
4. 导入lib文件(Release和Debug各改一遍):
从VS2008工程的:msvcrt.lib qtmain.lib QtCore4.lib QtGui4.lib QtXml4.lib QtNetwork4.lib QtSql4.lib
变成VS2010工程的:msvcrt.lib;Qt5Core.lib;Qt5Gui.lib;Qt5Xml.lib;Qt5Network.lib;Qt5Sql.lib;Qt5Widgets.lib;%(AdditionalDependencies)
其中qtmain.lib的名称不变
忽略libcmt.lib不变
5. 为了让QT5 Add-in起作用,还要在VS的QT5菜单里执行一遍Convert to Add-in Project。然后才能在QT项目选项里,勾选QWidgets,省得自己在代码里处处添加。
6. 不知道qdatetime.h为什么会出错,反正我把这句改为:
static inline qint64 nullJd() { return Q_INT64_C(-784350574879); }
7. 字符集:
QTextCodec::setCodecForTr(codec);
QTextCodec::setCodecForCStrings(codec);
8. QString::toAscii函数也不能用了:
QByteArray baTotalAscii = strTotal.toAscii();
9. UI文件生成的头文件在#include 别的类的时候,都带上了<QtGUI/...>一律删除,生成的字符翻译代码全都无法使用,所以全部删除,不知道为什么。UI文件最好提前用QT5 Designer提前打开一下,稍作改动后再保存。
10. 不能采用O2优化,要把优化取消
Command line error D8016: '/O2' and '/RTC1' command-line options are incompatible
===============================================================
官方文档:
http://wiki.qt.io/Transition_from_Qt_4.x_to_Qt5
QT4项目升级到QT5遇到的问题和解决方法的更多相关文章
- [转]将某个Qt4项目升级到Qt5遇到的问题
原文:http://hi.baidu.com/xchinux/item/9044d8ce986accbb0d0a7b87晚上花了4个小时,将以前的一个项目从Qt 4.8.4-MinGW升级到了Qt5. ...
- 将某个Qt4项目升级到Qt5遇到的问题(13条方法)
本文转载自http://hi.baidu.com/xchinux/item/9044d8ce986accbb0d0a7b87 一.将某个QT4项目改成QT5遇到的问题 该Qt4项目以前是使用Qt4.7 ...
- 将某个Qt4项目升级到Qt5遇到的问题
本文转载自http://hi.baidu.com/xchinux/item/9044d8ce986accbb0d0a7b87 一.将某个QT4项目改成QT5遇到的问题 该Qt4项目以前是使用Qt4.7 ...
- 将某个Qt4项目升级到Qt5遇到的问题[转]
该Qt4项目以前是使用Qt4.7.4 MSVC2008开发的,因为使用到了OWC10(Office Web Components),使用MSVC编译器的话无法正常升级到Qt4.8.x和Qt5,于是将编 ...
- Qt4项目迁移到Qt5问题:greaterThan(QT_MAJOR_VERSION, 4): QT += widgets .
文章来源:http://blog.csdn.net/ccf19881030/article/details/18220447 问题一:错误:C1083: 无法打开包括文件:"QApplica ...
- 【Qt开发】Qt5.7中文显示乱码解决方法两种
升级到Qt5.X之后,原先解决的Qt显示中文乱码的方法突然不适用了,找了很多方式来解决这个问题 第一种: 在公司代码里看到的方法,先将对应的cpp文件用windows自带的记事本打开,另存为UTF-8 ...
- 关于CUDA C 项目中“ error C2059: 语法错误:“<” ”问题的解决方法
该问题的关键在于理解CUDA项目中C\C++文件需要由c++编译器进行编译,而CUDA C的源文件需要由CUDA的编译器nvcc.exe进行编译. 发生该语法错误的原因是cu文件被C++编译器所编译, ...
- 前端项目, 每次运行都需要输入 sudo 的解决方法
前端项目, 每次运行都需要输入 sudo 的解决方法 node一直提示的sudo问题根本原因为: node 的所有者, 项目的所有者, 不同; 解决方法为: 将项目的所有者更改为 chown -R ` ...
- Win7升级Win10系统提示错误0x80070057的解决方法
Win7系统用户在通过Windows Update来升级Win10系统时,有时会出现0x80070057的错误代码从而导致无法继续升级.下面好系统重装助手就来告诉大家Win7升级Win10系统出现0x ...
随机推荐
- 20160507-hibernate入门
关联映射 多对一(Employee - Department) 一对多(Department-Employee) 一对一(Person - IDCard) 多对多(teacher - student) ...
- ~/.ssh目录找不到解决方法
执行 cd ~/.ssh发现ssh目录找不到 [root@ocdp2 ~]# cd ~/.ssh -bash: cd: /root/.ssh: No such file or directory 原因 ...
- pdf压缩之GSview
今天实验室一个同学在网上投简历,网站要求投稿的简历pdf文件必须在100K以内.简历用的是ModernCV的模板,无论如何设置都在160k左右. 尝试用acrobat的压缩功能,也不能保证在100K以 ...
- xp 中的IIS安装成功之后,访问网页显示没有权限访问解决方法
在做xp的IIS发布网站时遇到一个问题就是当你访问网站的时候,显示没有权限访问网站,但是我已经开启了匿名访问网站了,怎么还没有权限访问呢?后来经过上网搜资料解决,当时很多网上都说没打开匿名访问,当时我 ...
- 【转载】C/C++之回调函数
[转载地址]:http://www.cnblogs.com/chenyuming507950417/archive/2012/01/02/2310114.html 在理解“回调函数”之前,首先讨论下函 ...
- 添加数据库的Maven依赖(SqlServer,Oracle)
oracle: 1.在Oracle官网下载ojdbc的jar包 例:ojdbc7.jar,版本是12.1.0.2,存储地址/home/peng/下载 2.dos中进入存储地址执行如下命令行(注意各项对 ...
- 二维树状数组——SuperBrother打鼹鼠(Vijos1512)
树状数组(BIT)是一个查询和修改复杂度都为log(n)的数据结构,主要用于查询任意两位之间的所有元素之和,其编程简单,很容易被实现.而且可以很容易地扩展到二维.让我们来看一道很裸的二维树状数组题: ...
- vertical-align:middle图片或者按钮垂直居中
<img>或者button按钮 垂直不对齐,加上vertical-align:middle,就能垂直对齐,常用于水平布局的验证码图片 或者按钮 也适用于 text和button在一起也会不 ...
- c#中多线程访问winform控件的若干问题
我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题.然而我们并不能用传统方法来解决这个问题,下面我将详细的介绍. 首先来看传统方法: public partial ...
- 图片裁切插件jCrop的使用心得(一)
之前,项目经理为了提升用户体验让我在之前图片上传功能的基础上实现图片的裁切功能,作为一个前端小白来说听了这个需求心里一紧,毕竟没有做过,于是跟项目经理商量要先做下调研.在一上午的调研中发现了jCrop ...