自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(40)
  • 收藏
  • 关注

原创 QT基础篇(20)QT Quick Controls2新颖界面开发

QT Quick Controls2是一套用于构建现代风格用户界面的框架,它是QT框架的一部分。它提供了一系列预定义的控件,可以用来创建交互式和响应式的界面,包括按钮、文本框、滑块、菜单等。QT Quick Controls2具有高度可定制性,开发人员可以根据自己的需求自定义控件的外观和行为。它还支持主题和样式,使开发人员可以轻松应用不同的外观和风格。使用QT Quick Controls2,开发人员可以快速构建易于使用和具有现代外观的应用程序界面。

2024-01-30 20:17:34 1628

原创 QT基础篇(19)QT Quick Controls开发基础

QT Quick Controls是QT框架中的一个模块,它提供了一套可视化的用户界面控件,用于快速构建现代化的跨平台应用程序。QT Quick Controls采用了QML语言来描述用户界面,通过调用QT Quick模块中的功能来实现丰富的交互效果。QT Quick Controls提供了一系列常用的控件,如按钮、文本输入框、滑动条等。这些控件具有可自定义的外观和样式,并能与其他控件和数据模型进行交互。

2024-01-29 19:38:26 1370

原创 QT基础篇(18)QML动画特效

第一个ObjectAnimator将视图在垂直方向上进行平移,起始位置为0,结束位置为300,持续时间为1秒,重复次数为无限,重复模式为反向。对象,并将两个属性动画添加到其中。在QML中,其他的动画元素大多继承自Propertyanimation,主要有NumberAnimation,ColorAnimation,RotationAnimation和Vector3dAnimation等。使用PropertyAnimation元素可以实现流畅的动画效果,可以应用于各种场景,如按钮点击动画、页面切换动画等。

2024-01-26 15:20:21 1478

原创 QT基础篇(17)QML编程基础

QML(Qt Meta-Object Language)是一种声明性语言,它被用于描述Qt框架中用户界面的结构和行为。QML提供了一种简洁、灵活的方式来创建动态和交互式的界面。QML基于JavaScript语法,通过使用QML类型和属性来定义界面的元素和行为。它支持嵌套和组合,使开发人员可以轻松地创建复杂的界面和动画效果。与传统的基于代码的GUI开发相比,使用QML可以更快速地构建用户界面,因为它提供了丰富的可重用组件和内置的动画和过渡效果。

2024-01-25 20:02:31 1267

原创 QT基础篇(16)QT5单元测试框架

在Qt中,数据驱动测试(Data-Driven Testing)是一种强大的测试方法,它允许你使用多组输入数据和预期输出来参数化测试用例。因此,在进行性能测试时,最好在相同的环境和条件下重复运行测试以获得更可靠的结果。如果你使用的是较新的Qt版本,可能需要进行一些小的调整,但基本概念和步骤应该是相同的。以下是一个简单的Qt单元测试实例,用于测试一个假设的数学函数。通过这种方式,你可以轻松地扩展测试数据集,以覆盖更多的边界情况和正常操作,而无需为每个数据集编写单独的测试用例。如果不相等,测试将失败。

2024-01-24 19:50:58 2352

原创 QT基础篇(15)QT5多国语言国际化

创建翻译文件:使用国际化工具创建一个新的翻译文件,例如"zh_CN.ts"(中文简体)和"en_US.ts"(英文)。创建或导入翻译文件:使用国际化工具创建一个新的翻译文件,或者导入之前创建的翻译文件。总之,实现语言国际化支持需要在软件或应用程序的设计和开发过程中进行考虑和规划,采用合适的国际化接口和工具,以确保应用程序能适应不同语言和文化环境的需求。应用程序代码实现:在应用程序的代码中,根据用户的语言设置加载对应的"*.qm"文件,并使用翻译文本来更新应用程序的界面。

2024-01-23 23:20:27 1483

原创 QT基础篇(14)QT操作office实例

通过类似的方式,你可以使用Qt来操作其他Office软件,如Word和PowerPoint。只需将上述示例中的"Excel.Application"替换为"Word.Application"或"PowerPoint.Application"即可。通过QT操作Office软件,可以使用Qt的QAxObject类来进行操作。使用这些对象,可以执行各种操作,如添加工作簿、添加工作表、获取单元格并设置值等。实例,指定了要操作的Office软件,这里是Excel。,这样可以在打开的Word界面中看到操作过程。

