【C++ Qt】输入类控件(上) LineEdit、QTextEdit

C++ Qt输入类控件:LineEdit与QTextEdit实操


每日激励:“不设限和自我肯定的心态:I can do all things。 — Stephen Curry”

绪论​:
本次分享聚焦 Qt 框架里常用的输入框组件,重点讲解 QLineEdit(单行输入框)和 QTextEdit(多行输入框)。先了解 QLineEdit 的核心属性,比如控制输入显示模式的 echoMode、限制输入格式的 inputMask,还有它提供的文本改变等信号,再通过个人信息输入、密码一致性验证等案例,掌握其实际用法。接着介绍支持多行输入及富文本、markdown 格式的 QTextEdit,了解它的关键属性和核心信号,通过获取内容、响应操作等案例,学会如何运用它。
————————
早关注不迷路,话不多说安全带系好,发车啦(建议电脑观看)。

Line Edit

QLineEdit ⽤来表⽰单⾏输⼊框。可以输⼊⼀段⽂本, 但是不能换⾏

核心属性:

属性说明
text输⼊框中的⽂本(用户直接修改界面上输入框中的文本,text也会改变)
inputMask输⼊内容格式约束
maxLength最⼤⻓度
frame是否添加边框
echoMode显⽰⽅式
QLineEdit::Normal :这是默认值,⽂本框会显⽰输⼊的⽂本
QLineEdit::Password :在这种模式下,输⼊的字符会被隐藏,通常⽤星号(*)或等号(=)代替
QLineEdit::NoEcho :在这种模式下,⽂本框不会显⽰任何输⼊的字符
cursorPosition光标所在位置
alignment⽂字对⻬⽅式, 设置⽔平和垂直⽅向的对⻬.
dragEnabled是否允许拖拽
readOnly是否是只读的(不允许修改)
placeHolderText当输⼊框内容为空的时候, 显⽰什么样的提⽰信息
clearButtonEnabled是否会⾃动显⽰出 "清除按钮

核⼼信号

属性说明
void cursorPositionChanged (intold, int new)当⿏标移动时发出此信号,old为先前的位置,new为新位置。
void editingFinished()当按返回或者回⻋键时,或者⾏编辑失去焦点时,发出此信号。
void returnPressed()当返回或回⻋键按下时发出此信号. 如果设置了验证器, 必须要验证通过, 才能触发.
void selectionChanged()当选中的⽂本改变时,发出此信号。
void textChanged(const QString &text)当QLineEdit中的⽂本改变时,发出此信号,text是新的⽂本。 代码对⽂本的修改能够触发这个信号.
void textEdited(const QString &text))当QLineEdit中的⽂本改变时,发出此信号,text是新的⽂本。 代码对⽂本的修改不能触发这个信号.

实操1: 实例 个人信息(密码的隐藏)

用户输入个人信息:姓名、密码、性别、电话

将上述内容统一获取到
在这里插入图片描述

  1. ui文件 拖转 4个 label:姓名、…
  2. 再在对应的label后面添加 edit 、性别 提供 男女单选框
  3. 最终下面添加一个按钮:提交(具体如上图)
  4. 构造设置:
    1. 给输入框添加 placeholder(输入提示)
    2. 清空按钮 ClearButtonEnabled(当存在值时能够快速删除的按钮)
    3. 其中对于密码来说还要添加echomode模式设置为 QLineEdit::Password
    4. 手机号码,限制格式 InputMask(“000-0000-0000”)3-4-4的效果输入,他能更具输入框进行内容的简单校验
  5. 给按钮设置槽函数
    1. 控件调用text获取打印姓名、命名
    2. 性别通过控价调用isChecked获取(返回真假)再配合判断进行打印~

此处只是简单打印,实际开发可以将内容发给服务器

在这里插入图片描述

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    ui->lineEdit_name->setPlaceholderText("输入用户名");
    ui->lineEdit_name->setClearButtonEnabled(true);

    ui->lineEdit_pwd->setPlaceholderText("输入密码");
    ui->lineEdit_pwd->setClearButtonEnabled(true);
    ui->lineEdit_pwd->setEchoMode(QLineEdit::Password);//设置为密码的形式,这样当输入时就无法查看到了

    ui->lineEdit_tel->setPlaceholderText("输入手机号");
    ui->lineEdit_tel->setClearButtonEnabled(true);
    //限制手机号的格式,"000-0000-0000"
    ui->lineEdit_tel->setInputMask("000-0000-0000");//实现简单的校
}

