1. 程式人生 > >QT專案升級(QT4.6.3到QT5.2)時,遇到的問題和解決方法

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的一個主要的基礎架構修改是,將widgetQtGui模組剝離開來,

新增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);

QHttpQNetworkAccessManager代替】

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.libmsvcrtd.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 XXcode版本選擇】

請用OS X10.7及以上的macbuild工程。

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,