天天看點

将某個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宏的問題,現在先不改吧,雖然新方法去除了這兩個宏,并且加強了類型檢查,但也又增加了類名和一個&符号,先偷懶不動吧。