2024-01-22 20:23:09 984

原创 QT基础篇(13)QT5数据库

SELECT: 用于查询数据库中的数据,可以选择要查询的字段、表格和条件。// 查询表中的所有字段和数据 SELECT 列名1, 列名2 FROM 表名;// 查询满足条件的数据。数据库管理系统(Database Management System,DBMS)是一种软件系统,用来管理数据库,提供对数据库的访问和操作接口,包括数据的存储、检索、更新、删除、查询等功能。例如:SELECT 列名1, COUNT(列名2) FROM 表名 GROUP BY 列名1 HAVING COUNT(列名2) > 值;

2024-01-21 19:42:17 1106

原创 QT基础篇(12)QT5多线程

在任何一门语言中,多线程都是一个相对其他方面比较重要的点,这里面的知识体系很庞大,同步和异步之间的处理方式,以及IO多路复用等等各种进行性能优化的方面,在往上层一点我们不可能一直进行系统层次的调用,这样太费时间也太麻烦,就到设计模式这里,比如反应器(Reactor)模式,再者多线程对代码的敏感程度较高,很对细微的改变可能会带来意向不到的效果,这更要求我们对于我们写的代码有更深次的理解,不仅仅是代码本身,还要求代码执行阶段锁遇到的各种问题,这就非常考验一个程序员的功底。

2024-01-20 20:50:06 1611

原创 QT基础篇(11)QT5事件处理及实例

在QT5中,事件过滤器(Event Filter)是一种机制,允许你在一个对象上监听和处理其他对象的事件,而不是直接在目标对象上重写事件处理函数。当运行这个程序时,你可以在控制台中看到与鼠标相关的事件信息。注意,在每个事件处理函数中,我们都调用了基类的对应函数,这是为了保证其他事件处理程序可以继续接收到事件。注意,在每个事件处理函数中,我们都调用了基类的对应函数,这是为了保证其他事件处理程序可以继续接收到事件。当运行这个程序时,你可以按下和释放键盘上的任何按键,并在控制台中看到与键盘事件相关的输出信息。

2024-01-19 14:03:01 492

原创 QT基础篇(10)QT5网络与通信

QT5网络与通信是指在QT5开发环境中使用网络进行数据传输和通信的相关功能和技术。QT5提供了一套完善的网络模块,包括了TCP、UDP、HTTP等协议的支持,可以方便地在QT应用程序中进行网络通信。通过QT5的网络模块,开发者可以实现客户端和服务器之间的数据传输、消息推送、远程控制等功能。在QT5中,可以使用QTcpSocket类和QUdpSocket类来实现TCP和UDP协议的数据传输。QTcpSocket类提供了基于TCP协议的套接字接口,可以实现可靠的数据传输和连接管理;

2024-01-18 19:28:50 2745

原创 QT基础篇(9)QT5文件及磁盘处理

然后,我们创建了一个QTreeView组件,并设置该组件的模型为创建的文件系统模型,并将根目录索引设置为树视图的根索引。然后可以使用QFileInfo对象的各种函数来获取文件的不同信息,例如文件名、文件路径、文件大小、文件后缀,还可以检查文件是否存在,以及文件是否是目录或文件。然后,我们使用size()函数获取文件的大小,并使用absoluteFilePath()函数获取文件的绝对路径。通过运行上述代码,你可以监视指定文件和目录的变化,并在控制台输出相应的消息。函数添加要监视的文件或目录的路径。

2024-01-17 15:58:05 1282

原创 QT基础篇(8)QT5模型视图结构

QT5的模型视图结构主要包括模型(Model)、视图(View)和委托(Delegate)三个部分。模型(Model):模型是数据的抽象表示,负责存储和管理数据。它可以是自定义的数据结构,也可以是继承自QAbstractItemModel类的模型类。模型类通过提供一组接口函数来提供数据的访问、修改、插入和删除等功能。视图(View):视图用于显示模型中的数据,并与用户进行交互。常见的视图类有QTreeView、QListView和QTableView等。

