qt4.8到qt5.2windows版本的升級遇到的實際問題.

背景:

    新項目中的qt用了比較新的qt5.2.1版本,本人之前一直用qt4.8.2,後來在家把項目拷貝後發現各種報錯各種構建問題,起初是環境變量的問題各種qtcreator的設置和各種windows環境變量的設置,後來發現連“<QtGui/Application>”都找不到,這還搞毛?說明QT的庫根本沒識別啊那還怎麼進行下步編程調試,後來我從新創建了個最基本的工程就show一個mainwindow發現好使的,對比下2個項目文件發現,頭文件的包含格式都不對.而且在pro文件中還多了些東西.隨後便查閱網上資料的說法後終於確定原來qt5確實變化大了...具體細節如下(當然估計還有不爲人知的東東有待發現):

一、將某個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預編譯版本發佈了,於是就拿它練手,將它升級到Qt5,以減少系統中存在的多個Qt版本 。遇到的問題如下:

1.  由於Qt5將大部分桌面部件移到了Qt Widgets模塊中,所以在.pro中要增加下面一行

QT += widgets


2. 程序中使用了OWC10,用到了ActiveQt,原來的做法是在.pro中加CONFIG += qaxcontainer,現在需要改成

QT += axcontainer

當然了,原來的CONFIG += qaxcontainer也將去除


3. 爲了充分使用C++11特性,在.pro中加下面一行

CONFIG += c++11


4. 在源文件中,凡是涉及到原QtGui中可視部件的,全要修改頭文件引用,或者增加QtWidgets頭文件,比如:

#include <QtGui/QPushButton>  要改成  #include <QPushButton>  或者  #include <QtWidgets/QPushButton>

在以前使用#include <QtGui>的地方,要加上 #include <QtWidgets>


5. 由於Qt5去除了QTextCodec::setCodecForCStrings()函數,所以在涉及到在cpp中直接寫漢字的情況,有如下兩種修改方法:

a)  如果以前的源文件編碼是GBK的,則需要使用QString::fromLocal8Bit()函數將原來的漢字括起來;或者直接將源文件編碼轉換成UTF-8的(缺點是MSVC編譯器不能方便的使用了)。我使用了使用QString::fromLocal8Bit()來調用的方式(當然了,另寫便捷函數或宏來處理)

b) 如果以前的源文件編碼是UTF-8的,則什麼都不用動。


6. 以前使用QDesktopServices::storageLocation(QDesktopServices::xxxx)來獲取一些系統目錄,現在則要改成

QStandardPaths::writableLocation(QStandardPaths::xxxx)


7. 以前調用QFileDialog::getSaveFileName()時,如果在Windows下使用Native Dialog形式指定文件名,則能正常顯示,如今Qt5不能正常顯示文件名。所以將它的後兩個參數加上了,即QFileDialog::getSaveFileName(xxx, xxx, xxx, xxx, 0, QFileDialog::DontUseNativeDialog),這樣就正常了,只是它的對話框不是系統形式的,暫且將就吧。


8. 還有,Qt5解決了ui_qaxselect.h文件的問題。在Qt4時代,使用ActiveQt時,老提示沒有這個文件,需要自己找到源代碼手工uic qaxselect.ui > ui_qaxselect.h來生成一下,Qt5中則解決了該問題。


9.使用到打印相關的類,Qt5單獨放到了QtPrintSupport模塊中,所以得加頭文件#include <QtPrintSupport>,在.pro中要加QT += printsupport


10. 使用到QWebPage等webkit相關可視部件的,Qt5單獨放到了QtWebKitWidgets模塊中,所以得加頭文件#include <QtWebKitWidgets>,在.pro中要加QT += webkitwidgets


11. Qt4中的cleanlooks、plastique、cde、motif等主題樣式沒有,新加了個fusion,好吧,問題是我的一個項目框架使用的是cleanlooks主題樣式然後加自定義樣式表,這下可好,升級Qt5後,樣子有的就與windowsvista或fusion不相符或有缺陷,得調整一下了。所以,對主題樣式依賴比較嚴重的程序,要衡量一下是否要升級到Qt5了。


12. .pro文件中的TARGET在Qt4(qmake v2)中是可以不填寫的,那麼它就從自動採用.pro文件名字,而在Qt5中(qmake v3)這個TARGET不可不寫。


13. Q_WS_XX的宏不可用了,使用Q_OS_XX代替.


至於c++11 支持的連接信號與槽時可以不使用SLOT、SIGNAL宏的問題,現在先不改吧,雖然新方法去除了這兩個宏,並且加強了類型檢查,但也又增加了類名和一個&符號,先偷懶不動吧。

二、QT5.0的改動

 

1. Qt5加入了JSON支持
2. Qt5支持的平臺有: 桌面平臺:Windows, Linux/X11, Mac OS X 
嵌入式平臺: Embedded Linux(DirectFB, EGLFS, KMS, Wayland), WIndows Embedded(Compact and Standard), Real-Time OS(QNX, VxWorks, INTEGRITY) 
移動平臺:Android, iOS, Windows 8(WinRT), BlackBerry 103. QtQuick2, 
新增了許多新QML Elements,要求有OpenGL(ES)或DirectX支持,還有關於圖形效果、多媒體方面的加 強
4. 新增了QGuiApplication 和QWindow,用於QtQuick,如果是開發傳統的基於QWidgrets的程序,仍然使用以前的QApplication和QMainWindow
5. 新的QtGui中只包含了少量GUI核心的內容,原來Qt4中的QtGui中包含的大多數Widgets、ItemView、GraphicsView相關內容都被移到了QtWidgets模塊中,所以在Qt5中,如果開發QtQuick2應用,就可以去除QtWidgets模塊了,不是必須的了。
6. 單獨的QtMultimedia模塊,可在C++和QML中使用,支持audio、video、radio、mediaplayer、camera等接口
7. QtNetwork模塊中新增了bearer managemtn,來控制系統的(網絡等)連接狀態
8. QtQml模塊提供基本的QML引擎、類型、對象等以及與其有關的C++支持,而QtQuick模塊則提供了基本的QML Elements。
總體來說 :從Qt4到Qt5的升級比較平穩,不會像Qt3到Qt4那樣相當於重新寫了一遍。並且QtQuick的升級也算平穩(C++中主程序要有所變化),還將一些原來QtMobility中的內容移到了Qt5中。開始支持主流移動平臺(Android、iOS、Window 8(WinRT)、BlackBerry 10),Symbian已經不再更新發展,就讓它遠去吧。至於MeeGo/Sailfish,應該將它歸類到Linux/X11中去,嵌入式平臺中則增加了QNX(其實BlackBerry 10也是基於QNX的)。

資料參考:http://hi.baidu.com/xchinux/item/9044d8ce986accbb0d0a7b87
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章