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 或 msvcrt d .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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章