爆款云主机2核4G限时秒杀,88元/年起!
查看详情

活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
热门活动
  • 618智算钜惠季 爆款云主机2核4G限时秒杀,88元/年起!
  • 免费体验DeepSeek,上天翼云息壤 NEW 新老用户均可免费体验2500万Tokens,限时两周
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 算力套餐 HOT 让算力触手可及
  • 天翼云脑AOne NEW 连接、保护、办公,All-in-One!
  • 中小企业应用上云专场 产品组合下单即享折上9折起,助力企业快速上云
  • 息壤高校钜惠活动 NEW 天翼云息壤杯高校AI大赛,数款产品享受线上订购超值特惠
  • 天翼云电脑专场 HOT 移动办公新选择,爆款4核8G畅享1年3.5折起,快来抢购!
  • 天翼云奖励推广计划 加入成为云推官,推荐新用户注册下单得现金奖励
免费活动
  • 免费试用中心 HOT 多款云产品免费试用,快来开启云上之旅
  • 天翼云用户体验官 NEW 您的洞察,重塑科技边界

智算服务

打造统一的产品能力,实现算网调度、训练推理、技术架构、资源管理一体化智算服务
智算云(DeepSeek专区)
科研助手
  • 算力商城
  • 应用商城
  • 开发机
  • 并行计算
算力互联调度平台
  • 应用市场
  • 算力市场
  • 算力调度推荐
一站式智算服务平台
  • 模型广场
  • 体验中心
  • 服务接入
智算一体机
  • 智算一体机
大模型
  • DeepSeek-R1-昇腾版(671B)
  • DeepSeek-R1-英伟达版(671B)
  • DeepSeek-V3-昇腾版(671B)
  • DeepSeek-R1-Distill-Llama-70B
  • DeepSeek-R1-Distill-Qwen-32B
  • Qwen2-72B-Instruct
  • StableDiffusion-V2.1
  • TeleChat-12B

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务
进入甄选商城进入云市场创新解决方案
办公协同
  • WPS云文档
  • 安全邮箱
  • EMM手机管家
  • 智能商业平台
财务管理
  • 工资条
  • 税务风控云
企业应用
  • 翼信息化运维服务
  • 翼视频云归档解决方案
工业能源
  • 智慧工厂_生产流程管理解决方案
  • 智慧工地
建站工具
  • SSL证书
  • 新域名服务
网络工具
  • 翼云加速
灾备迁移
  • 云管家2.0
  • 翼备份
资源管理
  • 全栈混合云敏捷版(软件)
  • 全栈混合云敏捷版(一体机)
行业应用
  • 翼电子教室
  • 翼智慧显示一体化解决方案

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云服务合作伙伴
  • 天翼云集成商交付能力认证
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴
  • 天翼云甄选商城合作伙伴
天翼云技术合作伙伴
  • 天翼云OpenAPI中心
  • 天翼云EasyCoding平台
天翼云培训认证
  • 天翼云学堂
  • 天翼云市场商学院
天翼云合作计划
  • 云汇计划
天翼云东升计划
  • 适配中心
  • 东升计划
  • 适配互认证

开发者

开发者相关功能入口汇聚
技术社区
  • 专栏文章
  • 互动问答
  • 技术视频
资源与工具
  • OpenAPI中心
开放能力
  • EasyCoding敏捷开发平台
培训与认证
  • 天翼云学堂
  • 天翼云认证
魔乐社区
  • 魔乐社区

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • 文档中心
  • 新手上云
  • 自助服务
  • OpenAPI中心
定价
  • 价格计算器
  • 定价策略
基础服务
  • 售前咨询
  • 在线支持
  • 在线支持
  • 工单服务
  • 建议与反馈
  • 用户体验官
  • 服务保障
  • 客户公告
  • 会员中心
增值服务
  • 红心服务
  • 首保服务
  • 客户支持计划
  • 专家技术服务
  • 备案管家

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云
  • 智算云
  • 天翼云4.0
  • 新闻资讯
  • 天翼云APP
基础设施
  • 全球基础设施
  • 信任中心
最佳实践
  • 精选案例
  • 超级探访
  • 云杂志
  • 分析师和白皮书
  • 天翼云·创新直播间
