首页 > 代码库 > QT项目升级(QT4.6.3到QT5.2)时,遇到的问题和解决方法
QT项目升级(QT4.6.3到QT5.2)时,遇到的问题和解决方法
QT4升级到QT5修改:
PC部分:
【改QTDIR变量】
在project根文件夹下找到.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来buildproject。
xcode则请用4.0以上版本号。
【更新改动QT proproject文件】
在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
在拷贝project到Mac上,把QT proproject文件转成xcodeproject:
qmake -spec macx-xcode yourproject.pro
【调用webservice soap问题】
在project中加入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)被加到project,链接时会有以下类似的提示:
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从project中移除再build。
【library architecture不正确链接错误的问题】
在MAC上的编译时引用到库须要支持x86_64架构。 QT5的QT库都是支持x86_64架构的。用QT5 的qmake 生成的project必须要xcode4才干打开。xcode4的project生来就必需先择支持x86_64架构,
这就要求我们用到的库都必需支持x86_64架构。查看库是不是支持x86_64架构能够用“otool -h filepath”
有红框里的就是支持x86_64架构
仅仅有绿框的仅仅支持i386和ppc.
假设我们手头有库的源代码,把源代码在xcode4上又一次生成。
编译选项“Architectures”设置成x86_64
QT项目升级(QT4.6.3到QT5.2)时,遇到的问题和解决方法