QT开发--控件篇

第八章 按键类控件

8.1 按钮基类 QAbstractButton

        在QT中,多种按钮控件均继承自QAbstractButton,共享其基础属性与功能。

        Dialog Button Box是特殊组合(两个QPushButton水平排列),非单一新控件。

.ui的按键类

        这些按钮控件之间的继承关系如下图:

QAbtractButton按键基类继承关系

8.1.1 标题和图标

        这些函数分别用于设置和获取QAbstractButton对象的文本内容、图标以及图标大小。

// 设置按钮文本  
void QAbstractButton::setText(const QString &text);  
  
// 获取按钮文本  
QString QAbstractButton::text() const;  
  
// 获取按钮图标  
QIcon QAbstractButton::icon() const;  
  
// 设置按钮图标  
void QAbstractButton::setIcon(const QIcon &icon);  
  
// 获取按钮图标大小  
QSize QAbstractButton::iconSize() const;  
  
// 设置按钮图标大小  
void QAbstractButton::setIconSize(const QSize &size);

8.1.2 按钮的 Check 属性

        按钮通常有三种状态:Normal(普通状态)Hover(悬停状态)Pressed(按压状态)

        按钮在鼠标按下时从 Normal切换到 Pressed状态,鼠标释放时恢复到 Normal状态。

        若按钮设置了checkable属性,则行为有所不同:

//判断按钮是否设置了checkable属性。默认未设置(not checkable)。
void isCheckable() const;

//设置按钮的checkable属性。
//为true时,点击按钮后按钮保持Pressed状态,需再次点击才恢复Normal状态;
//为false时,行为默认。
void setCheckable(bool);

        此外,还有与选中状态相关的函数:

//判断按钮是否被选中。
void isChecked() const;

//设置按钮的选中状态。需先设置checkable属性。
void setChecked(bool);

8.1.3 信号

        按钮在被点击、快捷键键入或特定函数调用时,会发射不同的信号。

        最常用的信号是clicked(),而pressed()released()信号则分别对应按钮的按下和释放状态。

        对于设置了check属性的按钮,其选中状态变化时会发射toggled()信号。

// 按钮被激活时发射  
[signal] void QAbstractButton::clicked(bool checked = false);  
  
// 按钮按下时发射  
[signal] void QAbstractButton::pressed();  
  
// 按钮释放时发射  
[signal] void QAbstractButton::released();  
  
// 可检查按钮状态改变时发射  
[signal] void QAbstractButton::toggled(bool checked);

8.1.4 槽函数

        QAbstractButton提供了多种槽函数,如animateClick()用于执行动画点击,click()用于模拟鼠标点击,setChecked()用于设置按钮的选中状态,setIconSize()用于设置图标大小,以及toggle()用于切换可检查按钮的状态。

// 执行动画点击,模拟点击时按键变灰松手变白,默认100毫秒  
QAbstractButton::animateClick(int msec = 100);  
  
// 模拟鼠标点击效果  
QAbstractButton::click();  
  
// 设置按钮的选中状态  
QAbstractButton::setChecked(bool checked);  
  
// 设置按钮上图标的大小  
QAbstractButton::setIconSize(const QSize &size);  
  
// 切换可检查按钮的状态  
QAbstractButton::toggle();

8.2 QPushButton

8.2.1 QPushButton常用API

构造函数

/*带图标、文本和父对象的构造函数*/
QPushButton(const QIcon &icon,          // 按钮上显示的图标  
            const QString &text,        // 按钮上显示的文本  
            QWidget *parent = nullptr); // 按钮的父对象,可不指定

/*只带文本和父对象的构造函数*/
QPushButton(const QString &text, // 按钮上显示的文本  
            QWidget *parent = nullptr); // 可选的父对象 
 
/*只带父对象的构造函数*/  
QPushButton(QWidget *parent = nullptr); // 可选的父对象,创建无文本的按钮

判断与设置默认按钮

/*判断按钮是否为默认按钮*/
bool isDefault() const;

/*设置按钮为默认按钮(通常用于对话框,与Enter键关联)*/
void setDefault(bool);

关联与显示弹出菜单

/*将弹出菜单与按钮关联,使按钮变为菜单按钮*/
void setMenu(QMenu *menu);

