You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Software_Architecture/.promptx/resource/domain/qt-code-optimizer/knowledge/project-architecture.knowle...

12 KiB

项目架构知识体系

Qt项目标准架构

目录结构最佳实践

BattlefieldExplorationSystem/
├── src/                    # 源代码目录
│   ├── core/              # 核心业务逻辑
│   │   ├── database/      # 数据库相关
│   │   ├── network/       # 网络通信
│   │   └── algorithms/    # 核心算法
│   ├── ui/                # 用户界面
│   │   ├── main/          # 主窗口
│   │   ├── dialogs/       # 对话框
│   │   └── components/    # UI组件
│   ├── utils/             # 工具类
│   └── main.cpp           # 程序入口
├── include/               # 头文件目录
│   ├── core/              # 核心头文件
│   ├── ui/                # UI头文件
│   └── utils/             # 工具头文件
├── resources/             # 资源文件
│   ├── images/            # 图片资源
│   ├── qml/               # QML文件
│   ├── styles/            # 样式文件
│   └── translations/      # 翻译文件
├── tests/                 # 测试代码
│   ├── unit/              # 单元测试
│   ├── integration/       # 集成测试
│   └── ui/                # UI测试
├── docs/                  # 文档目录
│   ├── api/               # API文档
│   ├── design/            # 设计文档
│   └── user/              # 用户文档
├── build/                 # 构建输出
├── CMakeLists.txt         # CMake配置
└── README.md              # 项目说明

模块化架构设计

// 核心模块接口定义
namespace Core {
    class IDatabase {
    public:
        virtual ~IDatabase() = default;
        virtual bool connect(const QString& connectionString) = 0;
        virtual bool execute(const QString& query) = 0;
        virtual QVariant getValue(const QString& key) = 0;
    };
    
    class INetworkManager {
    public:
        virtual ~INetworkManager() = default;
        virtual void sendRequest(const QNetworkRequest& request) = 0;
        virtual void setProxy(const QNetworkProxy& proxy) = 0;
    };
}

// UI模块接口定义
namespace UI {
    class IMainWindow {
    public:
        virtual ~IMainWindow() = default;
        virtual void showMessage(const QString& message) = 0;
        virtual void updateStatus(const QString& status) = 0;
    };
    
    class IDevicePanel {
    public:
        virtual ~IDevicePanel() = default;
        virtual void addDevice(const DeviceInfo& info) = 0;
        virtual void removeDevice(const QString& deviceId) = 0;
        virtual void updateDevice(const DeviceInfo& info) = 0;
    };
}

分层架构模式

三层架构实现

// 表示层 (Presentation Layer)
class MainWindow : public QMainWindow, public UI::IMainWindow {
    Q_OBJECT
public:
    explicit MainWindow(std::shared_ptr<BusinessLogic> logic, 
                       QWidget *parent = nullptr);
    
    void showMessage(const QString& message) override;
    void updateStatus(const QString& status) override;
    
private slots:
    void onDeviceAdded(const DeviceInfo& info);
    void onDeviceRemoved(const QString& deviceId);
    
private:
    std::shared_ptr<BusinessLogic> m_businessLogic;
    Ui::MainWindow *ui;
};

// 业务逻辑层 (Business Logic Layer)
class BusinessLogic : public QObject {
    Q_OBJECT
public:
    explicit BusinessLogic(std::shared_ptr<Core::IDatabase> database,
                          std::shared_ptr<Core::INetworkManager> network);
    
    void addDevice(const DeviceInfo& info);
    void removeDevice(const QString& deviceId);
    QList<DeviceInfo> getAllDevices() const;
    
signals:
    void deviceAdded(const DeviceInfo& info);
    void deviceRemoved(const QString& deviceId);
    void errorOccurred(const QString& error);
    
private:
    std::shared_ptr<Core::IDatabase> m_database;
    std::shared_ptr<Core::INetworkManager> m_network;
    QList<DeviceInfo> m_devices;
};

