IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> c++程序从QT5(MSVC2015)移植到QT6.2(MSVC2019) -> 正文阅读

[开发工具]c++程序从QT5(MSVC2015)移植到QT6.2(MSVC2019)

非系统性文档,遇到一个记录一个


问题描述1:

1. error: C1083: 无法打开包括文件: “QTextCodec”: No such file or directory

原因分析:

QT6版本已经去除了QTextcodec,需要使用QT5模块来兼容。

解决方案:

首先在安装QT6时选择QT5兼容模块;
在这里插入图片描述
在这里插入图片描述

我安装的是QT6.2.2,目前已更新到6.3.0-beta,更新时选择自己已安装的版本的QT5兼容模块即可。
然后在.pro文件中加入

greaterThan(QT_MAJOR_VERSION, 5): QT += core5compat

即可


问题描述2:

error: C2872: “byte”: 不明确的符号

原因分析:

c++17引入了类型 std::byte,如果 代码中使用了using namespace std;则会出现编译错误

解决方案:

所有头文件(请注意是头文件,cpp文件使用是没问题的),去掉
using namespace std;
原有代码,vector,map等等std里的模板类需要添加std::,这有可能是个大工程,如果你的代码里有大量的未使用std的模板类; 如果工程头文件都改了发现还是有这个问题,那么就去找引用的外部头文件,肯定有using namespace std;果断干掉。

问题描述3:

error: Project ERROR: Unknown module(s) in QT: webengine

原因分析:

在.pro文件中使用
QT += webengine
在执行qmake产生以上错误,该模块在QT6.2中已经被拆分成几个独立的模块,可在帮助文档里查看。

在这里插入图片描述

解决方案:

在.pro文件里删除
QT += webengine
根据实际使用情况替换成如下模块
//.h文件
#include <QtWebEngineCore>
#.pro文件
QT += webenginecore
//.h文件
#include <QtWebEngineQuick>
#.pro文件
QT += webenginequick
//.h文件
#include <QtWebEngineWidgets>
#.pro文件
QT += webenginewidgets

问题描述4:

error: 'QMatrix' file not found

原因分析:

QMatrix 类在QT6中已经废除了。

解决方案:

使用QTransform作为替换 ,函数功能基本一致。 附带错误:
//原函数
void GraphicsView::setMatrix(const QMatrix &matrix)//后边有没有缺省值不清楚,已更新代码,原来的没去查
//同步替代
void GraphicsView::setTransform(const QTransform &matrix, bool combine = false);

问题描述5:

error: no member named 'delta' in 'QWheelEvent'

原因分析:

QWheelEvent类在QT6中有部分函数修改

解决方案:

//QWheelEvent
//原函数
delta()
//更新
inline QPoint angleDelta() const { return m_angleDelta; }
angleDelta().y()(QPoint的y()函数)替代原delta()。
//基类QSinglePointEvent
//原函数
pos()
//更新
inline QPointF position() const

问题描述6:

error: C2039: "setIniCodec": 不是 "QSettings" 的成员

原因分析:

QSettings的 setIniCodec 方法移除了。

在这里插入图片描述

解决方案:

没用了,那就直接不用了呗。

问题描述7:

在这里插入图片描述

一堆问题,但都是QtConcurrent及相关的QtFuture的问题。

原因分析:

基本都是因为run函数引起的错误。
template <typename T> QFuture<T> QtConcurrent::run(Function function, ...)
这里只拿一个重载函数为例,带不带线程池参数无所谓,原因不在这里,问题在后边的执行函数及其参数。已经更新代码不方便截图,但我记得以前是放在run里运行的函数最多只能有6(5?)个参数,而且是每个个数都重载了一遍(现在已改成上边的...这种方式,不限数量)。

run函数使用类成员变量,需要在run函数的参数里添加this指针

引起上述问题的原因就是this的位置变了

解决方案:

按现有格式更新形参顺序。
//QT5 QtConcurrent::run函数格式
QtConcurrent::run(this, &SomeClass::memberFun, ...);//...代表memberFun的不同个数的形参
//QT6 QtConcurrent::run函数格式
QtConcurrent::run(&SomeClass::memberFun, this, ...);//...代表memberFun的不同个数的形参

问题描述8:

error: C2664: “QString &QString::remove(QChar,Qt::CaseSensitivity)”: 无法将参数 1 从“QRegExp”转换为“QChar”
调用QString &remove(const QRegExp &rx)报错。

原因分析:

