Skip to content

test: migrate unit tests from Qt5 to Qt6 compatibility#88

Merged
deepin-bot[bot] merged 1 commit into
linuxdeepin:masterfrom
pengfeixx:master
Jun 3, 2026
Merged

test: migrate unit tests from Qt5 to Qt6 compatibility#88
deepin-bot[bot] merged 1 commit into
linuxdeepin:masterfrom
pengfeixx:master

Conversation

@pengfeixx

Copy link
Copy Markdown
Contributor
  • Remove Qt::AA_UseHighDpiPixmaps (removed in Qt6)

  • Remove QTEST_ADD_GPU_BLACKLIST_SUPPORT_DEFS (removed in Qt6 QTest)

  • Add QT_VERSION_CHECK guards for QMouseEvent constructor changes

  • Replace obsolete PaddleOCRApp with OCREngine

  • Fix CMakeLists.txt: add missing source dirs, link Qt::Test/DBus

  • Fix mainWindow null pointer crash in MainWidget::setupUi

  • 移除Qt6中已删除的AA_UseHighDpiPixmaps和GPU黑名单宏

  • 添加QMouseEvent构造函数Qt5/Qt6版本条件编译

  • 替换已废弃的PaddleOCRApp为OCREngine

  • 修复CMakeLists.txt缺少的源目录和链接库

  • 修复MainWidget::setupUi中mainWindow空指针崩溃

Log: 单元测试迁移Qt6兼容并修复相关编译和运行问题
Influence: 单元测试可在Qt6环境下正常编译运行,修复源码中一处潜在的空指针崩溃

- Remove Qt::AA_UseHighDpiPixmaps (removed in Qt6)
- Remove QTEST_ADD_GPU_BLACKLIST_SUPPORT_DEFS (removed in Qt6 QTest)
- Add QT_VERSION_CHECK guards for QMouseEvent constructor changes
- Replace obsolete PaddleOCRApp with OCREngine
- Fix CMakeLists.txt: add missing source dirs, link Qt::Test/DBus
- Fix mainWindow null pointer crash in MainWidget::setupUi

- 移除Qt6中已删除的AA_UseHighDpiPixmaps和GPU黑名单宏
- 添加QMouseEvent构造函数Qt5/Qt6版本条件编译
- 替换已废弃的PaddleOCRApp为OCREngine
- 修复CMakeLists.txt缺少的源目录和链接库
- 修复MainWidget::setupUi中mainWindow空指针崩溃

Log: 单元测试迁移Qt6兼容并修复相关编译和运行问题
Influence: 单元测试可在Qt6环境下正常编译运行,修复源码中一处潜在的空指针崩溃
@pengfeixx

Copy link
Copy Markdown
Contributor Author

/merge

@deepin-bot deepin-bot Bot merged commit 4bb0ec7 into linuxdeepin:master Jun 3, 2026
17 checks passed
@deepin-ci-robot

Copy link
Copy Markdown

deepin pr auto review

你好!我是CodeGeeX。我已经仔细审查了你提供的Git Diff,这份代码主要涉及了CMake构建配置的更新、UI空指针防护、OCR引擎的替换(从PaddleOCRApp迁移到OCREngine)、Qt5/Qt6兼容性适配以及版权信息的更新。

以下是我从语法逻辑、代码质量、代码性能和代码安全四个维度提出的详细审查意见和改进建议:

一、 语法与逻辑

  1. CMake中同时包含 ./util./utils(疑似逻辑错误)

    • 问题:在 src/CMakeLists.txt 中,同时使用了 aux_source_directory(./util allTestSource)aux_source_directory(./utils allTestSource)。这极大概率是笔误,通常项目中不会同时存在如此相似的目录名。
    • 建议:请确认实际的目录名称,删除多余的那一行,避免引入不需要的源文件或导致编译错误。
  2. 测试代码中的死循环风险(逻辑缺陷)

    • 问题:在 tests/test_mainwindow.cpp 中,存在如下逻辑:
      bool bRet = false;
      while (!bRet) {
          if (!OCREngine::instance()->isRunning()) {
              bRet = true;
              QTest::qWait(1000);
          }
      }
      如果 OCREngine::instance()->isRunning() 一直返回 true(例如引擎卡死或初始化失败),这个 while 循环将变成死循环,导致测试程序永远挂起。
    • 建议:必须加入超时机制或最大重试次数。例如:
      int timeout = 10000; // 10秒超时
      int elapsed = 0;
      while (!bRet && elapsed < timeout) {
          if (!OCREngine::instance()->isRunning()) {
              bRet = true;
          } else {
              QTest::qWait(500);
              elapsed += 500;
          }
      }
      ASSERT_TRUE(bRet) << "OCREngine failed to stop within timeout.";
  3. Qt6 QMouseEvent 构造函数签名理解偏差

    • 问题:在 tests/test_resulttextview.cpp 中,为了适配Qt6,移除了最后一个参数 Qt::MouseEventSynthesizedByQt。在Qt6中,该参数确实被移除了,但是第3个参数(屏幕坐标)也被废弃了。Qt6的 QMouseEvent 构造函数签名变为了 QMouseEvent(Type, const QPointF &localPos, const QPointF &windowPos, const QPointF &screenPos, MouseButton button, MouseButtons buttons, KeyboardModifiers modifiers),即窗口坐标和屏幕坐标合并或改变了位置。
    • 建议:如果只是为了构造一个测试事件,建议在Qt6分支下直接使用更简单的构造函数,或者显式传入正确的坐标:
      #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
          // Qt6 简化构造函数,只传本地坐标和按钮状态即可,其他坐标会自动推算
          QMouseEvent *ev = new QMouseEvent(QEvent::MouseMove, QPoint(15,36), QPoint(60,80), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);
      #else
          QMouseEvent *ev = new QMouseEvent(QEvent::MouseMove, QPoint(15,36), QPoint(25,40), QPoint(60,80), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier, Qt::MouseEventSynthesizedByQt);
      #endif

