zoukankan      html  css  js  c++  java
  • QT项目升级(QT4.6.3到QT5.2)时,遇到的问题和解决方法

    QT4升级到QT5修改:

    PC部分:

    【改QTDIR变量】

    在project根文件夹下找到.user文件InnoTabPlugin.vcxproj.user

    改动指向你的QT5根文件夹:

      <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Template|Win32'">

        <QTDIR>C:qtQt5.2.15.2.1msvc2010</QTDIR>

      </PropertyGroup>  

    或者找到这个文件Qt4VSPropertySheet.props,在里面改动:

    <PropertyGroup Label="UserMacros">

        <QTDIR>c:QtQt5.2.15.2.1msvc2010</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:QtQt5.2.15.2.1Srcqtx11extrasinclude

    改动为:#include <QtX11Extrasqx11info_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 <ActiveQtQAxWidget>

    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'" 

    用楼上的解决方法。不行,试试这个:

    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 XXcode版本号选择】

    请用OS X10.7及以上的macbuildproject。

    xcode则请用4.0以上版本号。

    【更新改动QT proproject文件】

    windows上生成新的.pro文件

       c:qtQt5.2.15.2.1msvc2010inqmake.exe -project

    改动pro文件

        QT += core gui network webkit xml xmlpatterns widgets webkitwidgets 

    在拷贝project到Mac上,把QT proproject文件转成xcodeproject:

         qmake -spec macx-xcode  yourproject.pro 

    【调用webservice soap问题】

    在project中加入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)被加到project,链接时会有以下类似的提示:

    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从project中移除再build

    library architecture不正确链接错误的问题】

    MAC上的编译时引用到库须要支持x86_64架构。 QT5QT库都是支持x86_64架构的。用QT5 qmake 生成的project必须要xcode4才干打开。xcode4的project生来就必需先择支持x86_64架构,

    这就要求我们用到的库都必需支持x86_64架构。查看库是不是支持x86_64架构能够用“otool -h filepath

    有红框里的就是支持x86_64架构


    仅仅有绿框的仅仅支持i386和ppc.


    假设我们手头有库的源代码,把源代码在xcode4上又一次生成。

    编译选项“Architectures”设置成x86_64




  • 相关阅读:
    SGX技术初探
    DH 密钥交换算法
    SSM整合框架实现ajax校验
    为什么要重写toString()方法和hashcode()方法
    java数组实现简单的DVD管理
    java冒泡排序
    windows下java环境变量配置
    Java实现视频网站的视频上传、视频转码、视频关键帧抽图, 及视频播放功能
    Eclipse SVN 冲突的 介绍 及 四种解决方式
    java中的重载(overload)和重写(override)区别
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/6936217.html
Copyright © 2011-2022 走看看