/*显示关联的弹出菜单*/
void showMenu();

8.2.2 按钮的使用

QPushButton的三种使用方式:

  1. 作为普通按钮, 可以显示文本信息和图标

  2. 设置 check 属性, 使其可以处于持续的被选中状态

  3. 关联一个菜单, 点击按钮菜单弹出

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    MyDialog md;

    // 创建一个Ui::Widget实例,并初始化UI元素
    Ui::MyDialog *ui = new Ui::MyDialog;
    ui->setupUi(&md);

    //普通按钮
    ui->normalButton->setIcon(QIcon(":/img/icon.png"));//设置按键图标
    ui->normalButton->setIconSize(QSize(70, 30));
    md.connect(ui->normalButton,&QPushButton::clicked,[](){qDebug()<<"i'm a normalButton";});//点击事件关联槽函数

    //受检按钮
    ui->checkedButton->setCheckable(true);
    md.connect(ui->checkedButton,&QPushButton::toggled,[](bool b1){qDebug()<<"state:"<<b1;});

    //关联菜单
    ui->menuButton->setText("xiao pig");
    QMenu* menu = new QMenu;
    QAction* act = menu->addAction("kaaide");
    menu->addAction("taoqide");
    menu->addAction("youzhide");
    menu->addAction("youyiside");
    ui->menuButton->setMenu(menu);
    md.connect(act,&QAction::triggered,[=]{qDebug()<<"laiwanma";});
    md.show();

    return app.exec();
}

8.3 QToolButton

8.3.1 常用API

        QToolButton 是Qt中的一个功能丰富的按钮控件,支持关联菜单和多种图标样式。

构造函数:创建一个QToolButton,可指定父控件。

QToolButton(QWidget *parent = nullptr);

菜单关联

//关联菜单到按钮
setMenu(QMenu *menu);

//获取关联的菜单
menu() const;

弹出模式:控制菜单的弹出行为。

//设置弹出模式(延时、按钮点击或立即)
setPopupMode(ToolButtonPopupMode mode)

//获取当前弹出模式。
popupMode() const

箭头图标:在按钮上显示箭头。

//设置箭头类型
setArrowType(Qt::ArrowType type)

//获取箭头类型
arrowType() const;

关联动作:用于美化按钮。 

//关联默认动作。
setDefaultAction(QAction *action);

//获取默认动作。
defaultAction() const;

图标和文本样式:控制按钮的显示样式。 

//设置显示样式。
setToolButtonStyle(Qt::ToolButtonStyle style);

//获取当前显示样式。
toolButtonStyle() const;

显示菜单:手动触发显示关联菜单。

//显示菜单。
showMenu();

8.3.2 按钮的使用

QToolButton这种类型的按钮, 有三种使用方式:

1. 作为普通按钮, 可以显示文本信息和图标

2. 设置check属性, 使其可以处于持续的被选中状态

3. 关联一个菜单, 点击按钮菜单弹出, 并且可以设置菜单的弹出方式

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    MyDialog md;

    // 创建一个Ui::Widget实例,并初始化UI元素
    Ui::MyDialog *ui = new Ui::MyDialog;
    ui->setupUi(&md);

    QMenu *menu = new QMenu;
    //QAction *act = new QAction(QIcon(":/img/icon.png"),"xx"); //设置功能栏图标
    //QAction *act1 = new QAction(QIcon(":/img/icon.png"),"xx");//设置功能栏图标
    QAction *act = new QAction("first");
    QAction *act1 = new QAction("second");
    menu->addAction(act);
    menu->addAction(act1);
    ui->toolButton->setMenu(menu);
    ui->toolButton->setPopupMode(QToolButton::InstantPopup); // 设置弹出模式
    /*绑定动作的触发信号和槽*/
    md.connect(act,&QAction::triggered,[=](){qDebug()<<"this is first";});
    md.connect(act1,&QAction::triggered,[=](){qDebug()<<"this is second";});
    md.show();

    return app.exec();
}
菜单的弹出方式必须设置

8.4 QRadioButton

        QRadioButton是Qt中的单选按钮,通常成组使用,允许在多个按钮中选一个。

        它继承自QAbstractButton类。需注意,已选中的单选按钮再次点击不会取消选中状态

