QT项目升级(QT4.6.3到QT5.2)时,遇到的问题和解决方法

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

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

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

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及以上的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,

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架构, QT5QT库都是支持x86_64架构的,用QT5 qmake 生成的工程必需要xcode4才能打开,xcode4的工程生来就必需先择支持x86_64架构,

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

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


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


如果我们手头有库的源码,把源代码在xcode4上重新生成。

编译选项“Architectures”设置成x86_64




QT 版本号识别 不同系统区分 QT 版本号识别 不同系统区分版本号的识别获取使用QT的版本号qt版本号的比较qt 版本小版本的区别不同系统使用区分 版本号的识别 获取使用QT的版本号 1、$$[QT_VERSION] 在Qt 工程中的pro文件中可以使用message 打印出当前使用qt的版本如 QT += core gui greaterThan(QT_MAJOR_VERSION, 4): QT += widgets message(Qt Version = $$[QT_VERSION] ) 在概要信息的调试窗口会 阅读详情

相关推荐

【工作笔记】labelme安装/错误记录(自用)

labelme安装/错误记录(自用)

自用博客 3806

Qt for android 出现‘KHR/khrplatform.h‘ file not found

在使用OpenGL编译安卓环境候,说“KHR/khrplatform.h”文件没有找到 在对应文件夹中确实没有这个文件 ​ zai

weixin_45394356的博客 2257

opengl头文件khrplatform.h,glext.h,glcorearb.h,glxext.h,wglext.h

2018年为止opengl官方提供的拓展头文件。 - OpenGL 1.2 and above compatibility profile and extension interfaces. - OpenGL core profile and ARB extension interfaces, as described in appendix G.2 of the OpenGL 4.3 Specification. Does not include interfaces found only in the compatibility profile. - GLX 1.3 and above API and GLX extension interfaces. - WGL extension interfaces. The OpenGL headers all depend on the shared header from the EGL Registry . This is a new dependency, introduced in OpenGL-Registry pull request 183 for increased compatibility between OpenGL and OpenGL ES headers.

QT——事件处理机制

它反映了包括Qt在内的GUI应用程序的消息处理模型:   (1) 用户操作界面,被操作系统内核空间中的设备驱动程序感知   (2) 设备驱动程序向操作系统的用户空间的GUI应用程序发出系统消息   (3) GUI应用程序将系统消息转换为信号,进而触发槽函数 在GUI应用程序中,一个核心且关键的操作就是将系统消息转换为信号,涉及到Qt的事件处理机制:   (1) Qt平台将系统底层发来的消息转换为...

静水流深且细水长流 1616

QT5QT6使用qmake创建QML项目的区别

QT5QT6创建使用qmake编译的QML项目默认创建的项目并不相同,主要在于资源管理的方式不同,QT5默认使用.qrc文件管理资源,QT6默认使用resources变量管理资源。本文通过实际的项目进行对比,理清Qmake的两种资源管理方式。

上官永石的博客 4468

[id-00012] Qt5升级Qt6项目遇到的部分问题

说明:问题列不完,遇到就去查文档或者浏览器上找 1.QRegExp: No such file or directory 2.QRegExpValidator: No such file or directory 3.QDesktopWidget: No such file or directory 4.QSound: No such file or directory 5-1.'class QString' has no member named 'leftRef'; did you mean 'left

编程世界中最大的敌人就是自己,而心态才是制胜点。 2610

QT4QT5,打开项目,出现 QMainWindow: No such file or directory 等问题解决方法汇总

1、"error: QMainWindow: No such file or directory", 解决方法: 在.pro文件 #include <QMainWindow> 改为#include <QtWidgets>(若没有#include <QMainWindow>,直接添加#include <QtWidgets>),然后加上 QT...

qq_40318907的博客 1万+

Qt4.8升级Qt5.9版本问题总结

最好先在.pro文件中加上 greaterThan(QT_MAJOR_VERSION, 4): QT += widgets建议最好源码对比看着升级,有些问题不看源码,报出来的问题会误导我们。 1、106: error: 'class QString' has no member named 'toAscii' qDebug() << sql.toAscii().data(...

weixin_38293850的博客 6440

Qt5Qt6的区别

之前有做过将项目QT4迁移到QT5的操作,所以写了一篇QT4Qt5的区别。在最近这一年接触过Qt6后,所以想要介绍一下Qt6Qt5的区别,通过自己的试用感受结合网上各路大佬的点拨,有了一个大概的了解。

weixin_43246170的博客 1万+

Qt5升级Qt6分步迁移教程

在我们的例子中,将应用程序移植到Qt 5的最新版本,然后切换到Qt 6要容易得多。它提供了Qt 6中消失的一些类,例如QRegExpQStringRef,但由于这一点,它仍然可以在Qt 6应用程序中使用。它在Qt 6中不再可用,但是如果您的应用程序使用了很多效果,则很难在没有任何回归的情况下轻松迁移。Qt 6需要C++17或更高版本的编译器(例如,对于Windows – MinGW 8.1.0或msvc 2019),因此如果您使用的是旧版本,则是升级了。因此,如您所见,您的操作取决于需要替换的模块。

yanchenyu365的博客 6617

Qt5升级Qt6的总结

升级过程 整体工作分为如下几个阶段:总结

流水账 2502
上一篇: QT5+xcode4.6小结
下一篇: DMG文件制作脚本
zenghao0708
博客等级 码龄16年 8粉丝 26原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值