2024-01-16 20:09:16 1815

原创 QT基础篇(7)QT5图形视图框架

图形项可以是简单的图形对象,如矩形、椭圆、路径等,也可以是复杂的图形组合,如图形项的集合、图形项的组合等。缩放操作可以放大或缩小场景中的内容,平移操作可以将场景中的内容从视图的一个位置移动到另一个位置。支持坐标变换和视图转换:Graphics View框架支持坐标变换和视图转换,可以实现图形的平移、缩放、旋转等操作,以及从场景坐标到视图坐标的转换。高效的图形渲染:Graphics View框架使用了高效的渲染技术,包括图像缓存和局部更新,可以在处理大规模图形时提供平滑的绘制性能。

2024-01-15 19:27:51 1223

原创 QT基础篇(6)QT5图形与图片

在双缓冲机制下,绘图操作首先在一个隐藏的缓冲区进行,之后再将整个缓冲区绘制到屏幕上,从而实现平滑的绘图效果。注意,在使用双缓冲机制时,要确保在每次绘图操作后都调用QWidget::update()函数来触发重绘事件,以便将缓冲区的内容绘制到屏幕上。resize(width, height): 调整窗口或控件的大小,其中width和height表示新的宽度和高度。它是一种通用的标记语言,被广泛应用于数据交换和存储。move(x, y): 将窗口或控件移动到屏幕上的指定位置,其中x和y表示要移动到的坐标。

2024-01-14 13:48:27 1006

原创 QT基础篇(5)QT5主窗口

可以使用QTextDocument的setPageSize()方法设置页面大小,使用QTextCursor的setBlockFormat()方法设置段落格式,使用setCharFormat()方法设置文本格式。可以使用QTextEdit的textCursor()方法获取当前的光标位置,然后使用QTextCursor的方法进行文本操作。这些变换方法可以单独使用,也可以组合使用。通过以上的文件操作功能,可以实现文件的读取、写入、复制、移动、删除等操作,并且可以获取文件的属性信息,方便对文件进行管理和操作。

2024-01-13 19:03:41 683

原创 QT基础篇(4)QT5基本对话框

在QT5中,你可以根据自己的需求自定义消息对话框。首先,你需要创建一个新的对话框类,继承自QDialog类。下面是一个示例代码,演示如何创建一个自定义的消息对话框:parent = nullptr): QDialog(parent) { // 创建标签和按钮 QLabellabel = new QLabel("自定义消息对话框", this);QPushButton* okButton = new QPushButton("确定", this);

2024-01-12 14:54:36 1483

原创 QT基础篇(3)QT5布局管理

简单介绍一下布局管理的使用方法。

2024-01-11 18:07:12 1102

原创 QT基础篇(2)QT5模板库,工具类及控件

隐式共享的基本原理是,当一个QString对象被复制给另一个QString对象时,实际上并不会复制字符串的内容,而是共享同一个数据块。这样,确保每个对象都有自己的独立副本。这种动态分配的内存分配策略,使得QString对象的创建和销毁都非常高效,同时也减少了内存的消耗。这种机制使得字符串的复制操作非常高效,因为只有在需要修改字符串时才会进行实际的复制操作,而在大部分情况下只是简单地增加引用计数。需要注意的是,正则表达式的语法和标准的正则表达式语法略有不同,请根据QT5的文档进行正确的使用。

2024-01-10 18:18:17 1312

原创 QT基础篇(1)QT概述

QT是一个跨平台的C++应用程序开发框架。它提供了一套丰富的图形用户界面(GUI)和多媒体功能,可以用于开发各种类型的应用程序,包括桌面应用程序、移动应用程序和嵌入式系统。QT具有易于使用、可定制性强、性能高等特点,因此被广泛应用于软件开发领域。

2024-01-09 18:51:06 1228

原创 C++精进之路(19)总结

C++基本上总结的差不多了,一门语言的学习不仅仅掌握在学上面,更重要的是如何将自己学到的东西正确的用出来,编程语言更是如此。一个人可以走得很快,但一群人才能走的更快。之后会分享QT和sqlite数据库的相关知识,将学习到的东西做一下整理和收纳。博学能笃志,勤练才能攀高峰。

2024-01-09 18:25:42 323 1

原创 C++精进之路(十八)C++新标准

修 改 后 的 共 用 体 和 P O D 规 则 、 a l i g n o f ( )运 算 符 、 a l i g n a s 说 明 符 以 及 c o n s t e x p r 机 制 支 持 低 级 编 程。总之,无论对新手还是专家来说,新标准都改善了C++的可用性和可靠性。其他改进提供了更佳的工作方式。而有些旨在增强类设计以及 使其更容易理解,这包括默认的和禁用的方法、委托构造函数、继承构造函数以及让虚函数设计更清晰的 说 明 符 o v e r r i d e 和 f i n al。

2024-01-07 19:42:32 467 1

原创 C++精进之路(十七)输入,输出和文件

同样,通过将ofstream对 象与文件关联起来,可以使用ostream 方法来写文件:通过将fstream 对象与文件关联起来,可以将输入和 输出方法用 于文件。流是进出程序的字节流。同样 ,ostream类定义了多个版本的插入运算符(<<),用于识别所有的C++基本类型,并 将它们转换为相应的字符输出。sstream头文件定义了istringstream和ostringstream 类,这些类使得能够使用istream和ostream 方法来抽取字符串中的信息,并对要放入字符串中的信息进行格式化。

2024-01-06 13:22:35 544 1

原创 C++精进之路(十六)string类和标准模板库

STL定义了多种容器类 模 板 :v e c t o r 、d e q u e 、l i s t 、s e t 、m u l f i s e t 、m a p 、m u l t i m a p 和 b i t s et : 还 定 义 了适 配 器 类 模 板 q u e u e 、p r i or i t y _q u eu e 和stack:这些类让底层容器类能够提供适配器类模板名称所建议的特性接口。通过表示常用的容器类型,并提供各种使用高效算法实现的常用操作 (全部是通用的方式实现的),

2024-01-05 14:55:56 505 1

原创 C++精进之路(十五)友元 异常和其他

类可以包含嵌套的异常类,嵌套异常类在相应的问题被发现时将被引发。未被捕获的异 常 (没 有 匹 配 的 c a t c h 块 的 异 常 ) 在 默 认 情 况 下 将 终 止 程 序 , 意 外 异 常 (不 与 任 何 异 常 规 范 匹 配 的 异 常 )也是如此。可以 对两个typeid的返回值进行比较,以确定对象是否为特定的类型,而返回的type_inf o对象可用于获得关于 对象的信息。嵌套类是在其他类中声明的类,它有助于设计这样的助手类,即实现其他类,但不必是公有接口的组 成部分。

2024-01-04 18:32:20 522 1

原创 C++精进之路(十四)C++中的代码重用

template <class T, int n>Pals <T, T*,n>{...): 第一个声明为两个类型相同,且n的值为6的情况创建了一个具体化。模板类可用作其他类、结构和模板的成员。其中,T是类型参数,用作以后将指定的实际类型的占位符 (这个参数可以是任意有效的 C++名称,但通常使用T 和Type)。其 中 z 是 一 个 i n t 值 , U 为 类 型 名 ,C L 为 一 个 使 用 t e m p l a t e < t y p e n a m e , T 声 明 的 类 模 板。

2024-01-03 19:38:54 459 1

原创 C++精进之路(13)类继承

作为i s -a 模型的一部分,派生类继承基类的数 据成员和大部分方法,但不继承基类的构造函数、析构函数和赋值运算符。派生类可以直接访问基类的公 有成员和保护成员,并能够通过基类的公有方法和保护方法访问基类的私有成员。可以在派生类中新增数 据成员和方法,还可以将派生类用作基类,来做进一步的开发。如果希望派生类可以重新定义基类的 方法,则可以使用关键字virtual 将它声明为虚的。如果要将类用作基类,则可以将成员声明为保护的,而不是私有的,这样,派生类将可以直接访问这 些成员。不 一定非得定义纯虚方法。

2024-01-02 18:15:31 444

原创 C++精进之路(十二)类和动态内存分配

如果对象包含指向new 分配的内存的指针成员,则将一个对象初始化为另一个对象,或将一个对象赋 给另 一个对象时,也会出现问题。在默认情况下,C++逐个对成员进行初始化和赋值,这意味着被初始化 或被赋值的对象的成员将与原始对象完全相同。对于每 一种情况,最终目的 都是执行深度复制,也就是说,复制实际的数据 ,而不仅仅是复制指向数据的指针。如果对象包含成员指针,同时它指向的内存是由new 分配的,则释放用于保存对象的内存 并不会自动释放对象成员指针指向的内存。与简单的C结构相比,需要注意的类细节要多得多。

2024-01-01 20:11:49 1279

原创 C++精进之路(十一)使用类

然而,如果类包含这样的方法,它返回需要显示的数据成员的值,则 可以使用这些方法,无需在 operator<<()中直接访问这些成员。当运算符函数是成员函数时,则第一个操作数将是调用该函数的对象。例如 ,在前面的语句中,up对 象是调用函数的对象。C++扩展了对运算符的重载,允许自定义特殊的运算符函数,这种函数描述了特定的运算符与类之间的关系。运算符函数可以是类成员函数,也可以是友元函数(有一些运算符函数只能是类成员函数)。要调用运算符函数, 可以直接调用该函数,也可以以通常的句法使用被重载的运算符。

2023-12-31 22:55:54 527 2

原创 C++精进之路(十)对象和类

如果mr _object是对象名,try_me()是成员函数,则可以使用成员运算符句点调用成员函数:mr _object.try_me()。在try_me()方法中引用类数据成员时,将使用mr _object 对象相应的数据成员。C++试图让用户定义的类型尽可能与标准类型类似,因此可以声明对象、指向对象的指针和对象 数组。公 有 成 员 函 数 接 口 提 供 了 A D T 描 述 的 服 务 , 类 的 私 有 部 分 和 类 方 法 的 代 码提供了实现,这些实现对类的客户隐藏。

2023-12-30 20:14:17 536 1

原创 C++精进之路之路(九)内存模型和名称空间

对于在两数外面定义的变量,其所属文件中位于该变量的定义后面的所有函数都可以使用它(文件作用域),并可在程序的其他文件中使用(外部链接性)。对于文件间共享的变量,应在一个文件中包含其定声明(无需使用 extern, 但如果同时进行初始化,也可使用它),并在其他文件中包含引用声明(使用 extern 且不初始化)。头文件和源代码文代一起定义和实现了用户定义的类型及其使用方式。在默认情况下,C+两数的链接性为外部,因此可在文件间共享:但使用关键字 static 限定的函数的接性为内部的,被限制在定义它的文件中。

2023-12-29 15:53:47 531 1

原创 C++精进之路(八)函数探幽

通过将 inline 关键字用于函数定义,并在首次调用该函数前提供其函数定义,可以使得 C ++编译器将该函数视为内联函数。也就是说,编译器不是让程序跳到独立的代码段,以执行函数,而是用相应的代码替换函数调用。如果函数调用省略了相应的参数,则程序将使用默认值:如果函数调用提供了参数值,则程序将使用这个值(而不是默认值)。因此,如果为某个参数提供了默认值,则必须为该参数右边所有的参数提供默认值。函数的特征标是其参数列表。只需使用泛型和具体算法来定义函数,编译器将为程序中使用的特定参数类型生成正确的函数定义。

2023-12-28 18:46:40 805 1

原创 C++精进之路(七)函数——C++编程模块

由于传递数据的地址时,并不会传输有关数组长度的信息,因此通常将数组长度作为独立的参数来传递。另外,也可传递两个指针(其中一个指向数组开头,另一个指向数组末尾的下一个元素),以指定一个范围,就像 STL 使用的算法一样。函数原型描述了函数的接口:传递给函数的值的数目和种类以及函数的返回类型。从技术上讲,这仍然是按值传递的,因为指针是原始地址的拷贝,但函数将使用指针来访问原始数组的内容。通过将函数指针作为参数,可以传递要调用的函数的名称。C++函数可以是递归的,也就是说,函数代码中可以包括对函数本身的调用。

2023-12-27 18:18:47 560 1

原创 C++精进之路(六)分支语句和逻辑运算符

使用引导程序选择不同操作的语句后,程序和编程将更有趣(这是否也能引起程序员们的兴趣,我没有做过研究)。C ++提供了 if 语句、 if else 语句和 switch 语句来管理选项。if 语句使程序有条件地执行语句或语句块,也就是说,如果满足特定的条件,程序将执行特定的语句或语句块。if else 语句程序选择执行两个语句或语句块之一。可以在这条语句后再加上 if else ,以提供一系列的选项。:)提供了一种选择两个值之一的简洁方式。使用循环和决策语句,便可以编写有趣的、智能的、功能强大的程序。

2023-12-26 18:27:17 395 1

原创 C++精进之路(五)循环和关系表达式

如果循环测试条件为 true 或非零,期循环将重复执行一组指令:如果测试条件为 false 或0,则结束循环。for 循环和 while 循环都是入口条件循环,这意味着程序将在执行循环体中的语句之前检查测试条件。do while 循环是出口条件循环,这意味着其将在执行循环体中的语句之后检查条件。成员函数调用通过返回转换为 false 的 bool 值来指出已到达 EOF ,而 cin get ()成员函数调用则通过返回 EOF 值来指出已到达 EOF , EOF 是在文件 iostream 中定义的。

2023-12-25 20:02:29 534

原创 C++精进之路(4)复合类型

自动变量是在函数中声明的变量,而静态变量是在函数外部或者使用关键字 static 声明的变量,这两种变量都不太灵活,自动变量在程序执行到所属的代码块(函数)时产生,在离开代码时终止,静态变量在整个程序周期内都存在。结构可以将多个不同类型的值存储在同一个数据对象中,可以使用成员关系运算符(.)来访问其中的成员。对指针应用解除引用运算符,将得到指针指向的位置中的值。c++98新增的标准模板库(STL)提供了模板类vector,它是动态数组的替代品,C++11提供了模板类array,他是定长数组的替代品。