8.4.1 常用API

        QRadioButton是Qt中的单选按钮,其构造函数可以接收标题和父对象作为参数,或者只接收父对象。若只提供父对象,则按钮无标题。

// 带有标题和父对象的单选按钮  
QRadioButton *radio1 = new QRadioButton("Option 1", parentWidget);  
  
// 仅带有父对象的单选按钮(无标题)  
QRadioButton *radio2 = new QRadioButton(parentWidget);

8.4.2 按钮的使用

        在同一窗口中,Qt会认为所有的单选按钮都属于同一组,如果需要多个单选按钮组,应该将他们放到不同的子窗口中。

        如果我们使用鼠标点击了某个单选按钮,按钮还是会发射出 clicked()信号。

QRadioButton点击会触发clicked信号

8.5 QCheckBox

8.5.1 常用API

        QCheckBox是Qt中的复选框,可单独或成组使用,允许同时选中多个。与单选按钮不同,复选框点击后可切换选中状态。它继承自QAbstractButton类。

        QCheckBox是Qt的复选框控件,可设选中未选中半选中状态,其中半选中适用于树状结构中的部分选中情况。

        构造函数可设文本和父对象。

        isTristate()判断是否为三态,setTristate()设置三态。

        setCheckState()checkState()分别用于设置和获取复选框状态。

QCheckBox *checkbox = new QCheckBox("Check me"); // 创建复选框  
checkbox->setTristate(true); // 设置为三态  
checkbox->setCheckState(Qt::PartiallyChecked); // 设置为半选中状态  
Qt::CheckState state = checkbox->checkState(); // 获取当前状态

/*
参数 state, 枚举类型 Qt::CheckState:
    - Qt::Unchecked	          --> 当前复选框没有被选中
    - Qt::PartiallyChecked    --> 当前复选框处于半选中状态, 部分被选中(三态复选框)
    - Qt::Checked	          --> 当前复选框处于选中状态*/
int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    MyDialog md;
     QVBoxLayout layout(&md);
    // 创建一个Ui::Widget实例,并初始化UI元素
    md.ui->checkBox->setTristate(true);
    md.ui->checkBox_2->setTristate(true);
    md.ui->checkBox_3->setTristate(true);

    md.ui->checkBox->setCheckState(Qt::PartiallyChecked);
    md.ui->checkBox_2->setCheckState(Qt::PartiallyChecked);
    md.ui->checkBox_3->setCheckState(Qt::PartiallyChecked);

    md.connect(md.ui->checkBox,&QCheckBox::clicked,[](){qDebug()<<"this is check1";});
    md.connect(md.ui->checkBox_2,&QCheckBox::clicked,[](){qDebug()<<"this is check2";});
    md.connect(md.ui->checkBox_3,&QCheckBox::clicked,[](){qDebug()<<"this is check3";});
    md.show();
    return app.exec();
}
半选中

8.5.2 树状复选框

        想做树状复选框需要使用到 TreeWidget 或者 TreeView组件。

        QTreeWidget是QTreeView的简化版,适合初学者构建简单树形结构。对于复杂、大数据量的树形结构,应选用QTreeView。

构造函数

        创建一个 QTreeWidget,可以指定父控件。

QTreeWidget(QWidget *parent = nullptr);

添加和获取项目

        你可以向 QTreeWidget 中添加 QTreeWidgetItem 对象作为节点,并可以通过各种方法获取这些项目。

// 添加根节点  
QTreeWidgetItem *rootItem = new QTreeWidgetItem(this);  
rootItem->setText(0, "Root");  
  
// 添加子节点  
QTreeWidgetItem *childItem = new QTreeWidgetItem(rootItem);  
childItem->setText(0, "Child");  
  
// 获取根节点  
QTreeWidgetItem *retrievedRoot = topLevelItem(0);  
  
// 获取子节点数量  
int childCount = rootItem->childCount();

// 通过索引获取第一个顶级项目
QTreeWidgetItem *rootItem = topLevelItem(0); 

//通过父项目获取子项目
QTreeWidgetItem *childItem = rootItem->child(0); // 获取 rootItem 的第一个子项目

