笔记
文章平均质量分 63
时光清浅,不觉多年
凡是过往,皆为序章。
展开
-
Qt传递自定义类型时槽函数不响应的原因及解决方案
因项目需要,在线程中进行数据解析结束之后,需要将处理后的数据值通过信号的方式传递出来。这个值是一个自定义的类型,里面定义了解析之后的格式。typedef struct test_type{ //......}TEST_TYPE;然后就是连接信号槽了,如下:connect(pThread, SIGNAL(dataResult(TEST_TYPE)), this, SLOT(onDataResult(TEST_TYPE)));然后发现槽函数死活进不去,在查阅资料之后,找到了两种解决方法:原创 2021-09-03 10:36:03 · 4936 阅读 · 0 评论 -
关于QThread在设置parent之后,在程序关闭的时候出错问题的分析及解决方法
现象因项目需要,写了一个继承自QThread的线程类用于处理数据信息。在给继承的线程类添加了父对象之后,程序可以正常执行,但是在关闭的时候报了如下的错误:添加父对象的伪代码如下:MyThread *pThread = new MyThread(this);pThread->start();原因分析借着报错信息,提示了Destroyed while thread is still running,直译过来就是在线程仍然运行的情况下,把它摧毁了。也就是说线程还在跑的情况下,执行了其析构原创 2021-09-03 09:34:46 · 751 阅读 · 0 评论 -
QCheckBox使用时候的一个注意点
项目中需要使用一个QCheckBox来控制某些界面的显隐,并且在不满足条件的情况下,需要将CheckBox的值恢复到原先的状态。如CheckBox本身控制着远端设备的启停,从unchecked状态点击,按理说会启动设备,并将CheckBox状态变为checked。但是如果在启动的过程中失败了,这个时候需要恢复CheckBox的状态。这就是项目的需求。为了实现状态的恢复,特意设计了一个recover函数,最开始的一版使用的是setChecked()函数,如下:void recoverState(boo原创 2021-09-01 17:36:45 · 1977 阅读 · 1 评论 -
VS中bool值为true(205)的解决方法
今天在调试代码的时候,发现一个bool值判断式的返回值一直有问题,明明两个值都是true,但是判断的返回值却是false,一直进不了期望的分支。if (m_active == active){ // do sth.}else{ // do sth.}后面打断点跟踪,发现其中一个值为true(205),另一个值是true,没有下标,如下图所示:这让我很困惑,查了资料之后发现,这与VS本身的初始化值有关系:当一个函数的参数返回值是bool的时候,如果将这个函数表达式直接作为参数传递给原创 2021-08-10 18:22:25 · 1141 阅读 · 0 评论 -
VS控制台中文显示乱码的一种解决方法
VS控制台默认的是GBK编码,如下图所示,对于UTF-8格式的中文展示不友好,一直显示乱码。而我的文件基本都是按照UTF-8的格式进行编码的,然后读取的数据也是这种格式,如果仅仅是进行展示,其实可以通过改变控制台编码的方式来更改显示,如下:#include <iostream>#include "Windows.h"int main(int argc, char* argv[]){ // 更改控制台输出编码 —— 65001表示UTF-8编码格式 SetConsoleOutpu原创 2021-08-09 11:57:07 · 2472 阅读 · 1 评论 -
更改浮点型数据显示小数位数的方法
因工作需要,需要将float类型的数据通过字符串的方式进行展示。在使用to_string()函数进行转换的过程中,出现了一点问题,因为精度丢失的问题,某些情况下数据的展示不正常,例如某个数据位-180,但是在通过to_string()进行转换之后,就变成了如下图所示的样子:鉴于此,在查阅了相关的资料之后,将相关的解决方法展示如下。方法一:使用"setprecision"+"字符流"的方式在查阅资料的过程中,首先映入眼帘的是就是通过C++中的setprecision的方式修改显示的精度。但是查阅到原创 2021-07-09 18:12:08 · 2201 阅读 · 0 评论 -
QLineEdit的焦点事件
文章目录前言焦点事件QLineEdit焦点事件测试使用事件过滤器的方式重写QLineEdit的方式操作系统对于焦点事件的影响结论前言在项目中,遇到了在通过焦点事件调用系统输入法显示异常的情况,后来发现问题发生在焦点事件上,在调用输入法以及关闭输入法的时候出现了焦点的转移,这就导致输入法一直被调用。就特意研究了一下Qt的焦点事件,以及通过QLineEdit进行一些测试操作。焦点事件在应用程序中,都会有一个当前窗口,即当前获得焦点事件的窗口,这个窗口可以接受键盘的输入。焦点事件分为FocusIn和F原创 2021-05-31 10:53:01 · 8978 阅读 · 0 评论 -
教训:接收缓冲区一定要记得清空
有一个需求是需要程序获得本机的ip配置,因此采用的方式是通过C++代码调用ipconfig的方式获得。在网上查阅了相关的资料之后,最终选择采用调用CreateProcess的方式获取。部分代码如下:string getIpconfigCommandResult(){ string command("ipconfig"); unsigned len = command.size() * 2; setlocale(LC_CTYPE, ""); wchar_t *p = new wchar_t[l原创 2021-05-19 14:30:29 · 575 阅读 · 0 评论 -
正则表达式简述
注:本文仅用于介绍正则表达式中的基本概念和语法。正则表达式:Regular Expression所以在Qt中如果想要使用正则表达式,需要包含头文件QRegExp,在C++中使用正则表达式的话,需要包含的头文件是regex。正则表达式,顾名思义,是一种符合正确规则的表达式,里面重要的点在于 “正确” ,也就是符合期望,它是一种字符串匹配的模式。1. 表现形式正则表达式的表现形式是一串字符串,在这串字符串中包含了我们希望能够正确匹配的规则。2. 字符分类字符分为两类:普通字符、特殊字符(元字符)原创 2021-05-14 15:35:59 · 268 阅读 · 0 评论 -
笔记:关于QMap使用时候的一点技巧
这篇博客纯粹是笔记,非技术类探讨,用于记录一下我在使用QMap的时候发现的一个小技巧。今天设计界面的时候遇到一个现象,就是对于界面上的某些控件(如button)而言,在没有找到对应的数据的时候,需要显示一个默认的值(比如显示“请选择)。因为采用的容器是QMap,因此在获得某个值之前需要先找一下看看这个数据是否存在在QMap容器中,如果存在就直接将数据拿出展示,如果没有,就显示为默认值。示例代码如下:QMap<int, QString> testNamesMap;......ui.te原创 2021-04-21 15:37:15 · 1173 阅读 · 3 评论 -
使用QButtonGroup时如何做到消除全部选中项
在使用QButtonGroup的时候,为了做到只有一个被选中,因此使用到了:m_btnsBtnGroup->setExclusive(true);这一个有一个比较大的问题,但是在有一个被选中了之后,就无法恢复到全部未选中的状态,就一直会处于有且一个被选中的状态。但是有的时候需要恢复到未选中的状态,此时可以采用添加一个隐藏的按钮然后将之选中的方法,做到其他按钮看起来是没有被选中的状态。示例代码:///< 设置隐藏按钮m_pCleanBtn->setVisible(false);原创 2021-04-20 20:54:11 · 3449 阅读 · 3 评论 -
使用socket进行网络通信时候的注意点(内存分配即初始化的方式控制库的加载和卸载)
以使用socket进行UDP通信为例,在通信开始和结束的时候,分别会调用库函数加载和卸载的操作,一般情况下,比较简略的代码是直接在调用数据通信之前加载库,以及在结束通信之后卸载库,也就是调用WSaStartup和WSACleanup函数。WSAStartup:通知操作系统,启用SOCKET的DLL库WSACleanup:WSACleanup()是一个计算机函数,功能是终止Winsock 2 DLL (Ws2_32.dll)的使用,函数原型是int PASCAL FAR WSACleanup (v原创 2021-04-16 15:18:20 · 331 阅读 · 0 评论 -
C++实现字符串去掉前后的空格
今天遇到一个需求,需要去除字符串前后的空格,因为std::string本身没有去除空格的函数,因此自己写了一个,如下:string trimmed(const string & data){ int lPos = data.find_first_not_of(' '); int rPos = data.find_last_not_of(' '); return data.substr(lPos, rPos - lPos + 1);}比较简单,仅仅是记录一下。...原创 2021-04-14 10:18:13 · 1398 阅读 · 0 评论 -
C++中使用MySQL数据库
文章目录1. 安装MySQL2. 拷贝include和lib文件夹到C++工程中3. 正式使用数据库3.1 范例3.2 类介绍3.2.1 MYSQL句柄类3.2.2 MYSQL_RES查询结果集3.2.3 MYSQL_ROW获取单行内容3.3 重要接口函数介绍3.3.1 连接数据库3.3.2 查询3.3.3 获取查询结果集3.3.4 读取结果集数据4. 结果演示参考链接因为项目需要使用C++的方式调用MySQL数据库,因为以前使用的都是Qt的数据库类,因此在网上查阅相关资料后,特整理一下使用方法。(下方的原创 2021-04-09 10:29:45 · 22930 阅读 · 6 评论 -
C++中使用json
文章目录1. 项目中导入rapidjson模块2. 使用2.1 写json数据2.2 读json3. 总结参考链接因为项目的原因,需要在代码中读写json格式的数据。又因为不是采用的Qt,所以不能直接使用Qt的json读写,因此选择了第三方库rapidjson。关于json的语法,可以查阅我的另一篇博客json介绍及使用QJson操作json格式数据,这里面对于json的语法以及Qt对于json格式数据的操作进行了比较详细的介绍。rapidjson仅仅是生成/解析json格式的数据,并不涉及到具体的文原创 2021-04-07 13:56:04 · 6613 阅读 · 0 评论 -
Qt中界面与界面的通信方式
Qt中经常会碰到界面和界面之间的通信,借着这个机会,就将常见的几种方式总结一下。常用的方式:信号和槽全局变量文件静态函数 + 仿单例以下就详细介绍一下。1. 信号和槽信号和槽可以说是Qt的精髓了,其本质实际上就是回调函数,具体的使用其实比较简单,只要能找到对应窗口的句柄,以及其发射的信号,或者是接收的槽,就可以实现界面与界面之间的通信。因为比较简单,这里就不多加赘述。2. 全局变量对于全局变量,本人是又爱又恨。在恰当使用全局变量的时候,可以实现代码量的大量简化,这是我喜欢它的点。原创 2021-04-02 09:53:04 · 1422 阅读 · 2 评论 -
C++代码中调用Python处理脚本的方式
文章目录前言(背景介绍)一:环境配置1. 安装Python2. 创建C++项目3. 拷贝文件夹4. 在VS中配置Python内容5. 将py文件拷贝到可执行程序目录下二:代码中调用py文件1. 初始化2. 导入python脚本模块3. 函数调用3.1 无参函数调用3.2 有参函数调用4. 结果演示参考链接前言(背景介绍)因为项目中需要使用到Python脚本,而主代码是用C++书写的,因此需要实现C++调用Python。因为此篇文章主要起测试连接作用,因此使用比较简单,下方为Python脚本内容:#原创 2021-03-30 16:20:51 · 1574 阅读 · 3 评论 -
Python中创建十六进制数组的方式
项目中使用到Python脚本进行边缘计算,其中有一个需求在测试的时候需要使用到十六进制的数据,在查阅资料之后决定使用bytearray的fromhex函数,示例代码如下:def dealWithArray(bytes): if len(bytes) < 100: return '' else: mode = bytes[10] if mode == 0: return 'RESET' elif mode == 1: return 'STOP' elif mode原创 2021-03-29 17:49:57 · 3260 阅读 · 1 评论 -
installshield的一些高级操作(环境变量、软件调用等)
这篇博客是对于installshield使用的补充,主要介绍在installshield中如何进行一些高级设置。文章目录1. 环境变量1.1 Installshield中环境变量的相关参数1.2 常用的环境变量1.3 使用bat脚本设置环境变量2. 安装附加操作2.1 Installshield中的事件2.2 安装结束之后调用某个EXE文件的方式参考链接1. 环境变量1.1 Installshield中环境变量的相关参数Value: 添加的值On Install:Set:已经存在的环境变量原创 2021-02-25 10:29:59 · 2064 阅读 · 0 评论 -
数据库报duplicate XXX entry for key primary错误的可能原因以及解决方法
今天在使用数据库的过程中,发现一直报duplicate entry for key primary的错误,如下图所示:这个问题直译过来就是主键设置重复,或者说是主键冲突,因为第一次碰到这样的问题,有些不明所以,就在网上差了一些资料,发现了这么一篇文章 ======> 这是文章链接其中说到这种情况的可能原因有两种:主键没有设置自增插入线程频率较高,没有处理好事务,造成插入sql执行顺序混乱该文章中也给予了对应的解决方案,可以参考。不过这篇文章中所说到的情况并不适应于我今天遇到的问题原创 2021-02-23 14:23:24 · 95300 阅读 · 2 评论 -
VS工程中的一些概念以及常用属性设置
这里面主要介绍一下VS工程中属性的相关配置,因为是第一次写,可能有些简略。(这里面只是列出了目前为止我认为比较重要的信息)1. 宏值介绍$(SolutionDir) — 解决方案目录$(Platform) — 平台目录(x86/x64)$(Configuration) — 编译模式(Debug/Release)$(ProjectDir) — project所在的目录$(ProjectName) — 具体的project 名称,例如一个解决方案下,每一个工程都有各自的名称原创 2021-02-20 14:56:55 · 663 阅读 · 1 评论 -
Qt使用Oracle数据库的方式
文章目录使用Qt编译支持oracle的驱动库Qt使用Oracle数据库注意点因为版权问题,Qt本身不自带Oracle数据库的驱动,因此如果想要借用Qt操作Oracle数据库,需要手动进行编译。使用Qt编译支持oracle的驱动库编译的前期准备是:源码 + Oracle客户端步骤如下:打开oci文件夹(目录参考C:\Qt\Qt5.5.1\5.5\Src\qtbase\src\plugins\sqldrivers\oci,具体的目录根据自己的Qt安装路径决定)打开oci工程,并且在oci工程原创 2021-02-20 09:22:33 · 2256 阅读 · 0 评论 -
关于多个信号响应一个槽的时候的一个注意点
Qt的信号和槽机制,允许多个信号响应一个槽,平时也这么写也没有发现有什么不对的地方,但是在今天我写一个下拉框和多个下拉框显示响应显示的时候,却出现了一些意料之外的错误 —— 槽函数一直被进入,感觉上没有什么逻辑。后来发现是因为另关联的7个下拉框在一个变化的时候另外六个也有很大的几率在变化, 这就导致槽函数在处理一个下拉框变动的过程中,这个槽函数会因为另外的下拉框的变动,再次被触发,这就导致了bug的发生。鉴于此,在多个信号响应一个槽函数的时候,最好在槽函数的开始调用disconnect,在槽函数结束之后原创 2021-01-20 11:55:25 · 620 阅读 · 0 评论 -
QChart的简单使用
这篇博客的目的是记录一下今天学习QChart的内容以及使用初期踩到的几个坑。使用QChart的前期准备1. Qt5.9及以上版本;2. .pro文件中添加QT += charts3. 在使用QChart的各个控件之前,必须先声明一个命名空间。方法不限,可以使用 QT_CHARTS_USE_NAMESPACE 宏值,也可以手动使用 using namespace QT_CHARTS_NAMESPACE;结果展示使用QChart绘制折线图目的:绘制一个折线图,里面包含两根折线,以下是示例代码,因原创 2021-01-08 17:11:15 · 7590 阅读 · 3 评论 -
关于Qt和C++中对于线程的控制权不同的处理方式
今天一个bug花了很大的精力才确定的位置,这个bug的起因在于主线程是用纯C++写的,但是集成的子线程却是使用Qt的QThread类写的,这就导致如果不进行特殊处理的话,C++写的主线程无法获得子线程的控制权。这就导致主线程跑主线程的,子线程跑子线程的,造成应用程序退出的时候,子线程的退出清理逻辑没法执行完,然后进程就结束了,分配给子线程的资源也已经被回收了,这就很烦。我在子线程的清理逻辑中加了一个关闭数据库的操作,现在的情况就是程序退出,数据库关闭指令没法执行!!!然后一怒之下,我就去查了查C++和原创 2020-12-17 17:06:17 · 403 阅读 · 1 评论 -
各种数据库的查询结果限制条数的SQL语法
MySQLMySQL数据库中提供了limit关键字用来限制返回的结果集,语法为“Limit 需要返回记录的首行行数,要返回记录的条数”,例如:SELECT * FROM T_EMPLOYEE ORDER BY EMPLOYEE_ID LIMIT 10,5查询结果就是5行数据,从第10行开始。SQLServer2000微软SQL Server2000提供了TOP关键字用来返回结果集中的前N条记录,语法为“SELECT TOP 条数 字段列表 FROM 表名”。例如:SELECT TOP 10 *原创 2020-12-09 15:33:16 · 5320 阅读 · 0 评论 -
Qt控制台应用程序鼠标点击程序阻塞的问题
今天在写一个程序的时候,后台有一个线程在轮训操作,本来跑的正常的,打印输出也正常,但是在鼠标左键点击之后,整个程序阻塞了,停止运行了。如果不加更改,可以使用鼠标右击或者是键入enter恢复程序运行,但是这点很烦。这个问题真的稀奇古怪,查阅资料之后,发现问题在于Qt和win10之间的不兼容,这是一个本身的bug。鉴于我需要使用win10系统,因此,解决方法就是在控制台属性中将“快速编辑模式”取消掉。...原创 2020-12-09 15:01:20 · 986 阅读 · 3 评论 -
关于QSqlDatabase的addDatabase函数的使用注意
addDatabase的函数原型如下:[static] QSqlDatabase QSqlDatabase::addDatabase(const QString &type, const QString &connectionName = QLatin1String( defaultConnection ))注意这个函数有第二个参数!!!今天遇到的问题就是:一个项目需要用到两个数据库,我就想先打开数据库,然后把所有数据库的句柄先保存起来,后面可以直接使用。但是现在出现一个问题就是:原创 2020-12-09 09:53:12 · 10178 阅读 · 7 评论 -
一种在VS中为项目添加“宏定义”的方式
今天发现项目中缺少了一个宏定义“WITH_MYSQL”,然后我就很low地在代码中使用#define WITH_MYSQL进行添加了这个宏值。然后我同事看到了,就说,对于这种宏值,最好不要在代码中添加,可以通过在项目属性中进行添加,过程如下:1.右键项目,点击属性,跳出如下界面,然后选中C/C++→预处理器,界面如下:2.选择“预处理器定义”,点击右边进行编辑:3.在编辑框中添加“WITH_MYSQL”宏值即可:顿时就高端大气上档次了,有没有!...原创 2020-12-02 15:07:48 · 2784 阅读 · 0 评论 -
结构化文档与XML基本概念介绍
文章目录结构化文档XML1.声明 declaration2.元素 element3.属性 attribute4.实体 —— 具有特殊含义的字符5.注释6.总结结构化文档结构化文档由标题、章节、段落等逻辑结构组成。“结构化”听起来太抽象了,实际上结构化就是为文档建立一个框架,就象写文章先写一个提纲。结构化使你的文档看起来不会杂乱无章,每一部分都紧密联系,形成一个整体。结构化有两个原则:每一部分(每一个元素)都和其他元素有关联,关联的级数就形成了结构。标识本身的含义与它描述的信息相分离。XML原创 2020-11-16 14:36:27 · 2578 阅读 · 0 评论 -
使用installsheild进行软件打包的步骤及注意项
今天早上,完成了我人生中第一次完整意义上的软件打包,现在整理一下步骤:新建文件,因为我需要的是msi格式的软件包,因此选择情况如下:添加软件信息,如公司名、软件名、版本号、公司地网站地址等:设置系统环境,此软件我选择的是默认:设置软件文档结构,把软件中的结构添加进来:设置快捷方式:设置支持语言:添加依赖库,按照步骤一点点进行:开始构建项目:以上就是简单的步骤,需要注意的是,如果软件需要加密,那么最好的方式是对其中的关键文件进行加密,如依赖的动态库、.ex原创 2020-10-22 09:18:09 · 1314 阅读 · 0 评论 -
关于事件循环
今日方知我是我。参考文章原创 2020-10-12 10:34:02 · 154 阅读 · 1 评论 -
解决Qt在使用VS2015调试器时候报的the cdb process terminated的问题
今天在使用Qt的VS2015编译器调试的时候发现,无法调试,只能运行。后来发现是缺少了Windows software development kit,也就是传说中的SDK。查阅资料之后发现,这个SDK并不会随同VS2015一同安装,需要手动安装。然后就找到了这篇文章:参考文章写的挺好的,就用这篇博客记录一下,省的自己找不到了。...原创 2020-10-09 15:11:40 · 525 阅读 · 0 评论 -
关于Qt中使用QFile打开文件时遇到问题的分析
项目场景:在文件打开的时候,使用QFile的QIODevice的不同模式,会出现不同的表现(这是我一个同事当时遇到的问题,现在拿来分析分析,以下的所有事例代码均用于示范使用,有些内容因为不是特别重要就给抹去了,因此显得可能有些不规范,如果读者想要自己去实现的话,需要将其添加完整)。问题描述: QFile的文件打开常用的集中方式包括只读、只写、读写等。当时我那个同事在使用QIODevice::ReadWrite或者是QIODevice::WriteOnly模式时,会出现文件打开失败的情况。当时我挺好奇原创 2020-09-13 21:16:19 · 19966 阅读 · 2 评论 -
关于C++中“访问权限”的理解
有两个角度:“继承角度”和“封装角度”。继承角度,就是平时使用的public、protected和private三种访问权限。封装角度,就分为两类:提供封装(private)和不提供封装(其他)。原创 2020-08-03 12:22:55 · 185 阅读 · 0 评论 -
lambda表达式的“值捕获”和“引用捕获”
对于lambda表达式而言,捕获的方式分为两种:“值捕获”和“引用捕获”;这两种方式有什么区别呢?在理解区别之前,必须知道一个lambda表达式的规则:lambda表达式的“参数”是在被调用时拷贝,而“被捕获的变量的值”是在lambda表达式创建时拷贝。理解这一点至关重要,因为lambda表达式捕获的值在创建时被拷贝,因此如果采用“值捕获”的方式,后续对于该变量的修改并不会影响到lambda表达式的计算;但是如果采用“引用捕获”的方式,在lambda表达式被创建后被调用前的这个阶段,如果该值发生了改原创 2020-08-03 00:59:43 · 3487 阅读 · 1 评论 -
关于Qt中的QStringLiteral
关于乱码的解决方案,目前其实有好几种方法,比如在MSVC编译器下设置execution_character的方式,又或者是采用QString中的fromLocal8Bit等的方式,但是都有着局限性。今天发现了一个比较好的宏QStringLiteral的方式,对于需要展示的中文添加修饰,可以比较好地解决这个问题。literal:adj 文字的;逐字的;无夸张的...原创 2020-06-25 22:42:19 · 1357 阅读 · 0 评论 -
QTableWidget中关于cellWidget的信号的处理方式
今天在设计界面的时候,甲方要求需要在表格中添加进去复选框。至于添加复选框的方式还是很简单的,直接使用setCellWidget函数即可。但是后面当我想通过“表格”的“item”的“点击”获得这个cell的信号的时候,发现不可以,会出现部分地区失灵的情况,画个草图如下:从上图可以看出,一个item中,因为添加了一个cellWidget的缘故,导致部分空间被cellWidget占用,这就导致在点击属于cellWidget部分的空间时,无法触发item的点击信号,只有在点击item这部分的空间的时候,才能够原创 2020-06-25 22:27:58 · 5705 阅读 · 2 评论 -
Qt中简化信号和槽连接的方法
信号和槽是Qt的核心通信方式,虽然说很方便,但是如果一个控件就写一个信号和槽的连接的话,程序会非常繁琐。现总结一下我常用到的方式:1. QAbstractButton类所有继承自QAbstractButton类的控件类:QCheckBox,、QPushButton、QRadioButton、QToolButton,以及自己重新继承这些类的类,均可以使用一个叫做QButtonGroup类的按钮组,这个按钮组可以存放指向QAbstractButton类的指针,并且可以绑定ID,使用的时候,可以直接通过ID原创 2020-06-12 22:39:56 · 349 阅读 · 0 评论 -
关于“抽象类”不能被实例化的解释
在学习C++时候,有了抽象类不能被实例化的第一种解释:抽象类中包含纯虚函数,所以不能被实例化。今天了解到了另一种解释:抽象类将它的部分或者是全部操作的实现延迟到子类中,因此不能被实例化。一个是从语法的角度,一个是从实际意义的角度。两种角度都可以解释这个现象。其实仔细想想,这两种解释实际上是一个事情,就是说因为抽象类中含有未定义的操作,如果抽象类能实例化,代表着这个操作是可以执行的。如果执行一个未定义的操作,会出现意料之外的问题。因此,抽象类不能被实例化。...原创 2020-06-10 15:53:39 · 3775 阅读 · 0 评论