2023-12-24 21:16:12 733 2

原创 C++精进之路(三)处理数据

C + + 1 1 新 增 了 类 型 char16_t 和char32_t,它们的宽度足以分别存储16和32位的字符编码。C++确保了char足够大,能够存 储系统基本字符集中的任何成员,而wchar_t 则可以存储系统扩展字符集中的任意成员,short 至少为16 位 , 而 i n t 至 少 与 s h o r t 一样 ⻓ , l o n g 至 少 为 3 2 位 , 且 至 少 和 i n t 一样 ⻓。字符通过其数值编码来表示。一组由存储为整数的值组成,另一组由存储为浮点格式的值组成。

2023-12-22 20:11:12 545

原创 C++精进之路(二)进入C++

类 是 用 户 定 义 的 数 据 类 型 规 范 , 它 详 细 描 述 了 如 何 表 示 信 息 以 及 可 对 数 据 执 行 的 操 作 . 对 象 是 根 据 类 规 范 创 建 的 实 体 , 就 像 简 单 变 量 是 根 据 数 据 类 型 描 述 创 建 的 实 体 一 样。函 数 由函 数 头 和 函 数 体 组 成。函 数 头 指 出 函 数 的 返 回 值 ( 如 果 有 的 话 ) 的 类 型 和 函 数 期 望 通 过 参 数 传 递 给 它 的 信 息 的 类 型。

2023-12-21 22:07:21 495

原创 C++整理复习一:预备知识(什么是C++)

C++融合了三种不同的编程方式,C语言代表的过程性语言,C++在C语言基础上添加的类代表的面向对象语言,C++模板支持的泛型编程简单提一下这三种编程方式吧1.1C语言编程原理C语言面世之初就是过程性语言,它强调的是编程的算法方面,从另一个角度讲,过程性编程首先需要考虑计算机所采取的操作,然后通过编程一步步实现这种操作,程序命令计算机按一系列流程生成特定的结果;随着程序规模的不断扩大,人们都会遇到组织方面的难题,很多代码段重复书写,太繁琐了。科学家们开发了一种更有序的编程方法———结构化编程。

2023-12-20 22:36:23 440 1

原创 代码虐我千百遍,我待代码如初恋

代码虐我千百遍,我待代码如初恋

2023-11-12 20:40:40 28

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除