二、 代码质量

  1. 空指针判断不够彻底

    • 问题:在 src/mainwidget.cpp 中增加了 if (mainWindow) 的判断,这是好的防御性编程。但是,如果 mainWindow 真的为 nullptr,代码只是默默跳过,后续如果依赖 titlebar() 添加的控件进行交互,可能会导致其他隐蔽的Bug。
    • 建议:在 if 判断后,如果 mainWindow 为空,建议输出警告日志,方便调试:
      if (mainWindow) {
          mainWindow->titlebar()->addWidget(pWidget, Qt::AlignRight);
      } else {
          qWarning() << "mainWindow is nullptr, cannot add widget to titlebar.";
      }
  2. 宏定义破坏封装性

    • 问题:在测试代码中大量使用了 #define private public#define protected public。这在Qt测试中虽然常见,但会破坏类的封装,且在不同编译器下可能导致内存布局访问错误。
    • 建议:这是现有代码,短期内难以改变,但建议未来新增测试尽量通过友元类或公共接口来测试,而不是粗暴地打破封装。
  3. Qt Test 宏的清理

    • 问题:在 tests/test_qtestmain.cpp 中,删除了 QTEST_ADD_GPU_BLACKLIST_SUPPORT_DEFSQTEST_DISABLE_KEYPAD_NAVIGATION 等宏。这说明项目可能正在从 Qt5 迁移到 Qt6,或者清理了不再需要的兼容代码。
    • 建议:清理得很干净。但需确保删除 AA_UseHighDpiPixmaps 后,在高分屏下的图标显示是否依然正常(Qt6中该属性默认开启,如果是Qt5则可能需要保留或改用别的DPI缩放策略)。

三、 代码性能

  1. aux_source_directory 的性能与维护性

    • 问题:CMakeLists 中大量使用 aux_source_directory。该命令在 CMake 配置阶段执行,不会在新增源文件时自动触发重新配置(必须手动清空 build 目录或触摸 CMakeLists.txt),容易导致编译遗漏。此外,它会收集目录下所有 .cpp 文件,如果有些文件只是临时不用,也会被强制编译。
    • 建议:对于小型项目可以接受,但对于中大型项目,建议明确指定源文件列表(如 set(SOURCES src1.cpp src2.cpp) 或使用 GLOB 但配合必要的配置检查),以提高构建的确定性和可维护性。
  2. 测试用例中的 QTest::qWait(1000)

    • 问题:在 bRet = true 之后,仍然调用了 QTest::qWait(1000),这会无端增加1秒的测试时间。
    • 建议:如果是为了等待UI刷新,可以保留较短时间(如 qWait(100)),否则可以直接删除这行等待代码。

四、 代码安全

  1. 版权年份的未来时间问题

    • 问题:将版权信息从 2022 修改为 2022 - 2026。包含未来的结束年份在法律和规范上是有争议的,因为版权声明通常应反映实际发表的年份。
    • 建议:一般开源项目(如SPDX标准)倾向于写当前年份或起始年份,不建议写未来的年份。建议改为 2022 - present 或仅保留 2022,具体需咨询法务或遵循组织内部规范。
  2. CMake 变量未检查导致潜在链接失败

    • 问题:新增了 ${ocr_lib_INCLUDE_DIRS}${InferenceEngine_INCLUDE_DIRS} 等依赖。如果这些变量在上级 CMakeLists 中未被正确初始化(例如 find_package 失败),会导致 target_include_directories 传入空路径或错误路径。
    • 建议:在 CMake 中加入必要的断言检查:
      if(NOT InferenceEngine_INCLUDE_DIRS OR NOT InferenceEngine_LIBRARIES)
          message(FATAL_ERROR "InferenceEngine not found! Please check your environment.")
      endif()

总结

本次 Diff 的核心目标(重构引擎、适配Qt6、增加空指针防护)是清晰且合理的。最严重的问题是测试代码中的死循环风险和 util/utils 目录的疑似笔误,建议优先修复这两项。其次,Qt6的 QMouseEvent 构造函数建议按照官方最新的签名进行调整,以保证测试代码在Qt6下的行为完全正确。

@deepin-ci-robot

Copy link
Copy Markdown

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by: lzwind, pengfeixx

The full list of commands accepted by this bot can be found here.

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants