非系统性文档,遇到一个记录一个
问题描述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
根据实际使用情况替换成如下模块
#include <QtWebEngineCore>
#.pro文件
QT += webenginecore
#include <QtWebEngineQuick>
#.pro文件
QT += webenginequick
#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中有部分函数修改
解决方案:
delta()
inline QPoint angleDelta() const { return m_angleDelta; }
angleDelta().y()(QPoint的y()函数)替代原delta()。
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的位置变了
解决方案:
按现有格式更新形参顺序。
QtConcurrent::run(this, &SomeClass::memberFun, ...);
QtConcurrent::run(&SomeClass::memberFun, this, ...);
问题描述8:
error: C2664: “QString &QString::remove(QChar,Qt::CaseSensitivity)”: 无法将参数 1 从“QRegExp”转换为“QChar” 调用QString &remove(const QRegExp &rx)报错。
原因分析:
QString &remove(const QRegExp &rx)
QString &remove(const QRegularExpression &re)
解决方案:
QString &remove(const QRegularExpression &re)
问题描述9:
error: C2039: “addRoundRect”: 不是 “QPainterPath” 的成员
原因分析:
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文件删除了,所以找不到对应文件
解决方案:
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文件并将原来的内容添加进去
include($$[QT_INSTALL_PREFIX]/../Src/qttools/src/shared/qtpropertybrowser/qtpropertybrowser.pri)
第二种方式,将内容直接添加进工程文件.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
以下方式不可行
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即可。
|