// 数据访问层 (Data Access Layer)
class DatabaseManager : public QObject, public Core::IDatabase {
    Q_OBJECT
public:
    explicit DatabaseManager(QObject *parent = nullptr);
    
    bool connect(const QString& connectionString) override;
    bool execute(const QString& query) override;
    QVariant getValue(const QString& key) override;
    
    // 特定业务方法
    bool saveDevice(const DeviceInfo& info);
    DeviceInfo loadDevice(const QString& deviceId);
    QList<DeviceInfo> loadAllDevices();
    
private:
    QSqlDatabase m_database;
    QString m_connectionString;
};

MVC模式在Qt中的应用

// Model - 数据模型
class DeviceModel : public QAbstractTableModel {
    Q_OBJECT
public:
    explicit DeviceModel(QObject *parent = nullptr);
    
    // QAbstractTableModel接口实现
    int rowCount(const QModelIndex &parent = QModelIndex()) const override;
    int columnCount(const QModelIndex &parent = QModelIndex()) const override;
    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
    QVariant headerData(int section, Qt::Orientation orientation, 
                       int role = Qt::DisplayRole) const override;
    
    // 业务方法
    void addDevice(const DeviceInfo& info);
    void removeDevice(int row);
    void updateDevice(int row, const DeviceInfo& info);
    
private:
    QList<DeviceInfo> m_devices;
};

// View - 视图
class DeviceView : public QTableView {
    Q_OBJECT
public:
    explicit DeviceView(QWidget *parent = nullptr);
    
    void setDeviceModel(DeviceModel *model);
    
signals:
    void deviceSelected(const DeviceInfo& info);
    void deviceDoubleClicked(const DeviceInfo& info);
    
private slots:
    void onSelectionChanged(const QItemSelection &selected, 
                           const QItemSelection &deselected);
    void onDoubleClicked(const QModelIndex &index);
};

// Controller - 控制器
class DeviceController : public QObject {
    Q_OBJECT
public:
    explicit DeviceController(DeviceModel *model, DeviceView *view, 
                             QObject *parent = nullptr);
    
public slots:
    void addDevice();
    void removeDevice();
    void editDevice();
    void refreshDevices();
    
private slots:
    void onDeviceSelected(const DeviceInfo& info);
    void onDeviceDoubleClicked(const DeviceInfo& info);
    
private:
    DeviceModel *m_model;
    DeviceView *m_view;
    DeviceInfo m_selectedDevice;
};

依赖注入和控制反转

依赖注入容器

// 简单的依赖注入容器
class DIContainer {
public:
    template<typename Interface, typename Implementation>
    void registerSingleton() {
        m_singletons[typeid(Interface).name()] = 
            []() -> std::shared_ptr<void> {
                return std::make_shared<Implementation>();
            };
    }
    
    template<typename Interface>
    std::shared_ptr<Interface> resolve() {
        auto it = m_singletons.find(typeid(Interface).name());
        if (it != m_singletons.end()) {
            return std::static_pointer_cast<Interface>(it->second());
        }
        return nullptr;
    }
    
private:
    std::map<std::string, std::function<std::shared_ptr<void>()>> m_singletons;
};

// 使用示例
void setupDependencies(DIContainer& container) {
    container.registerSingleton<Core::IDatabase, DatabaseManager>();
    container.registerSingleton<Core::INetworkManager, NetworkManager>();
    container.registerSingleton<BusinessLogic, BusinessLogic>();
}

工厂模式实现

// 抽象工厂
class UIComponentFactory {
public:
    virtual ~UIComponentFactory() = default;
    virtual std::unique_ptr<QWidget> createButton(const QString& text) = 0;
    virtual std::unique_ptr<QWidget> createLabel(const QString& text) = 0;
    virtual std::unique_ptr<QDialog> createDialog(const QString& title) = 0;
};