//QT5.15
QString &remove(const QRegExp &rx)//QT6.2移除了
QString &remove(const QRegularExpression &re)

解决方案:

//采用另一个函数替代即可
QString &remove(const QRegularExpression &re)

问题描述9:

error: C2039: “addRoundRect”: 不是 “QPainterPath” 的成员

原因分析:

在这里插入图片描述

//QT6.2
void QPainterPath::addRoundedRect(const QRectF &rect, qreal xRadius, qreal yRadius, Qt::SizeMode mode = Qt::AbsoluteSize)
void QPainterPath::addRoundedRect(qreal x, qreal y, qreal w, qreal h, qreal xRadius, qreal yRadius, Qt::SizeMode mode = Qt::AbsoluteSize)
新版函数名称和参数修改了

解决方案:

功能没变,按新函数和参数使用即可。

问题描述10:

error: C2039: "setBackgroundColor": 不是 "QTableWidgetItem" 的成员

原因分析:

函数名更新为
void QTableWidgetItem::setBackground(const QBrush &brush)

解决方案:

功能没变,按新函数使用即可。

问题描述11:

error: static_cast from 'QAbstractSocket::SocketError (QAbstractSocket::*)() const' to 'void (QAbstractSocket::*)(QAbstractSocket::SocketError)' is not allowed

原因分析:

QtNetwork中的错误信号error换成了errorOccurred,在使用connect连接这个信号时会根据不同情况报不同错误
void QTableWidgetItem::setBackground(const QBrush &brush)

解决方案:

使用新名称的信号进行connect即可。

问题描述12:

error: C3861: “margins”: 找不到标识符

原因分析:

QLayout的margin() 移除了。 类似的setMargin()也移除了

解决方案:

根据所用的位置,采用contentsMargins().left()、contentsMargins().top()、contentsMargins().bottom()、contentsMargins().right(),替换。setMargin()替换成setContentsMargins()。

问题描述13:

qtpropertybrowser使用时
Cannot read xxx/Qt/6.2.2/Src/qttools/src/shared/qtpropertybrowser/qtpropertybrowser.pri: No such file or directory

已安装源码

原因分析:

QT5以前在xxx/Qt/6.2.2/Src/qttools/src/shared下的各种工具源码存在对应的.pri文件,QT6以后.pri文件删除了,所以找不到对应文件

解决方案:

//qtpropertybrowser.pri
INCLUDEPATH += $$PWD
SOURCES += $$PWD/qtpropertybrowser.cpp \
            $$PWD/qtpropertymanager.cpp \
            $$PWD/qteditorfactory.cpp \
            $$PWD/qtvariantproperty.cpp \
            $$PWD/qttreepropertybrowser.cpp \
            $$PWD/qtbuttonpropertybrowser.cpp \
            $$PWD/qtgroupboxpropertybrowser.cpp \
            $$PWD/qtpropertybrowserutils.cpp
HEADERS += $$PWD/qtpropertybrowser.h \
            $$PWD/qtpropertymanager.h \
            $$PWD/qteditorfactory.h \
            $$PWD/qtvariantproperty.h \
            $$PWD/qttreepropertybrowser.h \
            $$PWD/qtbuttonpropertybrowser.h \
            $$PWD/qtgroupboxpropertybrowser.h \
            $$PWD/qtpropertybrowserutils_p.h
RESOURCES += $$PWD/qtpropertybrowser.qrc
将被删除的qtpropertybrowser.pri的内容添加进工程文件.pro中。 第一种方式在源码路径下新建qtpropertybrowser.pri文件并将原来的内容添加进去
//pro文件
include($$[QT_INSTALL_PREFIX]/../Src/qttools/src/shared/qtpropertybrowser/qtpropertybrowser.pri)
第二种方式,将内容直接添加进工程文件.pro。
//.pro
QTPROPERYBROWSER_DIR = $$[QT_INSTALL_PREFIX]/../Src/qttools/src/shared/qtpropertybrowser

INCLUDEPATH += $$QTPROPERYBROWSER_DIR
SOURCES +=  $$QTPROPERYBROWSER_DIR/qtpropertybrowser.cpp \
            $$QTPROPERYBROWSER_DIR/qtpropertymanager.cpp \
            $$QTPROPERYBROWSER_DIR/qteditorfactory.cpp \
            $$QTPROPERYBROWSER_DIR/qtvariantproperty.cpp \
            $$QTPROPERYBROWSER_DIR/qttreepropertybrowser.cpp \
            $$QTPROPERYBROWSER_DIR/qtbuttonpropertybrowser.cpp \
            $$QTPROPERYBROWSER_DIR/qtgroupboxpropertybrowser.cpp \
            $$QTPROPERYBROWSER_DIR/qtpropertybrowserutils.cpp
