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 [email protected] 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文件:
从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

时间: 2024-10-04 05:39:34

QT4项目升级到QT5遇到的问题和解决方法的相关文章

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

本文转载自http://hi.baidu.com/xchinux/item/9044d8ce986accbb0d0a7b87 一.将某个QT4项目改成QT5遇到的问题 该Qt4项目以前是使用Qt4.7.4 MSVC2008开发的,因为使用到了OWC10(Office Web Components),使用MSVC编译器的话无法正常升级到Qt4.8.x和Qt5,于是将编译器转成了MinGW4.7,Qt升级到了4.8.4.今天Qt 5.0.1-MinGW预编译版本发布了,于是就拿它练手,将它升级到Qt

Android eclipse导入项目后出现Unable to resolve target &#39;android-17&#39;解决方法

eclipse导入项目后出现Unable to resolve target 'android-17'解决方法,在最后附带另一种编译逻辑不成功情况解决方法. 一.问题情况 二.解决办法 1.修改项目的目标版本与当前Android sdk相对应的版本 2.自动修复一下项目 三.这个问题不是上面的.是另外情况,在这里也奉上.如果项目出现逻辑正确,可能有些项目东西没有编译到.解决办法: 版权声明:本文为博主原创文章,未经博主允许不得转载. Android eclipse导入项目后出现Unable to

关于CUDA C 项目中“ error C2059: 语法错误:“&lt;” ”问题的解决方法

该问题的关键在于理解CUDA项目中C\C++文件需要由c++编译器进行编译,而CUDA C的源文件需要由CUDA的编译器nvcc.exe进行编译. 发生该语法错误的原因是cu文件被C++编译器所编译,C++编译器无法识别 "<<<",导致报错. 为什么cu文件会被C++编译器所编译呢?原因在于我们使用#include将cu文件包含到了C++文件中.对于#include的用途,更简单的理解就是把几个文件合并成一个文件,所以,当编译C++文件中,包含其中的cu文件也会被编

Qt4 项目迁移到 Qt5 问题

该文章原创于Qter开源社区(www.qter.org),作者 yafeilinux,转载请注明出处! 1)编码问题 我们打开现有的 Qt 4 版本的 helloworld 源码目录(此代码下载请点此链接),然后将 helloworld.pro 文件拖入到 Qt Creator 中打开该项目,这时会跳转到项目模式,进行项目配置,也就是选择构建套件.这里默认使用桌面版的 Qt 5.2 即可,如下图所示,然后点击 ConfigureProject 按钮. 下面我们打开项目文件列表中的 helloDi

升级Ubuntu 16.04之后报错解决方法

升级Ubuntu 16.04之后报错解: A start job is running for Hold until boot process finishes up (Xmin Xs/no limit) 解决方法: Go in your safe mode by hitting SHIFT key or ESC. select networking , then drop to root prompt. Then run following commands. sudo apt-get rem

MVC项目部署到II6所遇问题及解决方法

一.IIS部署基本问题 将项目部署部署到IIS时,启动网站常会遇到页面报错not found 403 可能原因: 1.应用程序池.Net Framework版本不对,解决方法打开控制面板-->管理工具-->Internet信息服务(IIS)管理器,打开应用程序池选择项目的应用程序,配置为相应版本: 2.在部署项目时经常遇到项目的.Net版本较高,在电脑上装了高版本.Net Framework.报错是因为在IIS先装后装.Net Framework时需要重新注册一次. 解决方法打开文件位置C:\

jenkins构建java项目找不到命令mvn,java的解决方法

jenkins构建java项目时出现的报错情况: $ mvn clean install FATAL: command execution failed java.io.IOException: error=2, No such file or directory at java.lang.UNIXProcess.forkAndExec(Native Method) at java.lang.UNIXProcess.<init>(UNIXProcess.java:247) at java.la

关于xamarin 运行项目报 一个或多个项目目标不支持生成操作“EmbeddedResource” 错误解决方法

1. 清理整个项目 2.删除 bin 和obj 3. 以管理员身份 打开VS,重新生成就不在会报错. 貌似 管理员总是那么的魔性~~~

Eclipse中项目红叉但找不到错误解决方法

首先windows-show view-problems 根据地址查找错误 若提示: Description    Resource    Path    Location    TypeJava compiler level does not match the version of the installed Java project facet.    iswustserver        Unknown    Faceted Project Problem (Java Version