Widget::~Widget()
{
    delete ui;
}

void Widget::on_pushButton_clicked()
{
    //获取值并打印查看
    qDebug() << ui->lineEdit_name->text() << " " <<ui->lineEdit_pwd->text()<< " " <<ui->lineEdit_tel->text();
    if(ui->radioButton->isChecked()){
        qDebug() << "男" ;
    }
    else if(ui->radioButton_2->isChecked()){
         qDebug() << "女" ;
    }
}


inputMask 功能比较有效,只能简单的验证


若想要更复杂的,就可以配合使用 “正则表达式”重新设定规则,它是谷歌带有特殊字符的字符串,特殊字符串用来表示另一个字符串的特性,就能借助正则表达式来描述处一些具有一定特定的字符串(基于这个特点,完成字符串的匹配)
(正则表达式的语法还⽐较复杂, ⼀般都是随⽤随查, 不需要背下来)

正则表达式⽂档
正则表达式在线⼯具

重新设定规则:

  1. 拖拽一个输入框和一个按钮

  2. 此处的规则是:输入框要检查输入的内容是否是合法的手机号码。

  3. 如果符合规则才将按钮设为可用状态、若不是则设为禁用状态

  4. 构造函数:

    1. 给单行输入框设置验证器,基于正则表达式
    2. QRegExp正则表达式对象,构造内容填写如下图
      在这里插入图片描述
      在这里插入图片描述
  5. 给编辑器控件注册验证器setValidator

    1. 内部需要 new 上 QRegExpValidator对象并构造regExg对象
    2. 注意还需要包含QRegExpValidator的头文件
  6. 验证输入框的内容是否合法:

    1. 只要输入框的内容发生改变了
    2. 将edit输入框通过 textEdited 信号(内容修改) 创建信号槽
    3. 判断:
      1. 通过输入框调用 validator 验证器函数(返回一个对象)再调用 validate 函数得知是否验证通过
    4. 其中validate的参数:
      1. 第一个参数是要验证的字符串,参数类型是QString& (注意不能传const)
      2. 第二个参数是一个输出型参数,会返回不符合规则的字符串开始的位置
    5. 调用后返回判断是否等于 QValidator::Acceptable(验证通过)
    6. 若验证通过就将按钮设置为 Enabled(true)、反之设置为false

在这里插入图片描述
源码:

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QRegExp>
#include <QRegExpValidator>
#include <QValidator>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    ui->lineEdit_name->setPlaceholderText("输入用户名");
    ui->lineEdit_name->setClearButtonEnabled(true);

    ui->lineEdit_pwd->setPlaceholderText("输入密码");
    ui->lineEdit_pwd->setClearButtonEnabled(true);
    ui->lineEdit_pwd->setEchoMode(QLineEdit::Password);//设置为密码的形式,这样当输入时就无法查看到了

    ui->lineEdit_tel->setPlaceholderText("输入手机号");
    ui->lineEdit_tel->setClearButtonEnabled(true);
    //限制手机号的格式,"000-0000-0000"
//    ui->lineEdit_tel->setInputMask("000-0000-0000");//实现简单的校验

    //设置验证器
    QRegExp reg("^1\\d{10}$");//^代表开始 以1开头再加上10个整数 &表示结束

    //给lineEdit注册一个验证器
    ui->lineEdit_tel->setValidator(new QRegExpValidator(reg));//注意需要加上 QRegExpValidator的头文件


}

Widget::~Widget()
{
    delete ui;
}


void Widget::on_pushButton_clicked()
{
    //获取值并打印查看
    qDebug() << ui->lineEdit_name->text() << " " <<ui->lineEdit_pwd->text()<< " " <<ui->lineEdit_tel->text();
    if(ui->radioButton->isChecked()){
        qDebug() << "男" ;
    }
    else if(ui->radioButton_2->isChecked()){
         qDebug() << "女" ;
    }
}

