当前位置: 首页 > news >正文

达梦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

        http://www.dtcms.com/a/390140.html

        相关文章:

      1. 知识付费创作者:如何避免陷入跟风做内容的陷阱?
      2. @once_differentiable 自定义算子的用处
      3. 分子动力学--蛋白配体模拟
      4. python第二节 基础语法及使用规范详解
      5. 运维安全07 - JumpServer(堡垒机)介绍以及使用
      6. 同一个电脑内两个进程间如何通信的几种方式
      7. 《FastAPI零基础入门与进阶实战》第20篇:消息管理-封装
      8. Pyside6 + QML - 信号与槽04 - Python 主动发射信号驱动 QML UI
      9. 【系列文章】Linux系统中断的应用06-中断线程化
      10. ruoyi-vue(十五)——布局设置,导航栏,侧边栏,顶部栏
      11. 第13章 线程池配置
      12. 任天堂获得新专利:和《宝可梦传说:阿尔宙斯》相关
      13. Redis MONITOR 命令详解
      14. 七、Java-多线程、网络编程
      15. 三轴云台之动态补偿机制篇
      16. MySQL备份与恢复实战指南:从原理到落地,守护数据安全
      17. 手机上记录todolist待办清单的工具选择用哪一个?
      18. 仓颉编程语言青少年基础教程:Interface(接口)
      19. 用 go-commons 打造一个轻量级内置监控系统,让服务开箱即用
      20. PyQt6之QSpinBox计数器应用
      21. 大模型应用开发4-MCP实战
      22. Ruoyi-vue-plus-5.x第八篇文件管理与存储: 8.3 文件处理功能
      23. 【51单片机】【protues仿真】基于51单片机PM2.5温湿度测量蓝牙系统
      24. 病毒学原理
      25. 怎样快速搭建一个高效的数据存储系统:Python实战指南
      26. 音频驱动视频生成新突破:Wan2.2-S2V 模型全面体验与教程
      27. 关于pc端分页+h5端加载更多的vue3简单钩子函数
      28. MySQL 练习题
      29. 推客小程序二级分销机制设计与实现:从0到1搭建裂变增长引擎
      30. 【C++】多态(上)