ScreenLockDetector/docs/MIGRATION_GUIDE.md

6.6 KiB
Raw Blame History

ScreenLockDetector 迁移指南

从旧版本迁移到重构版本

本指南帮助您从旧的单一类结构迁移到新的面向对象架构。

好消息:无需修改代码!

如果您只使用 ScreenLockDetector 类的公共接口,无需修改任何代码。新版本完全向后兼容。

接口保持不变

// 创建实例(保持不变)
ScreenLockDetector *detector = new ScreenLockDetector(parent);

// 初始化(保持不变)
detector->initialize();

// 获取状态(保持不变)
bool locked = detector->isScreenLocked();

// 连接信号(保持不变)
connect(detector, &ScreenLockDetector::screenLocked, ...);
connect(detector, &ScreenLockDetector::screenUnlocked, ...);
connect(detector, &ScreenLockDetector::lockStateChanged, ...);

架构变化

旧架构

ScreenLockDetector
  ├── Linux 代码 (#ifdef Q_OS_LINUX)
  └── macOS 代码 (#ifdef Q_OS_MAC)

新架构

ScreenLockDetectorBase (抽象基类)
  ├── ScreenLockDetectorLinux
  └── ScreenLockDetectorMacOS

ScreenLockDetector (工厂类)

文件重命名对照表

旧文件名 新文件名 说明
screenlockdetector_mac.h screenlockdetector_macos.h 规范化命名
screenlockdetector_mac.mm screenlockdetector_macos.mm 规范化命名
N/A screenlockdetector_base.h 新增抽象基类
N/A screenlockdetector_base.cpp 新增抽象基类
N/A screenlockdetector_linux.h Linux 实现分离
N/A screenlockdetector_linux.cpp Linux 实现分离

如果您扩展了原类

如果您继承或扩展了 ScreenLockDetector 类,需要做以下调整:

场景 1: 继承 ScreenLockDetector

旧代码:

class MyDetector : public ScreenLockDetector {
    // 自定义实现
};

新代码 - 选项 A (推荐): 继承抽象基类并实现自己的平台

class MyDetector : public ScreenLockDetectorBase {
public:
    bool initialize() override {
        // 您的实现
        return true;
    }
};

新代码 - 选项 B: 继承现有的平台实现

#ifdef Q_OS_LINUX
class MyDetector : public ScreenLockDetectorLinux {
    // 扩展 Linux 实现
};
#endif

场景 2: 访问平台特定成员

旧代码:

#ifdef Q_OS_LINUX
detector->m_gnomeInterface->call(...);
#endif

新方法: 平台特定成员现在是私有的。如果需要访问,应该:

  1. 添加公共方法到对应的平台类
  2. 或者通过信号/槽机制通信
  3. 或者使用组合而非继承
// 示例:添加新方法到平台类
class ScreenLockDetectorLinux : public ScreenLockDetectorBase {
public:
    // 添加新的公共方法
    bool querySpecificState() {
        if (m_gnomeInterface) {
            return m_gnomeInterface->call("GetActive").value();
        }
        return false;
    }
};

构建系统变化

CMakeLists.txt

如果您修改了 CMakeLists.txt,请注意源文件列表的变化:

旧配置:

if(APPLE)
    list(APPEND SOURCES
        src/screenlockdetector.cpp
        src/screenlockdetector_mac.mm
    )
endif()

新配置:

# 通用源文件(所有平台)
set(SOURCES
    src/screenlockdetector.cpp
    src/screenlockdetector_base.cpp
    ...
)

# 平台特定源文件
if(APPLE)
    list(APPEND SOURCES
        src/screenlockdetector_macos.mm
    )
elseif(UNIX)
    list(APPEND SOURCES
        src/screenlockdetector_linux.cpp
    )
endif()

添加新平台支持

新架构使添加平台变得更容易:

步骤 1: 创建平台类

// screenlockdetector_windows.h
#ifndef SCREENLOCKDETECTOR_WINDOWS_H
#define SCREENLOCKDETECTOR_WINDOWS_H

#include "screenlockdetector_base.h"

#ifdef Q_OS_WIN
class ScreenLockDetectorWindows : public ScreenLockDetectorBase {
    Q_OBJECT
public:
    explicit ScreenLockDetectorWindows(QObject *parent = nullptr);
    ~ScreenLockDetectorWindows() override;
    bool initialize() override;
};
#endif

#endif

步骤 2: 实现平台类

// screenlockdetector_windows.cpp
#include "screenlockdetector_windows.h"

#ifdef Q_OS_WIN
ScreenLockDetectorWindows::ScreenLockDetectorWindows(QObject *parent)
    : ScreenLockDetectorBase(parent) {
}

bool ScreenLockDetectorWindows::initialize() {
    // Windows 特定的初始化代码
    return true;
}
#endif

步骤 3: 更新工厂方法

// screenlockdetector.cpp
ScreenLockDetectorBase* ScreenLockDetector::createPlatformDetector() {
#ifdef Q_OS_MAC
    return new ScreenLockDetectorMacOS(this);
#elif defined(Q_OS_LINUX)
    return new ScreenLockDetectorLinux(this);
#elif defined(Q_OS_WIN)
    return new ScreenLockDetectorWindows(this);  // 新增
#else
    return nullptr;
#endif
}

步骤 4: 更新 CMakeLists.txt

if(WIN32)
    list(APPEND SOURCES src/screenlockdetector_windows.cpp)
    list(APPEND HEADERS src/screenlockdetector_windows.h)
endif()

调试技巧

查看使用的平台实现

ScreenLockDetector *detector = new ScreenLockDetector(this);
if (detector->initialize()) {
    // 在调试器中检查 detector->m_detector 的实际类型
    qDebug() << "Detector initialized successfully";
}

测试不同平台

在开发时,可以临时修改工厂方法来测试特定平台:

ScreenLockDetectorBase* ScreenLockDetector::createPlatformDetector() {
    // 强制使用特定平台(仅用于测试)
    // return new ScreenLockDetectorLinux(this);
    
    // 正常的平台检测
#ifdef Q_OS_MAC
    return new ScreenLockDetectorMacOS(this);
    // ...
}

常见问题

Q: 为什么要重构?

A: 新架构提供:

  • 更清晰的代码组织
  • 更容易添加新平台
  • 更好的可测试性
  • 减少预处理器指令

Q: 性能有影响吗?

A: 没有。运行时性能完全相同,只是多了一层间接调用(虚函数),但这对于事件驱动的应用影响可以忽略不计。

Q: 旧的头文件还能用吗?

A: screenlockdetector_mac.h/mm 文件仍然存在但已弃用。建议在方便时更新引用。

Q: 如何回退到旧版本?

A: 使用 git

git checkout <old-commit-hash> src/screenlockdetector*

支持

如果遇到迁移问题,请:

  1. 查看 docs/REFACTORING.md 了解架构详情
  2. 检查示例代码在 src/main.cppsrc/mainwindow.cpp
  3. 提交 Issue 或联系开发团队

总结

对于大多数用户:无需任何修改,直接重新编译即可。

对于高级用户:新架构提供了更好的扩展性和可维护性,值得花时间理解新的设计。

祝您使用愉快!