达梦Qt接口源码Qt6编译错误处理记录
摘要:
此文为为适配Qt6编译达梦Qt接口源码时发现的错误及详细处理记录备案。
下载网页链接:https://eco.dameng.com/download/?_blank
下载包qt_src-2142-20250328.zip,使用了源码包中最新的5.12版。
操作系统:deepin V25
编译环境:Qt 6.9.1
用Qt 6.9.1进行达梦Qt接口源码编译时报错,包括枚举迁移、构造函数重载移除、类型废弃等,主要是Qt6接口发生变更,达梦Qt接口源码未同步适配引起,以下是详细修改记录。
注为5.12版本源码。
文件全路径为:
${QT_HOME}/6.9.1/Src/qtbase/src/plugins/sqldrivers/dm/qsql_dm.cpp
报错位置:
第 290/299 行
错误原因:
QSqlError 构造函数参数4类型为const QString&,但传入的nativeCode(达梦错误码)类型为int。
参考QSqlError 构造函数签名(QT 6):
QSqlError(const QString& driverText, const QString& databaseText, QSqlError::ErrorType type, const QString& nativeErrorCode = QString())
修改方案:
将 int 类型的 nativeCode 用 QString::number() 转为字符串。
第 290 行原代码:
return QSqlError(QLatin1String("QDM: ") + err, message, type, nativeCode);
修改后:
return QSqlError(QLatin1String("QDM: ") + err, message, type, QString::number(nativeCode));
第 299 行原代码:
return QSqlError(QLatin1String("QDM: ") + err, qDMWarn§, type, nativeCode);
修改后:
return QSqlError(QLatin1String("QDM: ") + err, qDMWarn§, type, QString::number(nativeCode));
报错位置:
第 941 行
错误原因:
QT5中该枚举属于QString,QT6已将QString::SkipEmptyParts迁移到Qt命名空间,改为 Qt::SkipEmptyParts。
修改方案:
将 QString::SkipEmptyParts 改为 Qt::SkipEmptyParts,确保代码包含头文件:
#include <QtCore>
第 941 行原代码
const QStringList opts(connOpts.split(QLatin1Char(’;’), QString::SkipEmptyParts));
修改后:
const QStringList opts(connOpts.split(QLatin1Char(’;’), Qt::SkipEmptyParts));
报错位置:
第 2789/3425 行
错误原因:
QT6 QVariant构造方式变更,自定义类型需通过QMetaType对象构造。
qRegisterMetaType返回int类型ID,QT6不支持直接传入。
修改方案:
先通过qRegisterMetaType获取类型ID,再构造QMetaType对象传入QVariant构造函数。
第 2789 行原代码
return QVariant(qRegisterMetaType<dhandle>(“dhandle”), &d->hStmt);
修改后:
QMetaType dhandleMeta = QMetaType::fromType<dhandle>();
return QVariant(dhandleMeta, &d->hStmt);
第 3425 行原代码
return QVariant(qRegisterMetaType<dhandle>(“dhandle”), &d->hDbc);
修改后
QMetaType dmHandleType(qRegisterMetaType<dhandle>(“dhandle”));
return QVariant(dmHandleType, &d->hDbc);
主要涉及2个变化,需批量替换。
第 302 行原代码:
static QVariant::Type qDecodeDMType(sdint2 dtype, bool isSigned = true)
修改后:
static QMetaType::Type qDecodeDMType(sdint2 dtype, bool isSigned = true)
第 304 行原代码:
QVariant::Type type = QVariant::Invalid;
修改后:
QMetaType::Type type = QMetaType::UnknownType;
第 918 行原代码:
QVariant::Type type = qDecodeDMType(colType, unsignedFlag == DSQL_FALSE);
修改后:
QMetaType::Type type = qDecodeDMType(colType, unsignedFlag == DSQL_FALSE);
类似所有QVariant::XXX枚举都需要修改为QMetaType::XXX。
311行原代码:
type = QVariant::Double;
修改后:
type = QMetaType::Double;
316行原代码:
type = isSigned ? QVariant::Int : QVariant::UInt;
修改后:
type = isSigned ? QMetaType::Int : QMetaType::UInt;
319行原代码:
type = QVariant::Int;
修改后:
type = QMetaType::Int;
322行原代码:
type = isSigned ? QVariant::LongLong : QVariant::ULongLong;
修改后:
type = isSigned ? QMetaType::LongLong : QMetaType::ULongLong;
327/360行原代码:
type = QVariant::ByteArray;
修改后:
type = QMetaType::QByteArray;
330行原代码:
type = QVariant::Date;
修改后:
type = QMetaType::QDate;
334行原代码:
type = QVariant::Time;
修改后:
type = QMetaType::QTime;
338行原代码:
type = QVariant::DateTime;
修改后:
type = QMetaType::QDateTime;
357行原代码:
type = QVariant::String;
修改后:
type = QMetaType::QString;
第 532/590 行原代码(QVariant 构造)
return QVariant(QVariant::ByteArray);
修改后(用 QMetaType 构造)
return QVariant(QMetaType(QMetaType::QByteArray));
第 629/655/678 行原代码
return QVariant(QVariant::Invalid);
修改后(用 QMetaType 构造)
return QVariant(QMetaType(QMetaType::UnknownType));
第 632 行原代码
return QVariant(QVariant::Int);
修改后(用 QMetaType 构造)
return QVariant(QMetaType(QMetaType::Int));
第 659 行原代码
return QVariant(QVariant::Double);
修改后(用 QMetaType 构造)
return QVariant(QMetaType(QMetaType::Double));
第 681 行原代码
return QVariant(QVariant::LongLong);
修改后(用 QMetaType 构造)
return QVariant(QMetaType(QMetaType::LongLong));
第 1392 行原代码
d->fieldCache[field] = QVariant(QVariant::Date);
修改后
d->fieldCache[field] = QVariant(QMetaType(QMetaType::QDate));
第1408行原代码
d->fieldCache[field] = QVariant(QVariant::Time);
修改后
d->fieldCache[field] = QVariant(QMetaType(QMetaType::QTime));
第1423行原代码
d->fieldCache[field] = QVariant(QVariant::DateTime);
修改后
d->fieldCache[field] = QVariant(QMetaType(QMetaType::QDateTime));
QSqlField::type()已废弃,需用 metaType().id()获取类型 ID。
switch 判断
第1364行原代码
switch (info.type())
修改后(metaType().id() 对应 QMetaType::Type 的枚举值)
switch (info.metaType().id())
第1610行原代码
switch (val.type())
修改后(metaType().id() 对应 QMetaType::Type 的枚举值)
switch (val.metaType().id())
第1612行原代码
case QVariant::Date:
修改后
case QMetaType::QDate:
第1637行原代码
case QVariant::Time:
修改后
case QMetaType::QTime:
第1666行原代码
case QVariant::DateTime:
修改后
case QMetaType::QDateTime:
第1695行原代码
case QVariant::Int:
修改后
case QMetaType::Int:
第1928行原代码
switch (values.at(i).type())
修改后(metaType().id() 对应 QMetaType::Type 的枚举值)
switch (values.at(i).metaType().id())
第1930行原代码
case QVariant::Date:
修改后
case QMetaType::QDate:
第1936行原代码
case QVariant::Time:
修改后
case QMetaType::QTime:
…
第1975行原代码
values[i] = QVariant(values[i].type());
修改后
values[i] = QVariant(values[i].metaType());
第2068行原代码
int type = values.at(i).toList().at(0).type();
修改后
int type = values.at(i).toList().at(0).metaType().id();
第2072行原代码
case QVariant::Date:
修改后
case QMetaType::QDate:
第2114行原代码
case QVariant::Time:
修改后
case QMetaType::QTime:
…
第2692行原代码
int type = values.at(i).toList().at(0).type();
修改后
int type = values.at(i).toList().at(0).metaType().id();
第2698行原代码
case QVariant::Date:
修改后
case QMetaType::QDate:
第2704行原代码
case QVariant::Time:
修改后
case QMetaType::QTime:
…
第 3376 行原代码
else if (field.type() == QVariant::DateTime)
修改后(用 QMetaType::QDateTime 对比)
else if (field.metaType().id() == QMetaType::QDateTime)
第 3399 行原代码
else if (field.type() == QVariant::ByteArray)
修改后
else if (field.metaType().id() == QMetaType::QByteArray)
QSqlField(fname, QVariant::Type) 重载已废弃,需用 QMetaType 重载。
第 816 行原代码
QSqlField f(fname, qDecodeDMType(type, p));
修改后(将 QMetaType::Type 转为 QMetaType 对象)
QSqlField f(fname, QMetaType(qDecodeDMType(type, p)));
case 分支遗漏 break。
第 757-758 行原代码
case DSQL_TIMESTAMP:
type = DSQL_TIMESTAMP_TZ;
case -5: //DM_SQL_BIGINT
修改后
case DSQL_TIMESTAMP:
type = DSQL_TIMESTAMP_TZ;
Break;
case -5: //DM_SQL_BIGINT
修改方案:
在参数名前加 _ 标记为 “故意未使用”,消除 -Wunused-parameter警告。
第 2912 行原代码(函数参数)
bool QDMDriver::open(
const QString& db,
const QString& user,
const QString& password,
const QString& host,
int port,
const QString& connOpts
)
{
修改后
bool QDMDriver::open(
const QString& db,
const QString& user,
const QString& password,
const QString& host,
int port,
const QString& connOpts
)
{
(void)db; //标记参数未使用
第 2010 行原代码(函数参数)
bool QDMResult::execBatch(bool arraybind)
{
修改后
bool QDMResult::execBatch(bool arraybind)
{
(void)arraybind; //标记参数未使用
修改方案:
直接注释或删除。
涉及位置:
824/920行
main.cpp
c++11新特性,要求明确标识重写基类的虚函数。
第56行原代码:
QSqlDriver* create(const QString &);
修改为:
QSqlDriver* create(const QString &) override; // 添加 override
文章
阅读量
获赞
