注册
达梦Qt接口源码Qt6编译错误处理记录
专栏/技术分享/ 文章详情 /

达梦Qt接口源码Qt6编译错误处理记录

徐俊 2025/10/17 267 1 0
摘要

达梦Qt接口源码Qt6编译错误处理记录

摘要:
此文为为适配Qt6编译达梦Qt接口源码时发现的错误及详细处理记录备案。

1.达梦原厂Qt接口源码

下载网页链接:https://eco.dameng.com/download/?_blank
下载包qt_src-2142-20250328.zip,使用了源码包中最新的5.12版。

2.编译环境

操作系统:deepin V25
编译环境:Qt 6.9.1

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§, type, nativeCode);
修改后:
return QSqlError(QLatin1String("QDM: ") + err, qDMWarn§, 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.4.重载标识

main.cpp
c++11新特性,要求明确标识重写基类的虚函数。
第56行原代码:
QSqlDriver* create(const QString &);
修改为:
QSqlDriver* create(const QString &) override; // 添加 override

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服