//通过当前选中项获取
QTreeWidgetItem *currentItem = this->currentItem(); // 获取当前选中的项目

遍历所有项目
        你可以使用递归函数来遍历树中的所有项目。

void traverseTree(QTreeWidgetItem *item) {  
    if (item == nullptr) return;  
    // 处理当前项目  
    qDebug() << item->text(0); // 输出项目第0列的文本  
    // 递归处理子项目  
    for (int i = 0; i < item->childCount(); ++i) {  
        traverseTree(item->child(i));  
    }  
}  
  
// 使用方法:从每个顶级项目开始遍历  
for (int i = 0; i < topLevelItemCount(); ++i) {  
    traverseTree(topLevelItem(i));  
}

列操作

        QTreeWidget 支持多列显示,你可以添加、删除和修改列。

// 设置列数  
setColumnCount(2);  
  
// 设置列标题  
setHeaderLabels(QStringList() << "Column 1" << "Column 2");  
  
// 获取列数  
int columnCount = columnCount();

节点展开与折叠

        你可以控制树中节点的展开和折叠状态。

// 展开所有节点  
expandAll();  
  
// 折叠所有节点  
collapseAll();  
  
// 展开特定节点  
rootItem->setExpanded(true);

选择与当前项目

        QTreeWidget 提供了丰富的选择模型,允许你获取和设置当前选中的项目

// 获取当前选中的项目  
QTreeWidgetItem *currentItem = currentItem();  
  
// 设置为当前选中的项目
setCurrentItem(childItem);

排序与过滤

        QTreeWidget 支持对项目进行排序和过滤,以满足不同的数据展示需求。

// 启用排序  
setSortingEnabled(true);  
  
// 设置排序列和排序顺序,比较的是text内容
sortByColumn(0, Qt::AscendingOrder);

QTreeWidget设计,左边是效果右边是.ui

        通过给 TreeWidget设置一个 checkState属性,会自动呈现 CheckBox复选框的效果。 

这是setup_ui()里面生成的代码,注意生成的QTreewidgetItem是函数内局部变量,非成员变量

QTreeWidget绑定信号和槽函数

        QTreeWidget下面有QTreeWidgetItem,但是QTreeWidgetItem并不提供信号和槽函数。

        QTreeWidget提供 QTreeWidget::itemClicked(),作为 Item项的点击事件信号。

        QTreeWidget提供 QTreeWidget::onItemClicked(),响应 Item项的点击事件槽函数。//此处没用到

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    MyDialog md;
    QTreeWidgetItem *rootItem = md.ui->treeWidget->topLevelItem(0);
    md.ui->treeWidget->connect(md.ui->treeWidget,
                               &QTreeWidget::itemClicked,
                               [](QTreeWidgetItem *item, int column){
                                if(item->text(column)=="新建项目"){
                                    qDebug()<<"test ok";
                                }
                                ;});
    md.show();
    return app.exec();
}

第九章 容器类控件

9.1 QWidget

        QWidget是Qt中所有窗口和控件的基类,可独立使用或内嵌。为有序管理子窗口,可选QWidget作容器,并对其进行布局。

QWidget属性

         关于这些属性大部分都有对应的API函数, 在属性名前加 set 即可。

        在Qt中也可以根据实际需求选择其他类型的容器,

容器一览

9.2 Frame

        QFrame是QWidget的增强版,它继承了QWidget的所有属性,提供了额外的功能,如设置边框样式、宽度和阴影,使容器窗口更具定制性和视觉吸引力。

9.2.1 相关API

        QFrame是Qt中的一个类,它提供了丰富的边框样式和阴影效果。可以设置边框形状如NoFrame、Box、Panel等,并可选阴影样式如Plain、Raised、Sunken。同时,还可以调整边框线宽和中线宽来定制外观。

// 创建QFrame对象  
QFrame *frame = new QFrame;  
  
// 设置边框形状为面板  
frame->setFrameShape(QFrame::Panel);  
  
// 设置边框阴影为凸起  
frame->setFrameShadow(QFrame::Raised);  
  
// 设置边框线宽度为2  
frame->setLineWidth(2);  
  
// 设置中线宽度为1(影响阴影显示)  
frame->setMidLineWidth(1);
Frame本身就继承自QWidget,可直接qFrame.show()

