QT桌面应用集成DeepChat:跨平台AI助手开发指南
1. 为什么要在QT应用里嵌入DeepChat对话能力
你有没有遇到过这样的场景:开发一个企业级桌面工具时,用户反复提出"要是能直接问AI问题就好了"的需求?或者在做数据分析软件时,客户希望用自然语言查询数据结果?又或者在教育类应用中,老师希望能用语音和学生互动?
这些需求背后,其实指向同一个技术方向——把智能对话能力无缝融入现有桌面应用。而QT作为最成熟的跨平台C++框架,天然适合承载这类需求。
DeepChat不是简单的聊天窗口,它是一个功能完整的AI对话引擎。它支持多模型切换、语音输入输出、文件上传解析、Markdown渲染,更重要的是,它提供了标准的深度链接(DeepLink)协议,让外部应用可以轻松唤起并控制它的行为。这意味着你不需要重写整个AI对话逻辑,只需要在QT应用中调用几个接口,就能获得专业级的AI交互体验。
我最近在一个工业设备监控系统中实践了这个方案。原本需要用户记住复杂的命令语法来查询设备状态,集成DeepChat后,操作员直接说"显示3号机组最近24小时的温度曲线",系统就能自动解析意图、调用后台API、生成图表并用自然语言解释结果。整个过程用户完全感觉不到技术细节的存在。
这正是现代桌面应用的发展趋势:AI能力不再是一个独立的工具,而是像文件操作、网络请求一样,成为应用的基础能力之一。
2. DeepChat深度链接协议详解与QT调用实现
DeepChat提供的深度链接协议是整个集成方案的核心。它采用标准的URL Scheme格式,通过deepchat://前缀触发应用行为,这种设计既安全又灵活,完全符合桌面应用的交互规范。
2.1 深度链接的基本结构
DeepChat支持两种主要的深度链接类型:
deepchat://start?...—— 启动新的对话会话deepchat://mcp/install?...—— 安装MCP服务配置
其中start链接的参数结构最为实用:
// QT中构造深度链接的示例 QString buildStartLink(const QString& model, const QString& message, const QString& systemPrompt) { QUrl url("deepchat://start"); QUrlQuery query; if (!model.isEmpty()) { query.addQueryItem("model", model); } if (!message.isEmpty()) { // URL编码中文字符 query.addQueryItem("msg", QUrl::toPercentEncoding(message)); } if (!systemPrompt.isEmpty()) { query.addQueryItem("system", QUrl::toPercentEncoding(systemPrompt)); } url.setQuery(query); return url.toString(); }这个函数可以生成类似这样的链接:deepchat://start?model=deepseek-chat&msg=%E4%BD%A0%E6%98%AF%E4%B8%80%E4%B8%AA%E9%A2%84%E6%8A%A5%E5%91%98
2.2 QT中的深度链接调用实现
在QT中调用外部应用的深度链接,关键在于使用QDesktopServices::openUrl()函数。但要注意几个重要细节:
#include <QDesktopServices> #include <QUrl> #include <QMessageBox> bool launchDeepChat(const QString& deepLink) { // 验证链接格式 if (!deepLink.startsWith("deepchat://")) { qWarning() << "Invalid deepchat link format:" << deepLink; return false; } QUrl url(deepLink); // 在Windows上需要特殊处理 #ifdef Q_OS_WIN // Windows可能需要添加file://前缀或使用ShellExecute if (!QDesktopServices::openUrl(url)) { // 尝试备用方法 QProcess::execute("cmd", QStringList() << "/c" << "start" << "" << deepLink); return true; } #else return QDesktopServices::openUrl(url); #endif } // 使用示例 void MainWindow::onAskButtonClicked() { QString link = buildStartLink( "deepseek-chat", "分析这份销售数据报告", "你是一位资深的数据分析师,请用简洁明了的语言解释关键指标" ); if (!launchDeepChat(link)) { QMessageBox::warning(this, "启动失败", "未能启动DeepChat,请确认已安装最新版本"); } }2.3 错误处理与用户体验优化
实际开发中,深度链接调用可能失败,我们需要为用户提供友好的反馈:
// 检查DeepChat是否已安装 bool isDeepChatAvailable() { // 尝试发送一个简单的测试链接 QString testLink = "deepchat://start?msg=test"; #ifdef Q_OS_WIN // Windows注册表检查(可选) QSettings reg("HKEY_CLASSES_ROOT\\deepchat", QSettings::NativeFormat); return reg.contains("Default"); #elif defined(Q_OS_MAC) // macOS检查应用是否存在 QProcess process; process.start("sh", QStringList() << "-c" << "mdfind 'kMDItemCFBundleIdentifier == \"com.deepchat.app\"' | head -1"); process.waitForFinished(); return !process.readAllStandardOutput().trimmed().isEmpty(); #else // Linux检查desktop文件 QFile desktopFile("/usr/share/applications/deepchat.desktop"); return desktopFile.exists(); #endif } // 带状态反馈的启动函数 void MainWindow::launchDeepChatWithFeedback() { if (!isDeepChatAvailable()) { showDeepChatInstallDialog(); return; } QString link = buildStartLink(ui->modelComboBox->currentText(), ui->promptTextEdit->toPlainText(), ui->systemPromptEdit->text()); bool success = launchDeepChat(link); if (success) { // 显示成功状态 statusLabel->setText("已启动DeepChat对话窗口"); statusLabel->setStyleSheet("color: green;"); } else { statusLabel->setText("启动失败,请检查DeepChat安装状态"); statusLabel->setStyleSheet("color: red;"); } }3. C++接口封装:构建线程安全的DeepChat通信层
直接在UI线程中调用深度链接虽然简单,但在复杂应用中往往不够。我们需要一个更高级的抽象层,既能处理异步通信,又能保证线程安全。
3.1 设计线程安全的DeepChat管理器
// deepchatmanager.h #ifndef DEEPCHATMANAGER_H #define DEEPCHATMANAGER_H #include <QObject> #include <QThread> #include <QMutex> #include <QWaitCondition> #include <QQueue> #include <QTimer> #include <QUrl> class DeepChatManager : public QObject { Q_OBJECT public: explicit DeepChatManager(QObject *parent = nullptr); ~DeepChatManager(); // 线程安全的启动方法 void startChat(const QString& model, const QString& message, const QString& systemPrompt = ""); // 线程安全的MCP服务安装 void installMcpService(const QJsonObject& config); signals: void chatStarted(bool success, const QString& error = ""); void mcpInstalled(bool success, const QString& error = ""); void statusChanged(const QString& status); private slots: void processQueue(); void checkDeepChatAvailability(); private: QMutex m_mutex; QQueue<QPair<QString, QVariantMap>> m_requestQueue; QThread m_workerThread; QTimer* m_checkTimer; void initializeWorker(); void addToQueue(const QString& type, const QVariantMap& params); }; #endif // DEEPCHATMANAGER_H3.2 实现异步请求队列
// deepchatmanager.cpp #include "deepchatmanager.h" #include <QDesktopServices> #include <QUrlQuery> #include <QJsonDocument> #include <QBase64Encoder> #include <QTimer> DeepChatManager::DeepChatManager(QObject *parent) : QObject(parent), m_workerThread(this) { initializeWorker(); // 定期检查DeepChat可用性 m_checkTimer = new QTimer(this); connect(m_checkTimer, &QTimer::timeout, this, &DeepChatManager::checkDeepChatAvailability); m_checkTimer->start(30000); // 每30秒检查一次 } void DeepChatManager::initializeWorker() { moveToThread(&m_workerThread); connect(&m_workerThread, &QThread::started, this, &DeepChatManager::processQueue); m_workerThread.start(); } void DeepChatManager::startChat(const QString& model, const QString& message, const QString& systemPrompt) { QVariantMap params; params["model"] = model; params["msg"] = message; params["system"] = systemPrompt; addToQueue("start", params); } void DeepChatManager::installMcpService(const QJsonObject& config) { QByteArray jsonData = QJsonDocument(config).toJson(); QString base64Config = QString::fromLatin1(jsonData.toBase64()); QVariantMap params; params["code"] = base64Config; addToQueue("mcp_install", params); } void DeepChatManager::addToQueue(const QString& type, const QVariantMap& params) { QMutexLocker locker(&m_mutex); m_requestQueue.enqueue(qMakePair(type, params)); // 确保工作线程正在运行 if (!m_workerThread.isRunning()) { m_workerThread.start(); } } void DeepChatManager::processQueue() { while (true) { QMutexLocker locker(&m_mutex); if (m_requestQueue.isEmpty()) { break; } QPair<QString, QVariantMap> request = m_requestQueue.dequeue(); locker.unlock(); bool success = false; QString error; if (request.first == "start") { QString link = "deepchat://start"; QUrlQuery query; if (!request.second["model"].toString().isEmpty()) { query.addQueryItem("model", request.second["model"].toString()); } if (!request.second["msg"].toString().isEmpty()) { query.addQueryItem("msg", QUrl::toPercentEncoding(request.second["msg"].toString())); } if (!request.second["system"].toString().isEmpty()) { query.addQueryItem("system", QUrl::toPercentEncoding(request.second["system"].toString())); } link += "?" + query.toString(); success = QDesktopServices::openUrl(QUrl(link)); error = success ? "" : "无法启动DeepChat应用"; } else if (request.first == "mcp_install") { QString link = "deepchat://mcp/install?code=" + request.second["code"].toString(); success = QDesktopServices::openUrl(QUrl(link)); error = success ? "" : "无法安装MCP服务"; } // 发送信号到主线程 QMetaObject::invokeMethod(this, [this, success, error]() { if (success) { emit chatStarted(true); emit statusChanged("DeepChat对话已启动"); } else { emit chatStarted(false, error); emit statusChanged("启动失败: " + error); } }, Qt::QueuedConnection); } } void DeepChatManager::checkDeepChatAvailability() { bool available = isDeepChatAvailable(); emit statusChanged(available ? "DeepChat可用" : "DeepChat未安装"); }3.3 在QT应用中使用管理器
// mainwindow.cpp 中的使用示例 #include "deepchatmanager.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { // 创建DeepChat管理器 m_deepChatManager = new DeepChatManager(this); // 连接信号 connect(m_deepChatManager, &DeepChatManager::chatStarted, this, &MainWindow::onChatStarted); connect(m_deepChatManager, &DeepChatManager::statusChanged, this, &MainWindow::onStatusChanged); // UI连接 connect(ui->startChatButton, &QPushButton::clicked, this, &MainWindow::onStartChatClicked); } void MainWindow::onStartChatClicked() { QString model = ui->modelComboBox->currentText(); QString message = ui->promptTextEdit->toPlainText(); QString systemPrompt = ui->systemPromptEdit->text(); m_deepChatManager->startChat(model, message, systemPrompt); } void MainWindow::onChatStarted(bool success, const QString& error) { if (success) { ui->statusBar->showMessage("DeepChat对话窗口已启动", 3000); } else { QMessageBox::critical(this, "启动失败", "无法启动DeepChat: " + error); } } void MainWindow::onStatusChanged(const QString& status) { ui->statusLabel->setText(status); }4. UI线程安全与异步交互最佳实践
在QT应用中集成外部AI服务,最大的挑战之一就是UI线程安全。用户界面必须保持响应,而AI交互往往是耗时操作。我们需要一套完整的异步处理方案。
4.1 使用QFuture和QtConcurrent进行后台处理
对于需要在后台执行的预处理任务,比如语音转文字或文本预处理:
#include <QtConcurrent/QtConcurrent> #include <QFutureWatcher> class AudioProcessor : public QObject { Q_OBJECT public: explicit AudioProcessor(QObject *parent = nullptr) : QObject(parent) {} // 异步语音识别 QFuture<QString> recognizeSpeech(const QString& audioFilePath) { return QtConcurrent::run([audioFilePath]() -> QString { // 模拟语音识别处理 // 实际项目中这里会调用Whisper或其他ASR库 QThread::msleep(2000); // 模拟处理时间 // 返回识别结果 return "今天天气不错,适合外出散步"; }); } signals: void speechRecognized(const QString& text); void recognitionError(const QString& error); }; // 在MainWindow中使用 void MainWindow::onRecordButtonClicked() { // 开始录音... ui->recordButton->setEnabled(false); ui->statusLabel->setText("正在录音..."); // 录音完成后,异步处理 QFuture<QString> future = m_audioProcessor->recognizeSpeech(m_currentAudioFile); QFutureWatcher<QString>* watcher = new QFutureWatcher<QString>(this); connect(watcher, &QFutureWatcher<QString>::finished, this, [this, watcher]() { QString result = watcher->result(); ui->inputTextEdit->setText(result); ui->recordButton->setEnabled(true); ui->statusLabel->setText("语音识别完成"); watcher->deleteLater(); }); connect(watcher, &QFutureWatcher<QString>::canceled, this, [this, watcher]() { ui->recordButton->setEnabled(true); ui->statusLabel->setText("识别已取消"); watcher->deleteLater(); }); watcher->setFuture(future); }4.2 构建响应式UI组件
为了提供更好的用户体验,我们需要创建专门的UI组件来处理AI交互状态:
// airesponsewidget.h #ifndef AIRESPONSEWIDGET_H #define AIRESPONSEWIDGET_H #include <QWidget> #include <QVBoxLayout> #include <QLabel> #include <QProgressBar> #include <QPushButton> #include <QTextEdit> class AIResponseWidget : public QWidget { Q_OBJECT public: explicit AIResponseWidget(QWidget *parent = nullptr); void setProcessing(bool processing); void setResponse(const QString& response); void setError(const QString& error); void clear(); signals: void retryRequested(); private slots: void onRetryButtonClicked(); private: QLabel* m_statusLabel; QProgressBar* m_progressBar; QTextEdit* m_responseTextEdit; QPushButton* m_retryButton; QVBoxLayout* m_layout; }; #endif // AIRESPONSEWIDGET_H// airesponsewidget.cpp #include "airesponsewidget.h" #include <QHBoxLayout> #include <QSpacerItem> #include <QStyle> AIResponseWidget::AIResponseWidget(QWidget *parent) : QWidget(parent), m_layout(new QVBoxLayout(this)) { // 状态标签 m_statusLabel = new QLabel("等待输入...", this); m_statusLabel->setWordWrap(true); // 进度条 m_progressBar = new QProgressBar(this); m_progressBar->setRange(0, 0); // 不确定进度的样式 m_progressBar->setVisible(false); // 响应文本框 m_responseTextEdit = new QTextEdit(this); m_responseTextEdit->setReadOnly(true); m_responseTextEdit->setVisible(false); // 重试按钮 m_retryButton = new QPushButton("重新尝试", this); m_retryButton->setVisible(false); connect(m_retryButton, &QPushButton::clicked, this, &AIResponseWidget::retryRequested); // 布局 m_layout->addWidget(m_statusLabel); m_layout->addWidget(m_progressBar); m_layout->addWidget(m_responseTextEdit); QHBoxLayout* buttonLayout = new QHBoxLayout(); buttonLayout->addStretch(); buttonLayout->addWidget(m_retryButton); buttonLayout->addStretch(); m_layout->addLayout(buttonLayout); m_layout->setContentsMargins(0, 0, 0, 0); m_layout->setSpacing(8); } void AIResponseWidget::setProcessing(bool processing) { if (processing) { m_statusLabel->setText("AI正在思考中..."); m_statusLabel->setVisible(true); m_progressBar->setVisible(true); m_responseTextEdit->setVisible(false); m_retryButton->setVisible(false); } else { m_progressBar->setVisible(false); } } void AIResponseWidget::setResponse(const QString& response) { m_statusLabel->setVisible(false); m_responseTextEdit->setVisible(true); m_responseTextEdit->setPlainText(response); m_retryButton->setVisible(false); } void AIResponseWidget::setError(const QString& error) { m_statusLabel->setVisible(false); m_responseTextEdit->setVisible(true); m_responseTextEdit->setPlainText("错误: " + error); m_retryButton->setVisible(true); } void AIResponseWidget::clear() { m_responseTextEdit->clear(); m_statusLabel->setText("等待输入..."); m_statusLabel->setVisible(true); m_responseTextEdit->setVisible(false); m_retryButton->setVisible(false); } void AIResponseWidget::onRetryButtonClicked() { emit retryRequested(); }4.3 多语言支持的实现方案
DeepChat本身支持多语言,我们可以在QT应用中提供语言切换功能:
// multilanguagehelper.h #ifndef MULTILANGUAGEHELPER_H #define MULTILANGUAGEHELPER_H #include <QObject> #include <QTranslator> #include <QLocale> class MultiLanguageHelper : public QObject { Q_OBJECT public: static MultiLanguageHelper* instance(); void setLanguage(const QString& languageCode); QString currentLanguage() const; QStringList availableLanguages() const; // 获取本地化字符串 QString translate(const QString& context, const QString& sourceText) const; private: explicit MultiLanguageHelper(QObject *parent = nullptr); static MultiLanguageHelper* s_instance; QTranslator* m_translator; QString m_currentLanguage; }; #define trMulti(context, sourceText) \ MultiLanguageHelper::instance()->translate(context, sourceText) #endif // MULTILANGUAGEHELPER_H// 在MainWindow中集成多语言支持 void MainWindow::setupLanguageMenu() { QMenu* langMenu = menuBar()->addMenu(tr("语言")); QActionGroup* langGroup = new QActionGroup(this); langGroup->setExclusive(true); // 添加语言选项 QStringList languages = {"zh_CN", "en_US", "ja_JP", "ko_KR", "fr_FR"}; QStringList languageNames = {"简体中文", "English", "日本語", "한국어", "Français"}; for (int i = 0; i < languages.size(); ++i) { QAction* action = langMenu->addAction(languageNames[i]); action->setCheckable(true); action->setData(languages[i]); langGroup->addAction(action); if (languages[i] == MultiLanguageHelper::instance()->currentLanguage()) { action->setChecked(true); } } connect(langGroup, &QActionGroup::triggered, this, &MainWindow::onLanguageChanged); } void MainWindow::onLanguageChanged(QAction* action) { QString langCode = action->data().toString(); MultiLanguageHelper::instance()->setLanguage(langCode); // 重新加载UI文本 retranslateUi(); // 更新DeepChat链接中的语言参数 updateDeepChatLanguage(langCode); } void MainWindow::updateDeepChatLanguage(const QString& langCode) { // 根据语言代码设置DeepChat的系统提示词 QString systemPrompt; if (langCode == "zh_CN") { systemPrompt = "请用简体中文回答所有问题"; } else if (langCode == "en_US") { systemPrompt = "Please answer all questions in English"; } else if (langCode == "ja_JP") { systemPrompt = "すべての質問に日本語で答えてください"; } // 保存到设置中 QSettings settings; settings.setValue("deepchat/systemPrompt", systemPrompt); }5. 语音输入输出集成实战
语音交互是提升用户体验的关键环节。在QT应用中集成语音功能,需要考虑跨平台兼容性和线程安全性。
5.1 跨平台语音识别实现
// speechrecognition.h #ifndef SPEECHRECOGNITION_H #define SPEECHRECOGNITION_H #include <QObject> #include <QThread> #include <QMutex> #include <QWaitCondition> #include <QQueue> #include <QTimer> class SpeechRecognition : public QObject { Q_OBJECT public: explicit SpeechRecognition(QObject *parent = nullptr); ~SpeechRecognition(); void startListening(); void stopListening(); void setLanguage(const QString& language); signals: void speechRecognized(const QString& text); void listeningStarted(); void listeningStopped(); void errorOccurred(const QString& error); private slots: void processAudioBuffer(); void onTimeout(); private: void initializeAudioInput(); void cleanupAudioInput(); QThread m_audioThread; QMutex m_mutex; QWaitCondition m_condition; QQueue<QByteArray> m_audioBufferQueue; QTimer* m_timeoutTimer; bool m_isListening; QString m_language; int m_sampleRate; }; #endif // SPEECHRECOGNITION_H5.2 语音合成集成
// texttospeech.h #ifndef TEXTTOSPEECH_H #define TEXTTOSPEECH_H #include <QObject> #include <QThread> #include <QMutex> #include <QWaitCondition> #include <QQueue> class TextToSpeech : public QObject { Q_OBJECT public: explicit TextToSpeech(QObject *parent = nullptr); ~TextToSpeech(); void speak(const QString& text); void stopSpeaking(); void setVoice(const QString& voiceName); void setRate(double rate); signals: void speakingStarted(); void speakingFinished(); void errorOccurred(const QString& error); private slots: void processSpeechQueue(); private: void initializeTTS(); void cleanupTTS(); QThread m_ttsThread; QMutex m_mutex; QWaitCondition m_condition; QQueue<QString> m_speechQueue; bool m_isSpeaking; QString m_currentVoice; double m_currentRate; }; #endif // TEXTTOSPEECH_H5.3 语音交互工作流整合
// mainwindow.cpp 中的语音集成 void MainWindow::setupVoiceIntegration() { // 创建语音识别和合成对象 m_speechRecognition = new SpeechRecognition(this); m_textToSpeech = new TextToSpeech(this); // 连接信号 connect(m_speechRecognition, &SpeechRecognition::speechRecognized, this, &MainWindow::onSpeechRecognized); connect(m_speechRecognition, &SpeechRecognition::errorOccurred, this, &MainWindow::onSpeechError); connect(m_textToSpeech, &TextToSpeech::speakingFinished, this, &MainWindow::onSpeechFinished); // 设置默认参数 m_speechRecognition->setLanguage("zh_CN"); m_textToSpeech->setVoice("zh-CN-YunaNeural"); m_textToSpeech->setRate(1.0); } void MainWindow::onSpeechRecognized(const QString& text) { ui->inputTextEdit->setText(text); // 自动发送到DeepChat if (ui->autoSendCheckBox->isChecked()) { sendToDeepChat(text); } } void MainWindow::onSpeechError(const QString& error) { ui->statusLabel->setText("语音识别错误: " + error); ui->recordButton->setIcon(style()->standardIcon(QStyle::SP_MediaStop)); } void MainWindow::onSpeechFinished() { ui->statusLabel->setText("语音播报完成"); } void MainWindow::sendToDeepChat(const QString& text) { QString model = ui->modelComboBox->currentText(); QString systemPrompt = getSystemPromptForCurrentContext(); m_deepChatManager->startChat(model, text, systemPrompt); // 同时播放"正在思考"的提示音 playThinkingSound(); } void MainWindow::playThinkingSound() { // 播放简短的提示音效 QSound::play(":/sounds/thinking.wav"); }6. 企业级应用开发要点与性能优化
在企业级应用中集成DeepChat,除了基本功能外,还需要考虑安全性、稳定性和可维护性等高级需求。
6.1 安全性考虑与数据保护
// securitymanager.h #ifndef SECURITYMANAGER_H #define SECURITYMANAGER_H #include <QObject> #include <QSettings> #include <QCryptographicHash> #include <QDateTime> class SecurityManager : public QObject { Q_OBJECT public: explicit SecurityManager(QObject *parent = nullptr); // 敏感数据加密存储 QString encryptData(const QString& data, const QString& key = ""); QString decryptData(const QString& encryptedData, const QString& key = ""); // 安全的DeepChat链接生成 QString generateSecureDeepLink(const QString& model, const QString& message, const QString& systemPrompt = ""); // 日志审计 void logActivity(const QString& activity, const QString& details = ""); // 检查DeepChat版本安全性 bool isDeepChatVersionSecure() const; private: QString generateEncryptionKey(); QString hashString(const QString& input); }; #endif // SECURITYMANAGER_H6.2 性能优化策略
// performanceoptimizer.h #ifndef PERFORMANCEOPTIMIZER_H #define PERFORMANCEOPTIMIZER_H #include <QObject> #include <QTimer> #include <QElapsedTimer> #include <QMap> class PerformanceOptimizer : public QObject { Q_OBJECT public: explicit PerformanceOptimizer(QObject *parent = nullptr); void startMonitoring(); void stopMonitoring(); // 深度链接调用性能监控 void monitorDeepChatLaunch(const QString& link, const QString& context); // 内存使用监控 void checkMemoryUsage(); // 缓存管理 void cacheDeepChatResponse(const QString& key, const QString& response); QString getCachedResponse(const QString& key); signals: void performanceWarning(const QString& warning); void memoryUsageHigh(int percentage); private slots: void onTimerTimeout(); private: QTimer* m_monitorTimer; QMap<QString, QElapsedTimer> m_launchTimers; QMap<QString, QString> m_responseCache; int m_cacheSize; }; #endif // PERFORMANCEOPTIMIZER_H6.3 错误恢复与降级策略
// fallbackmanager.h #ifndef FALLBACKMANAGER_H #define FALLBACKMANAGER_H #include <QObject> #include <QTimer> #include <QList> class FallbackManager : public QObject { Q_OBJECT public: explicit FallbackManager(QObject *parent = nullptr); void registerFallback(const QString& service, const std::function<void()>& fallback); void triggerFallback(const QString& service); // 自动降级策略 void enableAutoFallback(bool enabled); void setFallbackThreshold(int milliseconds); // 网络状态监控 void monitorNetworkStatus(); signals: void fallbackActivated(const QString& service); void networkStatusChanged(bool online); private slots: void onNetworkCheck(); void onTimeout(); private: QMap<QString, std::function<void()>> m_fallbacks; QTimer* m_networkTimer; QTimer* m_timeoutTimer; bool m_autoFallbackEnabled; int m_fallbackThreshold; bool m_isOnline; }; #endif // FALLBACKMANAGER_H获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。