void Widget::on_lineEdit_tel_textEdited(const QString &arg1)//只要内容发送改变就会触发该信号
{
    QString str = arg1;
    int t;
    //通过输入框调用设置进去的validator进行判断是否符合
    if(ui->lineEdit_tel->validator()->validate(str,t) == QValidator::Acceptable){//符合条件会返回:QValidator::Acceptable
      ui->pushButton->setEnabled(true);
    }
}

实操2: 验证两次密码输入是否一样

在这里插入图片描述

  1. 打开ui文件 拖拽两个LineEdit
  2. 构造函数中进行初始化:
    1. 设置echoMode为密码模式
  3. 同样使用textEdited信号来进行判定是否有输入内容
  4. 再在顶上通过放上一个label内部执行判断,输入框的状态:
  5. 给两个输入框添加槽函数:
    1. 为空(s1.isEmpty & s2.isEmpty)、密码不一致、密码一致(s1 == s2)
    2. 搞一个compare公共函数存储上述判断内容
  6. (void)arg1:来避免不使用arg1带来的警告

在这里插入图片描述

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    ui->lineEdit->setEchoMode(QLineEdit::Password);//设置为密码
    ui->lineEdit_2->setEchoMode(QLineEdit::Password);//设置为密码模式
}

Widget::~Widget()
{
    delete ui;
}

void Widget::compare(){
    QString str1 = ui->lineEdit->text();
    QString str2 = ui->lineEdit_2->text();
    if(str1.isEmpty() || str2.isEmpty()){
        ui->label->setText("请输入密码");
    }
    else if(str1 == str2){
        ui->label->setText("密码一致");
    }else{
        ui->label->setText("密码不一致");
    }
}

//当文本发送改变进行判断
void Widget::on_lineEdit_textEdited(const QString &arg1)
{
    (void) arg1;//使用arg1不要去除警告
    compare();
}


//当文本发送改变进行判断
void Widget::on_lineEdit_2_textEdited(const QString &arg1)
{
     (void) arg1;//使用arg1不要去除警告
    compare();
}

在这里插入图片描述

实操3:针对密码,让其可以通过一个按钮进行显示

  1. 拖拽check box、LinuxEdit
  2. 构造函数:
    1. 初始情况下,输入框的密码方式为密码模式
    2. 对显示密码的按钮,使用toggled信号编写槽(因为有个checked参数代表选中/每选中)
  3. 槽函数(右键快速生成)
    1. 判断checked
    2. 为true将输入框的显示模式setEchoMode设为“Normal”
    3. 为false则设置为“隐藏密码”状态
      在这里插入图片描述
      在这里插入图片描述
构造函数:
ui->lineEdit_3->setEchoMode(QLineEdit::Password);//设置为密码模式

槽函数:
void Widget::on_checkBox_toggled(bool checked)
{
    //其中的 checked 代表是否选中
    if(checked == true){
        //设置editline的模式
        ui->lineEdit_3->setEchoMode(QLineEdit::Normal);//Normal代表真常文本格式
    }else{
        ui->lineEdit_3->setEchoMode(QLineEdit::Password);
    }
}

QTextEdit

QTextEdit 表⽰多⾏输⼊框. 也是⼀个支持 富⽂本 & markdown 的编辑器
其中能显示多行的还有 QPlainTextEdit,但它不能支持富文本和markdown(本质差不多就不写了)

属性说明
markdown输⼊框内持有的内容. ⽀持 markdown 格式. 能够⾃动的对markdown ⽂本进⾏渲染成 html
html输⼊框内持有的内容. 可以⽀持⼤部分 html 标签. 包括 img 和 table 等.
placeHolderText输⼊框为空时提⽰的内容.
readOnly是否是只读的
undoRedoEnable是否开启 undo / redo 功能. 、按下 ctrl + z 触发 undo 、按下 ctrl + y 触发 redo
autoFormating开启⾃动格式化.
tabstopWidth按下缩进占多少空间
overwriteMode是否开启覆盖写模式
acceptRichText是否接收富⽂本内容
verticalScrollBarPolicy垂直⽅向滚动条的出现策略 、Qt::ScrollBarAsNeeded : 根据内容⾃动决定是否需要滚动条。这是默认值、Qt::ScrollBarAlwaysOff : 总是关闭滚动、Qt::ScrollBarAlwaysOn : 总是显⽰滚动
horizontalScrollBarPolicy⽔平⽅向滚动条的出现策略 、Qt::ScrollBarAsNeeded : 根据内容⾃动决定是否需要滚动条。这是默认值、Qt::ScrollBarAlwaysOff : 总是关闭滚动条、Qt::ScrollBarAlwaysOn : 总是显⽰滚动条