// 具体工厂实现
class ModernUIFactory : public UIComponentFactory {
public:
    std::unique_ptr<QWidget> createButton(const QString& text) override {
        auto button = std::make_unique<QPushButton>(text);
        button->setStyleSheet(
            "QPushButton {"
            "    background-color: #007ACC;"
            "    color: white;"
            "    border: none;"
            "    padding: 8px 16px;"
            "    border-radius: 4px;"
            "}"
            "QPushButton:hover {"
            "    background-color: #005A9E;"
            "}"
        );
        return button;
    }
    
    std::unique_ptr<QWidget> createLabel(const QString& text) override {
        auto label = std::make_unique<QLabel>(text);
        label->setStyleSheet(
            "QLabel {"
            "    color: #333333;"
            "    font-size: 14px;"
            "}"
        );
        return label;
    }
    
    std::unique_ptr<QDialog> createDialog(const QString& title) override {
        auto dialog = std::make_unique<QDialog>();
        dialog->setWindowTitle(title);
        dialog->setStyleSheet(
            "QDialog {"
            "    background-color: #F5F5F5;"
            "}"
        );
        return dialog;
    }
};

配置管理和插件架构

配置管理系统

class ConfigurationManager : public QObject {
    Q_OBJECT
public:
    static ConfigurationManager& instance();
    
    void loadConfiguration(const QString& configFile);
    void saveConfiguration(const QString& configFile);
    
    template<typename T>
    T getValue(const QString& key, const T& defaultValue = T{}) const {
        return m_settings.value(key, QVariant::fromValue(defaultValue)).value<T>();
    }
    
    template<typename T>
    void setValue(const QString& key, const T& value) {
        m_settings.setValue(key, QVariant::fromValue(value));
        emit configurationChanged(key);
    }
    
signals:
    void configurationChanged(const QString& key);
    
private:
    ConfigurationManager() = default;
    QSettings m_settings;
};

插件架构设计

// 插件接口
class IPlugin {
public:
    virtual ~IPlugin() = default;
    virtual QString name() const = 0;
    virtual QString version() const = 0;
    virtual bool initialize() = 0;
    virtual void shutdown() = 0;
    virtual QWidget* createWidget() = 0;
};

// 插件管理器
class PluginManager : public QObject {
    Q_OBJECT
public:
    static PluginManager& instance();
    
    void loadPlugins(const QString& pluginDir);
    void unloadPlugins();
    
    QList<IPlugin*> getPlugins() const;
    IPlugin* getPlugin(const QString& name) const;
    
signals:
    void pluginLoaded(IPlugin* plugin);
    void pluginUnloaded(const QString& name);
    
private:
    QList<QPluginLoader*> m_loaders;
    QList<IPlugin*> m_plugins;
};

线程和并发架构

线程池管理

class ThreadPoolManager : public QObject {
    Q_OBJECT
public:
    static ThreadPoolManager& instance();
    
    template<typename Func>
    QFuture<void> submitTask(Func&& func) {
        return QtConcurrent::run(&m_threadPool, std::forward<Func>(func));
    }
    
    template<typename Func, typename Result = std::invoke_result_t<Func>>
    QFuture<Result> submitTaskWithResult(Func&& func) {
        return QtConcurrent::run(&m_threadPool, std::forward<Func>(func));
    }
    
    void setMaxThreadCount(int maxThreads);
    int maxThreadCount() const;
    
private:
    ThreadPoolManager() = default;
    QThreadPool m_threadPool;
};

异步操作封装

class AsyncOperation : public QObject {
    Q_OBJECT
public:
    template<typename Func>
    static QFuture<void> execute(Func&& operation) {
        auto promise = std::make_shared<QPromise<void>>();
        auto future = promise->future();
        
        QtConcurrent::run([promise, operation = std::forward<Func>(operation)]() {
            try {
                operation();
                promise->finish();
            } catch (...) {
                promise->setException(std::current_exception());
            }
        });
        
        return future;
    }
    
    template<typename Func, typename Result = std::invoke_result_t<Func>>
    static QFuture<Result> executeWithResult(Func&& operation) {
        return QtConcurrent::run(std::forward<Func>(operation));
    }
};