9.2.2 属性设置

        这个类的属性并不多, 都是关于边框的设置的。

9.3 Group Box

        QGroupBox类的基类是QWidget, 在这种类型的窗口中可以绘制边框、给窗口指定标题, 并且还支持显示复选框。

9.3.1 相关API

// 创建一个QGroupBox对象,并设置标题  
QGroupBox *groupBox = new QGroupBox("My Group Box");  
  
// 设置组框为可选中状态  
groupBox->setCheckable(true);  
  
// 设置组框标题的对齐方式为居中对齐  
groupBox->setAlignment(Qt::AlignCenter);  
  
// 检查组框的选中状态  
bool isChecked = groupBox->isChecked();  
  
// 设置组框的选中状态为true  
groupBox->setChecked(true);

9.3.2 属性设置

        关于组框的属性对应的就是上边介绍的那几个API函数, 属性窗口如下:

        组框中的flat属性没有对应的API函数, 只能在属性窗口中设置, 它控制的是窗口边框的绘制方式, 如果打开该属性, 组框的边框就消失了。

QGroupBox的flat边框绘制效果

9.4 Scroll Area

        QScrollArea是Qt中的滚动容器,允许动态添加或移除子窗口。

        主要API有setWidget()用于添加子窗口takeWidget()用于移除并返回被删除的子窗口。同时,可以设置子窗口的对齐方式和是否自动调节大小。

// 创建QScrollArea对象  
QScrollArea *scrollArea = new QScrollArea;  
  
// 将子窗口添加到滚动区域  
scrollArea->setWidget(QWidget::childWidget);  
  
// 设置子窗口的对齐方式为居中  
scrollArea->setAlignment(Qt::AlignCenter);  
  
// 允许滚动区域自动调整子窗口大小  
scrollArea->setWidgetResizable(true);  
  
// ... 后续代码,如添加布局、显示窗口等  
  
// 在需要时,可以从滚动区域中移除子窗口  
QWidget *removedWidget = scrollArea->takeWidget();  
// 注意:此时removedWidget指向之前添加的子窗口,且它已被从滚动区域中移除
将QWitget添加到ScorllArea后,需使用scr.show(),也就是最上层的 QWitget才能正常显示

9.4.2 属性设置

9.5 Tool Box

        QToolBox是一个工具箱控件,可存储多个子窗口,实现抽屉效果。

9.5.1 相关API

构造函数

QToolBox(QWidget *parent = nullptr,            //父指针
     Qt::WindowFlags f = Qt::WindowFlags());   //窗口标志,设置外观和行为

信号

        currentChanged(int index):                 当前选项卡变化时发射。

槽函数

        setCurrentIndex(int index):                 设置当前显示的选项卡索引。

        setCurrentWidget(QWidget *widget): 设置当前显示的子窗口对象。

QToolBox *toolBox = new QToolBox(this);  
QWidget *widget1 = new QWidget();  
QWidget *widget2 = new QWidget();  
  
// 添加选项卡  
toolBox->addItem(widget1, QIcon("icon1.png"), "Tab 1");  
toolBox->addItem(widget2, "Tab 2");  
  
// 插入选项卡  
toolBox->insertItem(1, new QWidget(), QIcon("icon3.png"), "Inserted Tab");  
  
// 移除选项卡  
toolBox->removeItem(2);  
  
// 设置选项卡属性  
toolBox->setItemEnabled(0, false);  
toolBox->setItemIcon(0, QIcon("newIcon.png"));  
  
// 获取当前选项卡和子窗口  
int currentIndex = toolBox->currentIndex();  
QWidget *currentWidget = toolBox->currentWidget();  
  
// 连接信号和槽  
connect(toolBox, &QToolBox::currentChanged, [](int index){  
    qDebug() << "Current index changed to:" << index;  
});  
  