HEADERS +=  $$QTPROPERYBROWSER_DIR/qtpropertybrowser.h \
            $$QTPROPERYBROWSER_DIR/qtpropertymanager.h \
            $$QTPROPERYBROWSER_DIR/qteditorfactory.h \
            $$QTPROPERYBROWSER_DIR/qtvariantproperty.h \
            $$QTPROPERYBROWSER_DIR/qttreepropertybrowser.h \
            $$QTPROPERYBROWSER_DIR/qtbuttonpropertybrowser.h \
            $$QTPROPERYBROWSER_DIR/qtgroupboxpropertybrowser.h \
            $$QTPROPERYBROWSER_DIR/qtpropertybrowserutils_p.h
RESOURCES += $$QTPROPERYBROWSER_DIR/qtpropertybrowser.qrc

以下方式不可行

//pro文件
INCLUDEPATH += $$[QT_INSTALL_PREFIX]/../Src/qttools/src/shared/qtpropertybrowser
这种方式可以解决头文件引用问题,但未将cpp实现引用工程中。可以很容易猜到会出现以下错误:

在这里插入图片描述


问题描述14:

error: C2039: "created": 不是 "QFileInfo" 的成员

原因分析:

该函数弃用了,而且从QT5.10开始更新成
QDateTime QFileInfo::birthTime() const [since 5.10] 

解决方案:

使用新函数即可。

问题描述15:

warning: 'String' is deprecated: Use QMetaType::Type instead.

原因分析:

这并不是一个错误,而是一个警告。写的也很明白,这个枚举在将来会被弃用,所以现在直接替换,免得后续麻烦。

在这里插入图片描述

解决方案:

enum QMetaType::Type
注意新的枚举的内容名称有所变化,但很容易对应,例如原来的QVariant::String变成QMetaType::QString

在这里插入图片描述


问题描述16:

在这里插入图片描述

原因分析:

原QTime的计时功能删除了。

解决方案:

使用QElapsedTimer

问题描述17:

QString废弃了一些函数

在这里插入图片描述

原因分析:

解决方案:

QString &QString::vsprintf(const char *cformat, va_list ap)
This function is obsolete. It is provided to keep old source code working. We strongly advise against using it in new code.

Use vasprintf(), arg() or QTextStream instead.
使用QElapsedTimer

问题描述18:

error: C2039: "fromList": 不是 "QSet< T >" 的成员.

原因分析:

在这里插入图片描述

解决方案:

在这里插入图片描述


问题描述19:

error: C2039: "fromTime_t": 不是 "QDateTime" 的成员.

原因分析:

在这里插入图片描述

解决方案:

在这里插入图片描述


问题描述20:

error: ISO C++17 does not allow 'register' storage class specifier.

原因分析:

register关键字在c++11中被弃用,c++17中被删除

解决方案:


问题描述21:

QPoint QMouseEvent::globalPos() const

原因分析:

warning: This function is deprecated since 6.0. We strongly advise against using it in new code.

解决方案:

Use globalPosition().toPoint() instead.

问题描述22:

error: unknown type name 'QT_CHARTS_USE_NAMESPACE'

原因分析:

QT_CHARTS_USE_NAMESPACE是在使用QChart的时候涉及的一个宏定义,原来QChart是放在QtCharts这个命名空间的,QT_CHARTS_USE_NAMESPACE是为了方便而定义的,类似的还有QT_CHARTS_BEGIN_NAMESPACE,QT_CHARTS_END_NAMESPACE等。 新版QT6的实现去除的这些宏,QChart也不在命名空间里了

解决方案:

直接删除这个宏即可。

问题描述23:

error: C2664: “QByteArray &QByteArray::insert(qsizetype,QByteArrayView)”: 无法将参数 2 从“const QString”转换为“QByteArrayView”

原因分析:

QByteArray::insert函数有多个重载,其中
(obsolete) QByteArray &	insert(int i, const QString &str)
弃用,原代码中使用这个重载会报以上错误。

解决方案:

QByteArray QString::toUtf8() const
将QString转换成QByteArray即可。
  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2022-02-16 13:19:30  更:2022-02-16 13:21:45 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 8:51:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码