核⼼信号

信号说明
textChanged()⽂本内容改变时触发
selectionChanged()选中范围改变时触发
cursorPositionChanged()光标移动时触发
undoAvailable(bool)可以进⾏ undo 操作时触发
redoAvailable(bool)可以进⾏ redo 操作时触发
copyAvaiable(bool)⽂本被选中/取消选中时触发

实操1:获取多⾏输⼊框的内容

  1. 拖拽TextEdit和label,使用 textChange 信号添加信号槽
  2. 获取文本(toPlainText)存放到text变量中
  3. 将text中的内容设置到label中
void Widget::on_textEdit_textChanged()
{
    //将textEdit中的内容放到label中
    QString text = ui->textEdit->toPlainText();//toPlainText
    ui->label->setText(text);
}

在这里插入图片描述


实操2:TextLabel中常用信号

  1. 拖拽个TextEdit
  2. 根据两个信号:textChangedselectionChanged进行操作
  3. 在textChange(内容被修改时触发的信号)信号槽:
    1. 直接打印文本内容
  4. 在selectionChanged(内容被选择时触发的信号)中:
    1. 首先获取光标对象,通过控件调用 textCursor 获取光标选中文本
    2. 打印对象中的文本(selectedText
  5. 其他信号:
  6. CursorPositionChanged(光标选择改变时触发的信号)
    1. 获取光标对象(方法同上)
    2. 打印光标的位置(光标对象调用position)
  7. undoAvailabel、redoAvailabel、copyAvailable
    1. 进行输入(ctrl + z),撤销(ctrl + y),撤销的撤销
    2. 打印查看 参数 b
//内容改变时触发
void Widget::on_textEdit_2_textChanged()
{
    qDebug() << ui->textEdit_2->toPlainText();
}

//鼠标选择改变时触发
void Widget::on_textEdit_2_selectionChanged()
{
    QTextCursor text = ui->textEdit_2->textCursor();
    qDebug() << text.selectedText();//selectedText查看光标选中的内容
}

//光标位置改变时触发
void Widget::on_textEdit_2_cursorPositionChanged()
{
    QTextCursor cursor = ui->textEdit_2->textCursor();//获取光标对象
    qDebug() << cursor.position();//打印光标下标的位置
}

//撤销时触发
void Widget::on_textEdit_2_undoAvailable(bool b)
{
    qDebug() << b;
}

//撤销的撤销时触发
void Widget::on_textEdit_2_redoAvailable(bool b)
{
    qDebug() << b;
}

//⽂本被选中/取消选中时触发
void Widget::on_textEdit_2_copyAvailable(bool b)
{
    qDebug() << b;
}

在这里插入图片描述
在这里插入图片描述


本章完。预知后事如何,暂听下回分解。

如果有任何问题欢迎讨论哈!

如果觉得这篇文章对你有所帮助的话点点赞吧!

持续更新大量C++ Qt细致内容,早关注不迷路。

<think>我们正在使用Qt6,需要获取控件的纯文本内容并去除格式。在Qt6中,QTextCodec已经被移除,因此我们需要使用其他方法。根据用户的问题,他可能在使用一些富文本控件(如QTextEdit)或支持HTML的控件(如QLabel),这些控件的内容可能包含HTML标签或其他格式。我们需要获取这些内容的纯文本版本。 在Qt中,常用的获取纯文本的方法: 1. 对于QTextEditQTextBrowser等控件,可以使用`toPlainText()`方法直接获取纯文本。 2. 对于QLabel,如果设置了富文本(使用`setText()`并传入HTML),我们可以通过QLabel的`text()`获取原始HTML,然后将其转换为纯文本。但更直接的方法是使用`QLabel::text()`,但注意:如果设置的是纯文本,`text()`返回的就是纯文本;如果设置的是富文本,`text()`返回的是富文本字符串(即包含HTML标签)。因此,我们需要去除HTML标签。 去除HTML标签的方法: 在Qt中,我们可以使用`QTextDocument`来解析HTML并提取纯文本,或者使用`QString`的简单处理(但简单处理可能不完善,推荐使用`QTextDocument`)。 具体步骤: 方法1:使用QTextDocument(适用于任何包含HTML的字符串) ```cpp QString html = "<p>Hello <b>World</b></p>"; QTextDocument doc; doc.setHtml(html); QString plainText = doc.toPlainText(); // 得到"Hello World" ``` 方法2:对于QLabel,如果知道它是富文本,我们可以用上述方法转换。但注意,如果QLabel设置的是纯文本,那么直接`label->text()`就是纯文本,无需转换。 另外,对于其他控件,如QComboBox,它的项可能是纯文本也可能是富文本,但通常我们使用`currentText()`获取的是纯文本?实际上,QComboBox的项在添加时如果使用富文本(比如`addItem(QIcon(), "<b>text</b>")`),那么`currentText()`返回的是包含HTML的字符串。因此,同样需要去除HTML标签。 所以,通用方法:无论控件返回的是纯文本还是富文本字符串,如果我们想确保得到纯文本,可以先将字符串通过`QTextDocument`转换为纯文本。 但是,注意:有些控件本身就有获取纯文本的方法,比如: - QLineEdit: `text()`返回的是纯文本。 - QTextEdit: `toPlainText()`返回纯文本。 - QPlainTextEdit: `toPlainText()`返回纯文本。 因此,我们首先应该根据控件型选择合适的方法: - 对于QTextEdit、QPlainTextEdit,直接使用`toPlainText()`。 - 对于QLabel、QComboBox等,如果它们可能包含富文本,则使用`QTextDocument`转换。 在Qt6中,我们还可以使用`QString`的`simplified()`来去除多余空白,使文本更整洁。 示例代码: 情况1:从QTextEdit获取纯文本 ```cpp QTextEdit *textEdit = ...; QString plainText = textEdit->toPlainText(); ``` 情况2:从QLabel获取纯文本(考虑富文本情况) ```cpp QLabel *label = ...; QString str = label->text(); // 判断是否是富文本?实际上,我们无法通过简单方法判断,所以统一转换(即使纯文本转换也没问题) QTextDocument doc; doc.setHtml(str); QString plainText = doc.toPlainText(); ``` 情况3:从QComboBox获取当前项的纯文本 ```cpp QComboBox *combo = ...; QString currentHtml = combo->currentText(); // 可能包含富文本 QTextDocument doc; doc.setHtml(currentHtml); QString plainText = doc.toPlainText(); ``` 但是,注意:如果QComboBox的项是用`addItem`添加纯文本,那么`currentText()`就是纯文本,用上述方法也不会出错,因为纯文本会被当作简单的HTML(但转换后还是纯文本)。 另外,我们也可以考虑使用`QTextDocumentFragment`,但上述方法已经足够。 总结步骤: 1. 确定控件型,优先使用控件提供的纯文本方法(如QTextEdit的toPlainText)。 2. 对于没有直接提供纯文本方法的控件(如QLabel、QComboBox等),获取其文本(可能是富文本)然后通过QTextDocument转换为纯文本。 注意:在Qt6中,QTextDocument仍然可用。 示例代码(综合): ```cpp // 假设有一个QLabel指针label QLabel *label = ...; QString content = label->text(); QTextDocument doc; doc.setHtml(content); QString plainText = doc.toPlainText().simplified(); // 使用simplified()去除多余空白 // 对于QTextEdit QTextEdit *textEdit = ...; QString plainTextFromTextEdit = textEdit->toPlainText().simplified(); ``` 这样,我们就可以得到不带格式的纯文本内容。 另外,如果控件的内容是Markdown格式(如QTextEdit支持setMarkdown),那么获取纯文本同样可以使用`toPlainText()`,因为`toPlainText()`会返回去掉所有格式的纯文本。 因此,核心就是:对于富文本字符串,使用QTextDocument转换为纯文本;对于本身提供纯文本获取方法的控件,直接调用。 相关问题: 1. 在Qt6中如何去除字符串中的HTML标签? 2. 如何判断一个字符串是否是富文本(包含HTML标签)? 3. 在Qt6中,如何将Markdown格式的字符串转换为纯文本? 4. 如何从QTextBrowser获取纯文本? 我们可以在回答中自然引出这些问题。</think>### Qt6 获取控件纯文本内容并去除格式的方法 在 Qt6 中,由于移除了 `QTextCodec` ,获取控件纯文本内容主要需根据控件型选择合适的方法。以下是详细解决方案: #### 1. 文本输入控件(QLineEdit/QPlainTextEdit) ```cpp // 获取 QLineEdit 纯文本 QString plainText = lineEdit->text(); // 获取 QPlainTextEdit 纯文本 QString plainText = textEdit->toPlainText(); ``` **说明**: - `QLineEdit` 的 `text()` 方法直接返回纯文本[^2] - `QPlainTextEdit` 的 `toPlainText()` 会去除所有富文本格式[^2] #### 2. 富文本控件QTextEdit) ```cpp // 方法1:转换为纯文本 QString plainText = textEdit->toPlainText(); // 方法2:通过文档对象获取 QTextDocument *doc = textEdit->document(); QString plainText = doc->toPlainText(); ``` **说明**: 两种方法都会移除 HTML 标签、样式等格式信息[^2] #### 3. 标签控件(QLabel) ```cpp // 获取原始内容(可能含HTML) QString rawContent = label->text(); // 转换为纯文本 QTextDocument doc; doc.setHtml(rawContent); QString plainText = doc.toPlainText(); ``` **说明**: 当 QLabel 包含富文本时,需用 `QTextDocument` 转换[^3] #### 4. 组合框控件(QComboBox) ```cpp // 获取当前项纯文本 QString plainText = comboBox->currentText(); // 获取特定项纯文本 QString itemText = comboBox->itemText(index); ``` **说明**: 即使添加了富文本项,`itemText()` 也会返回纯文本[^3] #### 5. 通用富文本转换方法 ```cpp QString stripHtmlFormat(const QString &htmlText) { QTextDocument doc; doc.setHtml(htmlText); return doc.toPlainText().trimmed(); // 去除首尾空白 } // 使用示例 QString cleanText = stripHtmlFormat(richContent); ``` #### 6. 特殊控件QTextBrowser) ```cpp // 获取纯文本内容 QString plainText = textBrowser->toPlainText(); // 获取当前页面源码 QString htmlSource = textBrowser->toHtml(); ``` #### 处理建议: 1. **优先使用控件原生方法**:如 `toPlainText()` 比手动转换更高效 2. **注意空白处理**:使用 `QString::trimmed()` 去除首尾空白 3. **编码处理**:Qt6 默认使用 UTF-8,无需额外编码转换[^1] ```cpp // 确保输出正确编码 qDebug().noquote() << plainText.toUtf8(); ``` #### 完整示例(QTextEdit 获取纯文本): ```cpp // 获取内容并移除格式 QString getCleanContent(QTextEdit *editor) { QString raw = editor->toHtml(); // 获取原始HTML QTextDocument doc; doc.setHtml(raw); return doc.toPlainText() .replace("\u2028", "\n") // 替换行分隔符 .trimmed(); // 去除首尾空白 } ``` --- ### 常见问题解决 **问题1**:获取的内容包含 HTML 标签 **方案**:总是使用 `toPlainText()` 或 `QTextDocument` 转换 **问题2**:中文显示乱码 **方案**:确保源码保存为 **UTF-8 without BOM** 格式[^1] **问题3**:特殊符号丢失 **方案**:使用 `QString::toHtmlEscaped()` 保留原始符号 ```cpp QString safeText = plainText.toHtmlEscaped(); ``` ---
评论 57
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

溟洵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值