达梦Qt接口源码Qt6编译错误处理记录
1. 达梦原厂Qt接口源码
下载网页链接:https://eco.dameng.com/download/?_blank
下载包qt_src-2142-20250328.zip,使用了源码包中最新的5.12版。
2. 编译环境
操作系统:deepin V25
编译环境:Qt 6.9.1/2
3. 编译错误
用Qt 6.9.1进行达梦Qt接口源码编译时报错,包括枚举迁移、构造函数重载移除、类型废弃等,主要是Qt6接口发生变更,达梦Qt接口源码未同步适配引起,以下是详细修改记录。
4. 重点修改 qsql_dm.cpp 文件
注为5.12版本源码。
文件全路径为:
${QT_HOME}/6.9.1/Src/qtbase/src/plugins/sqldrivers/dm/qsql_dm.cpp
5. 核心错误
5.1 QSqlError 构造函数参数4类型不匹配(int → QString)
报错位置:
第 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(p), type, nativeCode);
修改后:
return QSqlError(QLatin1String("QDM: ") + err, qDMWarn(p), type, QString::number(nativeCode));
5.2 QString::SkipEmptyParts 不存在(枚举迁移)
报错位置:
第 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));
5.3 QVariant构造函数参数不匹配(Qt 6移除旧接口)
报错位置:
第 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);
6. 消除-Wdeprecated-declarations告警
主要涉及2个变化,需批量替换。
6.1 QVariant::Type改为QMetaType::Type
6.1.1 函数返回值类型已改变
第 302 行原代码:
static QVariant::Type qDecodeDMType(sdint2 dtype, bool isSigned = true)
修改后:
static QMetaType::Type qDecodeDMType(sdint2 dtype, bool isSigned = true)
6.1.2 变量定义类型已改变
第 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;
6.1.3 QVariant构造参数类型已改变
第 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));
6.2 QSqlField::type()改为QSqlField::metaType()
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)
6.3 QSqlField 构造函数参数2类型改为QMetaType
QSqlField(fname, QVariant::Type) 重载已废弃,需用 QMetaType 重载。
第 816 行原代码
QSqlField f(fname, qDecodeDMType(type, p));
修改后(将 QMetaType::Type 转为 QMetaType 对象)
QSqlField f(fname, QMetaType(qDecodeDMType(type, p)));
7. 处理其他警告
7.1 警告:fallthrough 语句未标注
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
7.2 警告:未使用参数(如 db、arraybind)
修改方案:
在参数名前加 _ 标记为 “故意未使用”,消除 -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; //标记参数未使用
7.3 QSqlField.setSqlType()方法已废弃
修改方案:直接注释或删除。
涉及位置:
第 824/920 行
7.3 重载标识
注:此处修改的文件是 main.cpp。
因c++11新特性,要求明确标识重写基类的虚函数。
第 56 行原代码:
QSqlDriver* create(const QString &);
修改为:
QSqlDriver* create(const QString &) override; // 添加 override