QT專案升級(QT4.6.3到QT5.2)時,遇到的問題和解決方法
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'" 】
用樓上的解決方法。不行,試試這個:
【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庫,