非系统性文档,遇到一个记录一个
问题描述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?)个参数,而且是每个个数都重载了一遍(现在已改成上边的...这种方式,不限数量)。
引起上述问题的原因就是this的位置变了。run函数使用类成员函数,需要在run函数的参数里添加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连接这个信号时会根据不同情况报不同错误。解决方案:
使用新名称的信号进行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.
问题描述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即可。
问题描述24:
warning:Use multi-arg instead [clazy-qstring-arg]原因分析:
这同样是一个警告,引起这个警告的原因是使用QString().arg().arg().arg()
这种形式,用了一大堆arg函数。
解决方案:
//qstring.h
arg(Args &&...args) const
{ return qToStringViewIgnoringNull(*this).arg(std::forward<Args>(args)...); }
QString新增了一个arg函数的重载函数,qToStringViewIgnoringNull返回的是QStringView类。
//qstringview.h
template <typename...Args>
[[nodiscard]] inline QString arg(Args &&...args) const; // defined in qstring.h
QStringView类在QT5.10引入,其模板函数arg形式如上。啰嗦了一堆,改起来很简单,将
QString().arg().arg().arg()
改成
QString().arg(...)
例如,
QString("xxx: %1, xxx: %2").arg("第一个参数").arg("第二个参数");
QString("xxx: %1, xxx: %2").arg("第一个参数", "第二个参数");
问题描述25:
note: expanded from macro 'Q_DECL_OVERRIDE' qabstractnativeeventfilter.h:55:18: note: hidden overloaded virtual function 'QAbstractNativeEventFilter::nativeEventFilter' declared here: type mismatch at 3rd parameter ('qintptr *' (aka 'long long *') vs 'long *')原因分析:
继承QAbstractNativeEventFilter的类重写虚函数错误。//QT6
virtual bool nativeEventFilter(const QByteArray &eventType, void *message, qintptr *result) = 0;
//QT5
virtual bool nativeEventFilter(const QByteArray &eventType, void *message, long *result) = 0;
解决方案:
更新虚函数。问题描述26:
error: no member named 'init' in 'QStyleOption'原因分析:
名称修改由void init(const QWidget *w); 修改为 void initFrom(const QWidget *w);解决方案:
更新函数。问题描述27:
error: no member named 'Background' in 'QPalette'原因分析:
肯定是枚举名称改了,QT6文档中为
解决方案:
更新枚举名称。问题描述28:
error: C1083: 无法打开包括文件: “QDesktopWidget”: No such file or directory原因分析:
从 Qt 6.0 起移除QtWidgets :: QDesktopWidget解决方案:
QtGui :: QScreen替代问题描述29:
error: C2039: "background": 不是 "QPalette" 的成员原因分析:
background()函数移除解决方案:
用window()函数替代问题描述30:
error: C2039: "foreground": 不是 "QPalette" 的成员原因分析:
foreground()函数移除解决方案:
用windowText()函数替代问题描述31:
error: C2039: "dark": 不是 "QColor" 的成员原因分析:
dark()函数移除解决方案:
用darker()函数替代问题描述32:
error: C2661: “QPixmapCache::find”: 没有重载函数接受 1 个参数原因分析:
函数接口更新QPixmap *QPixmapCache::find(const QString &key);
改为
static bool find(const QString &key, QPixmap *pixmap);
解决方案:
使用新接口函数替代问题描述33:
error: C2065: “PE_IndicatorViewItemCheck”: 未声明的标识符原因分析:
枚举名称更改解决方案:
使用新的枚举名称PE_IndicatorItemViewItemCheck
问题描述34:
error: C2440: “默认参数”: 无法从“int”转换为“Qt::WindowFlags”原因分析:
在函数里使用Qt::WindowFlags flags = 0explicit xxx(QWidget* parent = Q_NULL, Qt::WindowFlags flags = 0);
解决方案:
explicit xxx(QWidget* parent = Q_NULL, Qt::WindowFlags flags = Qt::WindowType(0));
问题描述35:
error: C2039: "width": 不是 "QFontMetrics" 的成员原因分析:
QT4.8文档,函数名更改
解决方案:
使用新名称[since 5.11] int QFontMetrics::horizontalAdvance(const QString &text, int len = -1) const
[since 5.11] int QFontMetrics::horizontalAdvance(QChar ch) const
问题描述36:
error: C2664: “void QWidget::enterEvent(QEnterEvent *)”: 无法将参数 1 从“QEvent *”转换为“QEnterEvent *原因分析:
函数接口更改导致的重写及函数内部相关错误virtual void enterEvent(QEvent*);
解决方案:
所有使用virtual void enterEvent(QEvent*);的地方,更改位virtual void enterEvent(QEnterEvent *);
问题描述37:
error: C2039: "globalStrut": 不是 "QApplication" 的成员原因分析:
已废弃,如果没使用setGlobalStrut,默认返回一个宽高都为0的QSize
解决方案:
使用QSize(0,0)替换问题描述38:
error: C2039: "globalStrut": 不是 "QApplication" 的成员原因分析:
已废弃,如果没使用setGlobalStrut,默认返回一个宽高都为0的QSize
解决方案:
使用QSize(0,0)替换问题描述39:
error: C2039: "desktop": 不是 "QApplication" 的成员QRect screen = QApplication::desktop()->availableGeometry(this);
原因分析:
已废弃
解决方案:
使用QRect screen = qApp->primaryScreen()->availableGeometry();
问题描述40:
if (QApplication::desktop()->isVirtualDesktop())
return QApplication::desktop()->screenNumber(pos);
else
return QApplication::desktop()->screenNumber(w);
由于QDesktopWidget已经废弃,其对应函数也已废弃
原因分析:
已废弃解决方案:
Use QScreen::virtualSiblings() of primary screen instead.
528

被折叠的 条评论
为什么被折叠?