市场活动
  • 2025智能云生态大会
  • 2024智算云生态大会
  • 2023云生态大会
  • 2022云生态大会
  • 天翼云中国行
天翼云
  • 活动
  • 智算服务
  • 产品
  • 解决方案
  • 应用商城
  • 合作伙伴
  • 开发者
  • 支持与服务
  • 了解天翼云
      • 文档
      • 控制中心
      • 备案
      • 管理中心

      用 VS Code 搞 Qt6:信号、槽,以及QObject

      首页 知识中心 软件开发 文章详情页

      用 VS Code 搞 Qt6:信号、槽,以及QObject

      2024-06-26 06:16:28 阅读次数:44

      VSCode,对象

      Qt 里面的信号(Signal)和槽(Slot)虽然看着像事件,但它实际上是用来在两个对象之间进行通信的。既然是通信,就会有发送者和接收者。

      1、信号是发送者,触发时通过特有的关键字“emit”来发出信号。

      2、槽是信号的接收者,它实则是一个方法(函数 )成员,当收到信号后会被调用。

      为了让C++类能够使用信号和槽机制,必须从 QObject 类派生。QObject 类是 Qt 对象的公共基类。它的第一个作用是让 Qt 对象之形成一株“对象树”。当某个 Qt 对象发生析构时,它的子级对象都会发生析构。比如,窗口中包含两个按钮,当窗口类析构时,里面的两个按钮也会跟着发生析构。所以,在 Qt 的窗口应用程序里面,一般不用手动去 delete 指针类型的对象。位于对象树上的各个对象会自动清理。

      QObject 类的另一个关键作用是实现信号和槽的功能。

      1、从 QObject 类派生的类,在类内部要使用 Q_OBJECT 宏。

      2、跟在 signals 关键字后面的函数被视为信号。这个关键字实际上是 Q_SIGNALS 宏,是 Qt 项目专用的,并不是 C++ 的标准关键字。

      3、跟在 slots 或 public slots 后面的成员函数(方法)被认为是槽,当接收到信号时会自动调用。

      信号和槽之间相互不认识,需要找个“媒婆”让它们走到一起。因此,在发出信号前要调用 QObject :: connect 方法在信号与槽之间建立连接。

      老周不喜欢说得太复杂,上面的介绍应该算比较简洁了,接下来咱们来个示例,就好理解了。

      这里老周定义了两个类:DemoObject 类里面包含了一个 QStack<int> 对象,是个栈集合,这个应该都懂,后进先出。两个公共方法,AddOne 用来向 Stack 对象压入元素,TakeOne 方法从 Stack 对象中弹出一个元素。不过,弹出的元素不是经 TakeOne 方法返回,而是发出 GetItem 信号,用这个信号将弹出的元素发送给接收者(槽在 TestRecver 类中)。第二个类是 TestRecver,对,上面 DemoObject 类发出的 GetItem 信号可以在 TestRecver 类中接收,槽函数是 setItem。

      #include <iostream>
      #include <qobject.h>
      #include <qstack.h>
      
      class DemoObject : public QObject
      {
          // 这个是宏
          Q_OBJECT
      
      private:
          QStack<int> _inner;
      
      public:
          void AddOne(int val)
          {
              _inner.push(val);
          }
          void TakeOne()
          {
              if(_inner.empty()){
                  return;
              }
              int x = _inner.pop();
              // 发出信号
              emit GetItem(x);
          }
          // 信号
      signals:
          void GetItem(int n);
      };
      
      class TestRecver : public QObject
      {
          // 记得用这个宏
          Q_OBJECT
      
          // 槽
      public slots:
          void setItem(int n)
          {
              std::cout << "取出项:" << n << std::endl;
          }
      };

      在 main 函数中,先创建 DemoObject 实例,用 AddOne 方法压入三个元素。然后创建 TestRecver 实例,用 connect 方法建立信号和槽的连接。

      int main(int argc, char **argv)
      {
          DemoObject a;
          a.AddOne(50);
          a.AddOne(74);
          a.AddOne(80);
      
          TestRecver r;
          // 信号与槽连接
          QObject::connect(&a, &DemoObject::GetItem, &r, &TestRecver::setItem);
      
          // 下面这三行会发送GetItem信号
          a.TakeOne();
          a.TakeOne();
          a.TakeOne();
      
          return 0;
      }

      下面是 CMakeLists.txt 文件:

      cmake_minimum_required(VERSION 3.0.0)
      project(myapp LANGUAGES CXX)
      find_package(Qt6 REQUIRED COMPONENTS Core)
      set(CMAKE_CXX_STANDARD 17)
      set(CMAKE_CXX_STANDARD_REQUIRED ON)
      set(CMAKE_AUTOMOC ON)
      
      add_executable(myapp main.cpp)
      
      target_link_libraries(myapp PRIVATE Qt6::Core)

      注意,这里一定要把 CMAKE_AUTOMOC 选项设置为 ON,1,或者 YES。因为我们用到了 Q_OBJECT 宏,它需要 MOC 生成一些特定C++代码和元数据。这个示例只用到 QtCore 模块的类,所以 find_package 和 target_link_libraries 中只要引入这个就行。

      当你兴奋异常地编译和运行本程序时,会发生错误:

      用 VS Code 搞 Qt6:信号、槽,以及QObject

       这个错误是因为 MOC 生成的代码最终要用回到我们的程序中的,但代码文件没有包含这些代码。所以你看上面已经提示你了,解决方法是包含 main.moc。这个文件名和你定义 DemoObject 类的代码文件名相同。我刚刚的代码文件是 main.cpp,所以它生成的代码文件就是 main.moc。

      不过,#include 指令一定要写在 DemoObject 和 TestRecver 类的定义之后,这样才能正确放入生成的代码。# include 放在文件头部仍然会报错的,此时,DemoObject 和 TestRecver 类还没有定义,无法将 main.moc 中的源代码插入到 main.cpp 中(会找不到类)。

      #include <iostream>
      #include <qobject.h>
      #include <qstack.h>
      
      class DemoObject : public QObject
      {
          // 这个是宏
          Q_OBJECT
      
          ……
      };
      
      class TestRecver : public QObject
      {
          // 记得用这个宏
          Q_OBJECT
      
          ……
      };
      
      #include "main.moc"
      
      int main(int argc, char **argv)
      {
          ……
      
          return 0;
      }

      要是你觉得这样麻烦,最省事的做法是把类的定义写在头文件中,实现代码写在cpp文件中。MOC 默认会处理头文件,所以不会报错。

      之后再编译运行,就不会报错了。

      用 VS Code 搞 Qt6:信号、槽,以及QObject

       如果用的是 Windows 系统,cmd 默认编码是 GBK,不是 UTF-8,VS Code 的代码默认是 UTF8 的,控制台可能会打印出来乱码。这里老周不建议改代码文件的编码,因为说不定你还要把这代码放到 Linux 系统中编译的。在 cmd 中用 CHCP 命令改一下控制台的编码,再运行程序就行了。

      chcp 65001

      其实,信号和槽的函数签名可以不一致。下面我们再来做一例。这个例子咱们用到 QWidget 类的 windowTitleChanged 信号。当窗口标题栏中的文本发生改变时会发出这个信号。它的签名如下:

        void windowTitleChanged(const QString &title);

      这个信号有一个 title 参数,表示修改的窗口标题文本(指新的标题)。而咱们这个例子中用于和它连接的槽函数是无参数的。

      private slots:  // 这个是槽
          void onTitleChanged();

      尽管签名不一致,但可以用。

      在这个例子中,只要鼠标点一下窗口区域,就会修改窗口标题——显示鼠标指针在窗口中的坐标。窗口标题被修改,就会发出 windowTitleChanged 信号,然后,onTitleChanged 也会被调用。

      接下来是实现步骤:

      1、准备 CMakeLists.txt 文件。

      cmake_minimum_required(VERSION 3.0.0)
      project(demo VERSION 0.1.0)
      find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets)
      set(CMAKE_CXX_STANDARD 17)
      set(CMAKE_CXX_STANDARD_REQUIRED ON)
      set(CMAKE_AUTOMOC ON)
      
      file(GLOB SRC_LIST ./*.h ./*.cpp)
      add_executable(demo WIN32 ${SRC_LIST})
      target_link_libraries(demo PRIVATE Qt6::Core Qt6::Gui Qt6::Widgets)

      这里老周就偷懒一下。add_executable(demo ....) 是添加头文件和源码文件的。老周嫌麻烦,加一个文件又要改一次,于是就用 file 命令搜索项目根目录下的所有头文件和 C++ 代码文件。然后把这些搜到的文件添加到变量 SRC_LIST 中。在 add_executable 命令中引用 SRC_LIST 变量,就可以自动添加文件了。

      2、定义一个自定义窗口类,从 QWidget 类派生。

      /*    头文件     */
      #include <QWidget>
      #include <QMessageBox>
      #include <QMouseEvent>
      #include <QString>
      #include <QApplication>
      
      class MyWindow : public QWidget
      {
          Q_OBJECT
      
      public:
          MyWindow(QWidget* parent = nullptr);
      
      private slots:  // 这个是槽
          void onTitleChanged();
      
      protected:
          void mousePressEvent(QMouseEvent *event) override;
      };
      /*     实现代码      */
      #include "MyWindow.h"
      
      /****************************************************************/
      MyWindow::MyWindow(QWidget *parent)
          : QWidget::QWidget(parent)
      {
          // 窗口大小
          resize(300, 275);
          connect(this, &MyWindow::windowTitleChanged, this, &MyWindow::onTitleChanged);
      }
      
      void MyWindow::onTitleChanged()
      {
          QMessageBox::information(this, "Test", "看,窗口标题变了。", QMessageBox::Ok);
      }
      
      void MyWindow::mousePressEvent(QMouseEvent *event)
      {
          auto pt = event->pos();
          QString s = QString("鼠标指针位置:%1, %2")
                          .arg(pt.x())
                          .arg(pt.y());
          setWindowTitle(s);
          QWidget::mousePressEvent(event);
      }
      /*****************************************************************/

      重写了 mousePressEvent 方法,当鼠标按钮按下时触发,先通过事件参数的 pos 函数得到鼠标坐标,再用 setWindowTitle 方法修改窗口标题。随即 windowTitleChanged 信号发出,在槽函数 onTitleChanged 中只是用 QMessgeBox 类弹出了一个提示框。运行结果如下图所示。

      用 VS Code 搞 Qt6:信号、槽,以及QObject

      一个信号可以连接多个槽,一个槽可以与多个信号建立连接。这外交能力是真的强,来者不拒。下面咱们做一个 SaySomething 信号连接三个槽的实验。

      #include <QObject>
      
      class SomeObj : public QObject
      {
          Q_OBJECT
      
      public:
          SomeObj(QObject *parent = nullptr);
          void SpeakOut();    // 用这个方法发信号
      
      signals:
          void SaySomething();
      };
      
      class SlotsObj : public QObject
      {
          Q_OBJECT
      
      public slots:
          // 来几个cao
          void slot1();
          void slot2();
          void slot3();
      };

      以上是头文件。SomeObj 类负责发出信号,SlotsObj 类负责接收信号,它有三个 cao:slot1、slot2、slot3。

      下面是 SomObj 类的实现代码。

      SomeObj::SomeObj(QObject *parent)
          : QObject::QObject(parent)
      {
          // 无事干
      }
      
      void SomeObj::SpeakOut()
      {
          emit SaySomething();
      }

      emit 关键字(Qt 特有)发出 SaySomething 信号。

      下面是 SlotsObj 类的实现代码。

      #include "app.h"
      #include <iostream>
      using namespace std;
      
      void SlotsObj::slot1()
      {
          cout << "第一个cao触发了" << endl;
      }
      void SlotsObj::slot2()
      {
          cout << "第二个cao触发了" << endl;
      }
      void SlotsObj::slot3()
      {
          cout << "第三个cao触发了" << endl;
      }

      来,咱们试一试,分别实例化 SomeObj 和 SlotsObj 类,然后让 SaySomething 信号依次与 slot1、slot2、slot3 建立连接。这是典型的“一号战三槽”。

      int main(int argc, char** argv)
      {
          // 分别实例化
          SomeObj sender;
          SlotsObj recver;
          // 建立连接
          QObject::connect(&sender, &SomeObj::SaySomething, &recver, &SlotsObj::slot1);
          QObject::connect(&sender, &SomeObj::SaySomething, &recver, &SlotsObj::slot2);
          QObject::connect(&sender, &SomeObj::SaySomething, &recver, &SlotsObj::slot3);
      
          // 发信号
          sender.SpeakOut();
          return 0;
      }

      结果表明:信号一旦发出,三个 slot 都调用了。如下图:

      用 VS Code 搞 Qt6:信号、槽,以及QObject

      好了,今天的故事就讲到这儿了,欲知后事如何,且待下回分解。

      版权声明:本文内容来自第三方投稿或授权转载,原文地址:https://www.cnblogs.com/tcjiaan/p/16833283.html,作者:东邪独孤,版权归原作者所有。本网站转在其作品的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如因作品内容、版权等问题需要同本网站联系,请发邮件至ctyunbbs@chinatelecom.cn沟通。

      上一篇:C语言简易程序设计————13、素数问题

      下一篇:【Win 10 应用开发】UI Composition 札记(二):基本构件

      相关文章

      2025-05-19 09:04:44

      js小题2:构造函数介绍与普通函数对比

      js小题2:构造函数介绍与普通函数对比

      2025-05-19 09:04:44
      new , 关键字 , 函数 , 对象 , 构造函数
      2025-05-19 09:04:22

      外设驱动库开发笔记54:外设库驱动设计改进的思考

      外设驱动库开发笔记54:外设库驱动设计改进的思考

      2025-05-19 09:04:22
      使用 , 函数 , 初始化 , 定义 , 对象
      2025-05-19 09:04:22

      外设驱动库开发笔记46:MAX31855热偶变送器驱动

      外设驱动库开发笔记46:MAX31855热偶变送器驱动

      2025-05-19 09:04:22
      对象 , 温度
      2025-05-16 09:15:24

      jQuery遍历对象、数组、集合

      jQuery遍历对象、数组、集合

      2025-05-16 09:15:24
      jQuery , 对象 , 数组 , 遍历 , 集合
      2025-05-14 10:33:31

      计算机初级选手的成长历程——操作符详解(2)

      计算机初级选手的成长历程——操作符详解(2)

      2025-05-14 10:33:31
      对象 , 操作 , 操作符 , 表达式 , 运算 , 逗号 , 逻辑
      2025-05-14 10:33:16

      30天拿下Python之使用Json

      Json的英文全称为JavaScript Object Notation,中文为JavaScript对象表示法,是一种存储和交换文本信息的语法,类似XML。Json作为轻量级的文本数据交换格式,比XML更小、更快,更易解析,也更易于阅读和编写。

      2025-05-14 10:33:16
      json , Json , Python , 字符串 , 对象 , 序列化 , 转换
      2025-05-14 10:03:05

      C++ 11新特性之week_ptr

      在C++11 标准中,智能指针的引入极大地提升了内存管理的安全性和便利性。除了已经广为人知的shared_ptr和unique_ptr之外,还有一个重要但相对较少被单独提及的智能指针类型——std::weak_ptr。

      2025-05-14 10:03:05
      ptr , shared , 对象 , 引用 , 指向 , 计数
      2025-05-14 10:03:05

      C++ 11新特性之右值引用

      C++ 11中引入了一项关键特性——右值引用,极大地增强了C++在资源管理、性能优化和表达力方面的能力。通过理解并合理运用右值引用,我们可以编写出更高效、更简洁且不易出错的代码。

      2025-05-14 10:03:05
      右值 , 对象 , 常量 , 引用 , 构造函数 , 绑定
      2025-05-14 10:03:05

      C++ 11新特性之bind

      std::bind是C++ 11中<functional>头文件提供的一个函数模板,它允许我们将函数或成员函数与其部分参数预先绑定在一起,形成一个新的可调用对象(英文为:Callable Object)。

      2025-05-14 10:03:05
      bind , std , 函数 , 参数 , 对象 , 绑定 , 调用
      2025-05-14 10:02:58

      C++ 11新特性之function

      C++ 11标准库引入了许多创新功能,其中之一便是std::function。作为函数对象容器,std::function允许开发者在编译时不知道具体类型的情况下,存储和传递任意可调用对象,极大地提升了代码的灵活性和可复用性。

      2025-05-14 10:02:58
      function , std , 一个 , 函数 , 对象 , 调用 , 赋值
      查看更多
      推荐标签

      作者介绍

      天翼云小翼
      天翼云用户

      文章

      33561

      阅读量

      5238913

      查看更多

      最新文章

      外设驱动库开发笔记54:外设库驱动设计改进的思考

      2025-05-19 09:04:22

      外设驱动库开发笔记46:MAX31855热偶变送器驱动

      2025-05-19 09:04:22

      30天拿下Python之使用Json

      2025-05-14 10:33:16

      C++ 11新特性之右值引用

      2025-05-14 10:03:05

      C++ 11新特性之week_ptr

      2025-05-14 10:03:05

      C++ 11新特性之bind

      2025-05-14 10:03:05

      查看更多

      热门文章

      游戏编程之十一 图像页CPICPAGE介绍

      2022-11-28 01:25:04

      1.7 面向对象

      2023-06-20 09:18:01

      VSCode搭建C与C++语言运行环境

      2024-07-01 01:31:38

      synchronized 作用范围《并发编程》

      2023-06-26 08:41:21

      Java之类与对象基本使用

      2023-07-28 08:28:23

      C#类和对象

      2023-06-27 10:02:10

      查看更多

      热门标签

      java Java python 编程开发 代码 开发语言 算法 线程 Python html 数组 C++ 元素 javascript c++
      查看更多

      相关产品

      弹性云主机

      随时自助获取、弹性伸缩的云服务器资源

      天翼云电脑(公众版)

      便捷、安全、高效的云电脑服务

      对象存储

      高品质、低成本的云上存储服务

      云硬盘

      为云上计算资源提供持久性块存储

      查看更多

      随机文章

      从零开始:在VSCode中打造完美的C++开发环境

      Java面向对象(下)

      初学Java,WeakHashMap实现类(三十二)

      掌握JavaScript的数学与时间魔法:Math和Date对象详解

      重温javascript --(三)对象

      【JAVA内存回收】Java 内存回收机制

      • 7*24小时售后
      • 无忧退款
      • 免费备案
      • 专家服务
      售前咨询热线
      400-810-9889转1
      关注天翼云
      • 旗舰店
      • 天翼云APP
      • 天翼云微信公众号
      服务与支持
      • 备案中心
      • 售前咨询
      • 智能客服
      • 自助服务
      • 工单管理
      • 客户公告
      • 涉诈举报
      账户管理
      • 管理中心
      • 订单管理
      • 余额管理
      • 发票管理
      • 充值汇款
      • 续费管理
      快速入口
      • 天翼云旗舰店
      • 文档中心
      • 最新活动
      • 免费试用
      • 信任中心
      • 天翼云学堂
      云网生态
      • 甄选商城
      • 渠道合作
      • 云市场合作
      了解天翼云
      • 关于天翼云
      • 天翼云APP
      • 服务案例
      • 新闻资讯
      • 联系我们
      热门产品
      • 云电脑
      • 弹性云主机
      • 云电脑政企版
      • 天翼云手机
      • 云数据库
      • 对象存储
      • 云硬盘
      • Web应用防火墙
      • 服务器安全卫士
      • CDN加速
      热门推荐
      • 云服务备份
      • 边缘安全加速平台
      • 全站加速
      • 安全加速
      • 云服务器
      • 云主机
      • 智能边缘云
      • 应用编排服务
      • 微服务引擎
      • 共享流量包
      更多推荐
      • web应用防火墙
      • 密钥管理
      • 等保咨询
      • 安全专区
      • 应用运维管理
      • 云日志服务
      • 文档数据库服务
      • 云搜索服务
      • 数据湖探索
      • 数据仓库服务
      友情链接
      • 中国电信集团
      • 189邮箱
      • 天翼企业云盘
      • 天翼云盘
      ©2025 天翼云科技有限公司版权所有 增值电信业务经营许可证A2.B1.B2-20090001
      公司地址:北京市东城区青龙胡同甲1号、3号2幢2层205-32室
      • 用户协议
      • 隐私政策
      • 个人信息保护
      • 法律声明
      备案 京公网安备11010802043424号 京ICP备 2021034386号