// 设置当前显示的选项卡  
toolBox->setCurrentIndex(1);  
toolBox->setCurrentWidget(widget2);
/*拖动设计好原始界面,再代码改*/
int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    MyDialog md;

    /*工具盒中选项卡的内容可以通过标签或者其他容器添加*/
    md.ui->toolBox->setItemIcon(0,QIcon(":/img/icon.png"));
    QLabel* label1 = new QLabel("工具选项1", &md);
    QLabel* label2 = new QLabel("工具选项2", &md);
    QLabel* label3 = new QLabel("工具选项3", &md);

    // 向工具盒中添加标签
    md.ui->toolBox->addItem(label1, "选项1");
    md.ui->toolBox->addItem(label2, "选项2");
    md.ui->toolBox->addItem(label3, "选项3");
    md.connect(md.ui->toolBox,&QToolBox::currentChanged,[](int index){qDebug()<<"this is"<<index;});
    md.show();
    return app.exec();
}
toolBox下面有 Item,实现抽屉效果,点击 Item会触发 itemchange信号

9.5.2 属性设置

9.6 Tab Widget

        QTabWidget是Qt框架中的带标签页的窗口组件,用于管理多个子窗口。

        每个标签页都可以包含不同的窗口部件,例如文本编辑器、图片查看器、表格或其他自定义窗口部件。

9.6.1 相关API

构造函数

QTabWidget::QTabWidget(QWidget *parent = Q_NULLPTR);

选项卡管理

/*添加选项卡*/
int addTab(QWidget *page,    // 指向要添加的QWidget页面的指针  
           const QString &label);  // 标签的文本内容  
  
int addTab(QWidget *page,    // 指向要添加的QWidget页面的指针  
           const QIcon &icon,  // 要显示的图标  
           const QString &label);  // 标签的文本内容

/*插入选项卡*/
int insertTab(int index, QWidget *page, const QString &label);  
int insertTab(int index, QWidget *page, const QIcon &icon, const QString &label);

/*删除选项卡*/
void removeTab(int index);

/*清空所有选项卡*/
void clear();

选项卡信息查询

//选项卡数量
int count() const;

//当前选项卡索引
int currentIndex() const;

//当前选项卡窗口
QWidget *currentWidget() const;

//获取特定索引的选项卡窗口:
QWidget *widget(int index) const;

信号

/*当前页索引改变时发出*/
[signal] void QTabWidget::currentChanged(int index);//新当前页索引,无新索引时为-1

/*用户单击选项卡时发出*/
[signal] void QTabWidget::tabBarClicked(int index);//被单击选项卡的索引,无选项卡时为-1

/*用户双击选项卡时发出*/
[signal] void QTabWidget::tabBarDoubleClicked(int index);//被双击选项卡的索引,无选项卡时为-1。

/*用户单击选项卡关闭按钮时发出*/
[signal] void QTabWidget::tabCloseRequested(int index);//选项卡索引,无时-1

槽函数

/*设置显示选项卡对应索引的标签页*/
[slot] void QTabWidget::setCurrentIndex(int index);//选项卡索引

/*设置显示选项卡中子窗口的内容*/
[slot] void QTabWidget::setCurrentWidget(QWidget *widget);//子窗口
TabWidget选项卡里面可以放如treeWidget等各种组件

9.6.2 属性设置

9.7 Stacked Widget

        QStackedWidget是一个栈类型窗口,可存储多个子窗口,但仅显示一个

9.7.1 相关API

构造函数

QStackedWidget::QStackedWidget(QWidget *parent = Q_NULLPTR);

公共成员函数

//添加子窗口,返回索引
int addWidget(QWidget *widget);

//插入子窗口到指定索引
int insertWidget(int index, QWidget *widget);

//删除子窗口
void removeWidget(QWidget *widget);

//子窗口数量
int count() const;

//当前显示子窗口索引
int currentIndex() const;

//当前显示子窗口指针
QWidget *currentWidget() const;

//根据索引获取子窗口指针
QWidget *widget(int index) const;

//根据子窗口指针获取索引
int indexOf(QWidget *widget) const;

信号

//切换显示子窗口时发射,带索引
[signal] void currentChanged(int index);

//子窗口被删除时发射,带索引
[signal] void widgetRemoved(int index);

槽函数

//根据索引设置当前显示子窗口
[slot] void setCurrentIndex(int index);

//根据指针设置当前显示子窗口
[slot] void setCurrentWidget(QWidget *widget);

9.7.2 属性设置

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

大象荒野

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

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

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

打赏作者

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

抵扣说明:

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

余额充值