【Qt】Qt控件 | QWidget

目录

一. enabled——是否可用

二. geometry——几何位置

window frame

三. windowTitle——窗口标题

四. windowIcon——窗口图标

​qrc文件

五. windowOpacity——透明度 

六. cursor——光标

自定义光标

七. font——字体

八. toolTip——提示栏

九. focusPolicy——焦点策略(选中策略)

十.  styleSheet——样式表


 

Widget(组件),是Qt的核心概念,常叫做“控件”。控件是构成图形化界面的基本要素。

常见的控件有:按钮,输入框,下拉框,窗口等

在开发图形化界面时,为了布局和功能,控件有多种属性和管理对应属性的API

在Qt Designer中,已经有简便我们开发的图形化界面

  • 左侧是Qt提供的所有的控件,可通过拖拽到程序界面的方式添加控件
  • 选中一个控件,右下方会显示该控件的objectName,和其属性。后续使用代码开发时,可以通过ui->objectName的方式访问到该控件对象

一. enabled——是否可用

控件的首要目的是让用户使用,接受用户事件。而enabled属性是标识该控件是否可用

  • 不可用,即“禁用”指的是该控件不能接收任何用户的输入事件,并且外观上往往是灰色
  • 如果一个widget被禁用,则该widget的子元素也被禁用。例如一个窗口被禁用了,那么该窗口上的按钮,输入框等也会被禁用
API说明
isEnabled()获取该控件的可用状态
setEnabled()设置该控件是否可用,true表示可用,false表示禁用

 示例:

通过拖拽添加两个按钮:pushButton和pushButton_enabled(各自的objectName)

接着右键控件,选中“转到槽”,再选择要关联的信号——clicked。

该部分知识设计信号与槽,可参看【Qt】信号与槽

接着就可以在代码编写界面实现具体的槽函数。widget.cpp代码如下:

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
}

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


void Widget::on_pushButton_clicked()
{
    qDebug() << "当前按钮可用";//pushButton的打印测试
}

void Widget::on_pushButton_enabled_clicked()
{
    bool enabled = ui->pushButton->isEnabled();
    if(enabled)
        ui->pushButton->setEnabled(false);//设置不可用
    else
        ui->pushButton->setEnabled(true);//设置可用
}

不可用的控件一般为灰色,按钮点击效果如下: 

在Qt Designer中也可以通过右下方的控件属性改变控件的可用状态

二. geometry——几何位置

在Qt中,界面的分布使用左手坐标系,如图所示

描述一个控件所在界面位置,通过这四个属性——x,y,height,width

Qt将这四个属性封装在了QRect(矩阵)中

API说明
geometry()获取到控件的位置和尺寸.返回值是一个QRect
setGeometry(QRect)设置控件的位置和尺寸,通过QRect设置
setGeometry(int x, int y, int width, int height)设置控件的位置和尺寸,通过四个属性分别设置

示例:通过四个按钮,控制一个按钮的上下左右移动

界面布局,即各按钮的objectName如下

 控制移动的四个按钮都关联clicked信号,各自槽函数实现如下:

void Widget::on_pushButton_up_clicked()
{
    QRect rect = ui->pushButton->geometry();
    rect.setY(rect.y() - 5);//向上移动5个像素点
    ui->pushButton->setGeometry(rect);
}

void Widget::on_pushButton_down_clicked()
{
    QRect rect = ui->pushButton->geometry();
    rect.setY(rect.y() + 5);//向下移动5个像素点
    ui->pushButton->setGeometry(rect);
}

void Widget::on_pushButton_left_clicked()
{
    QRect rect = ui->pushButton->geometry();
    rect.setX(rect.x() - 5);//向左移动5个像素点
    ui->pushButton->setGeometry(rect);
}

void Widget::on_pushButton_right_clicked()
{
    QRect rect = ui->pushButton->geometry();
    rect.setX(rect.x() + 5);//向右移动5个像素点
    ui->pushButton->setGeometry(rect);
}

实际程序运行效果如下:

实际程序运行发现,该方式设置的控件位置,不仅会改变控件对象的左上角位置,还可以改变控件的height和width。

如果要想实现控件对象的平移,相应槽函数可以如下编写

void Widget::on_pushButton_up_clicked()
{
    QRect rect = ui->pushButton->geometry();
    //向上移动5个像素点
//    rect.setY(rect.y() - 5);
//    ui->pushButton->setGeometry(rect);
    ui->pushButton->setGeometry(rect.x(), rect.y() - 5, rect.width(),rect.height());
}

void Widget::on_pushButton_down_clicked()
{
    QRect rect = ui->pushButton->geometry();
    //向下移动5个像素点
//    rect.setY(rect.y() + 5);
//    ui->pushButton->setGeometry(rect);
    ui->pushButton->setGeometry(rect.x(), rect.y() + 5, rect.width(),rect.height());
}

void Widget::on_pushButton_left_clicked()
{
    QRect rect = ui->pushButton->geometry();
    //向左移动5个像素点
//    rect.setX(rect.x() - 5);
//    ui->pushButton->setGeometry(rect);
    ui->pushButton->setGeometry(rect.x() - 5, rect.y(), rect.width(),rect.height());
}

void Widget::on_pushButton_right_clicked()
{
    QRect rect = ui->pushButton->geometry();
    //向右移动5个像素点
//    rect.setX(rect.x() + 5);
//    ui->pushButton->setGeometry(rect);
    ui->pushButton->setGeometry(rect.x() + 5, rect.y(), rect.width(),rect.height());
}

程序运行效果如下:

window frame

实际上Qt的QWidget的位置信息,有两个参照物。我们在Qt Designer中操作的界面是不包含标题栏和边框的

边框和标题栏都是Qt帮我们自动生成的,这就是window frame,是操作系统提供的,有特定API,在Qt中,window frame是在QWidget的构造函数中创建的

所以相对位置就有两个参照物, 包含window frame的和不包含window frame的

上述的geometry()和setGeometry()就是不包含window framede的


包含window frame

API说明
frameGeometry()获取到控件的位置和尺寸.返回值是一个QRect,包含window frame
setFrameGeometry(QRect)设置控件的位置和尺寸,通过QRect设置
setFrameGeometry(int x, int y, int width, int height)设置控件的位置和尺寸,通过四个属性分别设置

还有直接获取位置信息的方法,其返回值也是包含window frame的位置信息

ui->pushButton->x();
ui->pushButton->y();
ui->pushButton->width();
ui->pushButton->height();

 而通过geometry返回的QRect获取的位置信息就不包含window frame的

ui->pushButton->geometry().x();
ui->pushButton->geometry().y();
ui->pushButton->geometry().width();
ui->pushButton->geometry().height();

三. windowTitle——窗口标题

windowTitle顾名思义,就是窗口的标题

API说明
setWindowTitle设置当前控件的窗口标题

注意:只有最外层的窗口设置窗口标题才会有效果,如果是窗口中一个按钮调用setWindowTitle方法,是没有任何效果的

四. windowIcon——窗口图标

窗口图标就是图形化程序左上角的图标,任务列表中也会显示窗口图标,例如:

API说明
windowIcon()获取控件的窗口图标,返回QIcon对象
setWindowIcoen(const QIcon& icon)设置控件的窗口图标

setWindowIcon和setWindowTitle一样,只对最外层/顶层的窗口有效 

API说明
QIcon(const char*)将该路径的图片转为二进制,构造出QIcon对象

示例:

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

#include <QIcon>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    QIcon icon(R"(C:\Users\Lenovo\Desktop\code\7.jpg)");//使用原始字符串字面量
    this->setWindowIcon(icon);
}

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

 qrc文件

上述构造windowIcon使用的图片是绝对路径,这是不合理的

  1. 用户不一定有该路径,比如绝对路径是F:/image/1.jpg,但如果用户只有C盘和D盘,那该路径就不存在
  2. 如果该路径的图片丢失,则无法加载窗口图标

使用相对路径的方式,可以保证路径存在

假设基准目录是D:/,给定的相对路径是./image/1.jpg  =》 在基准目录下找image目录,再在image目录中找1.jpg

 .  表示当前目录  ..表示上级目录

对于Qt程序来说,当前工作可能是变化的。比如通过Qt Creator运行的程序,当前工作目录是项目的构建目录;直接双击.exe运行,工作目录则是exe所在目录

所谓构建目录,是和Qt项目并列的,专门用来放生成的临时文件和最终exe的目录


但相对路径的方式无法解决路径图片丢失的问题,Qt提供的解决方法是qrc文件

qrc文件是一种xml格式的资源配置文件,用xml(标签)记录硬盘上的文件和对应指定的资源名称,应用程序通过资源名称来访问这些资源

在Qt开发中,可以通过将资源文件添加到项目中来方便地访问和管理这些资源,这些资源文件可以位于qrc文件所在目录的同级或其子目录下

在构建程序的过程中,Qt会把资源文件的二进制数据转成cpp代码,编译到exe中,从而使依赖资源变得“路径无关”


使用qrc文件设置窗口图标

1. 点击文件,选择新建文件

2. 选择“文件和类”中的Qt 

3. 选择Qt Resource File

4. 填写文件名,路径名 ,注意文件名和路径名都不要包含中文和特殊符号

版本控制根据自己的项目,跟创建项目时选择一致即可

Qt Creator为我们提供了qrc文件的图形化开发界面

5. 在qrc编辑器中,添加前缀(prefix)

所谓的前缀,可以理解为“目录” . 该前缀决定了后续我们如何在代码中访问资源。

此处我添加了一个"/"前缀

6. 选择添加的图片——Add Files

Qt要求添加的文件必须是在qrc文件的同级目录,或者同级目录的子目录中,所以需要提前把图片复制到该目录下

如果选择其他目录下的图片,Qt不允许添加

如下是添加成功的效果,然后我们就可以在代码中使用该图片

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

#include <QIcon>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    QIcon icon(":/7.jpg");//:开头表示从qrc中获取资源,/是我们设置的前缀,7.jpg是资源名
    this->setWindowIcon(icon);
}

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

运行程序后,在项目的构建目录下,我们可以看到目录多了一个qrc_XXX.cpp和qrc_XXX.o文件。这两个文件都是Qt的元编程生成的:Qt基于qrc文件生成C++代码(qrc_XXX.cpp),在程序编译时一同编译(qrc_XXX.o),最后链接生成.exe文件

其中,图片是被转换成了一个字符数组,内置在程序代码中

 如此就既不需要关心图片资源的路径问题,也不需要关心图片丢失的问题

缺点:qrc文件是通过将图片资源转化为字符数组的形式存储在程序中,这势必会增加程序的大小,导致程序的编译,加载,运行更消耗资源。

五. windowOpacity——透明度 

windowOpacity用于控制控件的透明度,其数值为0.0 ~ 1.0,数值越大越不透明。0.0表示全透明,1.0表示完全不透明

如此的数值含义,理解为不透明度更合适,数值越大越不透明

API说明
windowOpacity()返回float类型,控件的不透明度
setWindowOpacity(float n)设置控件的不透明度

示例:添加两个按钮,一个增大不透明度,一个减小不透明度 

1. 使用Qt Designer添加按钮,设置objectName

2. 关联信号和槽 

void Widget::on_pushButton_add_clicked()
{
    //增加不透明度
    float opacity = this->windowOpacity();
    if(opacity >= 1.0)
        return;
    opacity += 0.1;
    this->setWindowOpacity(opacity);
}

void Widget::on_pushButton_sub_clicked()
{
    //减小不透明度
    float opacity = this->windowOpacity();
    if(opacity <= 0.0)
        return;
    opacity -= 0.1;
    this->setWindowOpacity(opacity);
}

3. 运行程序,点击“-”,降低不透明度

六. cursor——光标

在Qt中,我们可以通过设置鼠标移动到不同控件,显示不同光标来增加程序的丰富性和美观

API说明
cursor()

获取当前控件的光标属性,返回QCursor对象

当鼠标悬停在该控件上,就会显示出对应形状

setCursor(const QCursor &cursor)设置该控件的光标,仅鼠标停留在该控件上生效
QGuiApplication::setOverrideCursor(const QCursor &cursor)设置全局光标的形状,整个程序的控件都会生效,覆盖各自控件setCursor设置的内容

图形化开发 

直接通过属性的cursor选择

代码编写 

 Qt封装了一个枚举类,枚举了内置的光标类型

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

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    QCursor cursor(Qt::WaitCursor);
    ui->pushButton->setCursor(cursor);
}

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

自定义光标

为了让程序更加美观,我们也可以自定义光标,将图标做成光标

图片导入项目的方法也是使用qrc文件的方式,此处不过多赘述

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

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    QPixmap pixmap(":/candy.png");//位图对象
    pixmap = pixmap.scaled(40, 40);//对图片进行缩放——尺寸40 * 40像素
    QCursor cursor(pixmap, 0, 0);//构造光标
    ui->pushButton->setCursor(cursor);//设置光标
}

Widget::~Widget()
{
    delete ui;
}
  1. QCursor构造函数的后两个参数是指明热点的位置,热点就是光标实际点击的点,此处设置的位置是相对光标的左上角的位置,(0, 0)就代表光标的最左上角
  2. QPixmap的scaled函数不是对原本图标的改变,是返回一个改变后的图标的副本

七. font——字体

Qt封装了QFont类,实现对控件中字体的管理,其属性包括字体家族,字体大小,字体粗细等等

属性说明
family字体家族,如“楷体”,“宋体”,“微软雅黑”等
pointSize字体大小
weight字体粗细,以数值方式表示粗心程度取值范围[0,99],数值越大,字体越粗
bold是否加粗,bool值,设置true,相当于weight = 75,false相当于weight = 50
italic是否倾斜
underline是否有下划线
strikeOut是否带有删除线

相关API

API说明
font()获取当前控件的字体信息,返回QFont对象
setFont(const QFont &font)设置当前控件的字体信息

示例:

图形化开发

使用Qt Designer可以直接在属性处选择字体信息

代码编写 

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

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    QFont font = ui->label->font();//获取字体信息
    font.setBold(true);//加粗
    font.setFamily("宋体");//设置字体家族
    font.setPointSize(10);//设置大小
    font.setItalic(true);//设置倾斜
    ui->label->setFont(font);
}

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

效果如下

八. toolTip——提示栏

当用户将鼠标悬置在控件上方时,我们可以添加提示栏来告诉用户如何使用该控件或者显示一些信息。例如在编译器中,我们将鼠标悬停在一个方法上,编译器就会弹出一个窗口显示其方法声明,这就是提示栏

相关API

API说明
toolTip()返回提示栏的文本,返回值为QString
setToolTip(const QString &string)设置提示栏文本
toolTipDuration()返回提示栏持续时间,int类型,单位为毫秒
setToolTipDuration(const int msec)试着提示栏持续时间,单位为毫秒。传-1代表提示栏不消失

示例:

图形化开发

可直接设置toolTip文本和toolTipDuration持续时间

代码编写

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

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    ui->pushButton_yes->setToolTip("Yes按钮");
    ui->pushButton_yes->setToolTipDuration(-1);
    ui->pushButton_no->setToolTip("No按钮");
    ui->pushButton_no->setToolTipDuration(4000);
}

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

九. focusPolicy——焦点策略(选中策略)

所谓“焦点”,指的是能选中这个元素的方法,比如键盘操作。

“”焦点“”对于输入框、单选框、复选框等控件很重要

常见的焦点策略(选中策略)有点击和Tab

相关API 

API说明
focusPolicy()获取该控件的focusPolicy,返回值类型为Qt::FocusPolicy
setFocusPolicy(const Qt::FocusPolicy)设置该控件的focusPolicy

Qt::FocusPolicy是Qt内置的一个枚举类,取值如下:

  • Qt::NoFocus:该控件不会接受键盘焦点,不可被选中
  • Qt::TabFocus:该控件可通过Tab键接受焦点,可通过Tab选中
  • Qt::ClickFocus:该控件可通过鼠标点击接受焦点,看通过点击选中
  • Qt::StrongFocus:该控件可通过Tab键和点击选中
  • Qt::WheelFocus:该控件可通过Tab键,点击,鼠标滚轮选中

示例:

图形化开发

代码编写

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

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    ui->lineEdit->setFocusPolicy(Qt::StrongFocus);
}

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

十.  styleSheet——样式表

Qt可以通过CSS设置widget样式

CSS(Cascading Style Sheets 层叠样式表) 是网页前端技术,主要就是用来描述界面的样式

所谓“样式”,包括但不限于大小、位置、颜色、间距、字体、背景、边框等

CSS中可以设置的样式属性非常多,基于这些属性,Qt可以支持其中一部分,称为QSS(Qt Style Sheets)。具体的支持情况可以参看Qt文档中"Qt Style Sheets Reference"章节 

示例:设置文本样式

图形化开发

(1). 在Qt Designer添加一个Label标签,右键,选择“改变样式表”,使用CSS设置样式

语法同CSS,使用键值对的方式设置样式,其中键和值之间使用  分隔。键值对之间使用分隔

Qt Designer只能对样式的基本格式进行校验,不能检测出哪些样式不被Qt支持

比如text-align:center,这样的文本居中操作,就无法支持

 代码实现

API说明
styleSheet()返回该控件的样式表,返回值为QString
setStyleSheet(const QString &styleSheet)设置样式表,使用QSS风格字符串
ui->label->setStyleSheet("font-family:微软雅黑; font-size:30px; ");
<think>好的,我现在需要帮助用户解决如何在QtQWidget中集成并显示OSG场景的问题。根据用户提供的引用资料,我需要结合这些信息来构建一个清晰的步骤指南。 首先,用户提到了引用[2]中提到的在Qt中创建OSG项目的初步实现,包括使用QOpenGLWidget拖入界面并配置OSG环境。这表明用户可能已经尝试过一些基本步骤,但可能遇到问题。我需要详细说明环境配置,比如包含路径、库链接和依赖项,这很关键,因为OSG和Qt的集成需要正确的编译设置。 接下来,引用[3]中提到使用osgQt::QWidgetImage将Qt界面集成到OSG场景中,但用户的问题是在QWidget中显示OSG,可能需要反过来,将OSG嵌入到QtQWidget里。根据OSG的官方osgQt项目(引用[1]),可能需要使用osgQt的库来实现这一点。用户之前可能尝试过旧版本的osgQt,所以需要确认是否更新到最新版本,并解决可能的兼容性问题。 然后,我需要考虑如何将OSG的视图器(Viewer)嵌入到Qt的窗口部件中。根据示例代码,可能需要继承QWidget并重写某些事件处理函数,比如resizeEvent和timerEvent,以确保OSG正确渲染并响应窗口变化。这里需要确保OSG的渲染表面与Qt的OpenGL上下文正确关联,避免出现黑屏或渲染错误。 另外,用户提供的Python示例代码是关于快速排序的,但当前问题涉及C++Qt和OSG,所以需要提供C++的代码示例。例如,在Qt项目中创建一个自定义的QWidget,使用osgQt::GLWidget来承载OSG场景,并设置相机和视图。 还需要注意依赖项的管理,比如确保Qt和OSG都使用相同的编译器(如MSVC2019),以及是否正确链接了osgQt库。引用[2]中的配置步骤可能包括项目文件(.pro或CMake)中的设置,需要详细说明。 最后,用户可能遇到的常见问题包括编译错误、运行时崩溃或渲染问题,需要给出调试建议,比如检查OpenGL上下文是否共享,或者查看日志信息。同时,引用[3]提到的集成Qt界面到OSG中的方法可能与当前需求相反,需要明确区分嵌入方向。 总结步骤应该是:环境配置、创建自定义Widget、初始化OSG场景、整合到Qt中,并处理事件循环。确保代码示例正确,并参考用户提供的引用中的有效方法,同时指出可能的陷阱和解决方案。</think>### 分步指南:在QtQWidget中集成OSG场景 #### 1. **环境配置** - **安装依赖**:确保Qt(MSVC2019版本)和OSG使用**相同编译器**,并正确编译`osgQt`模块[^1][^2]。 - **项目配置**(以Qt Creator为例): ```pro # .pro文件中添加路径和库 INCLUDEPATH += $$OSG_INCLUDE_DIR $$OSGQT_INCLUDE_DIR LIBS += -L$$OSG_LIB_DIR -losg -losgQt -losgGA -losgViewer LIBS += -L$$OSG_PLUGINS_DIR ``` 需替换`OSG_INCLUDE_DIR`、`OSG_LIB_DIR`等变量为实际路径。 #### 2. **创建自定义QWidget容器** ```cpp #include <osgQt/GLWidget> class OSGWidget : public osgQt::GLWidget { public: OSGWidget(QWidget* parent = nullptr) : osgQt::GLWidget(parent) { // 初始化OSG Viewer _viewer = new osgViewer::Viewer; _viewer->setCamera(createCamera()); // 添加场景根节点(示例使用一个立方体) osg::ref_ptr<osg::Geode> geode = new osg::Geode; geode->addDrawable(new osg::ShapeDrawable(new osg::Box())); _viewer->setSceneData(geode); // 启动定时器用于连续渲染 startTimer(16); // ~60 FPS } protected: void timerEvent(QTimerEvent*) override { if (_viewer->done()) return; _viewer->frame(); } void resizeEvent(QResizeEvent* event) override { // 更新相机视口 _viewer->getCamera()->setViewport(0, 0, event->size().width(), event->size().height()); } private: osg::Camera* createCamera() { osg::Camera* camera = new osg::Camera; camera->setViewport(0, 0, width(), height()); camera->setProjectionMatrixAsPerspective(30.0, static_cast<double>(width())/height(), 1.0, 100.0); camera->setGraphicsContext(getGraphicsWindow()); return camera; } osg::ref_ptr<osgViewer::Viewer> _viewer; }; ``` #### 3. **在Qt主窗口中嵌入OSGWidget** ```cpp // MainWindow.cpp #include "OSGWidget.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { QWidget* centralWidget = new QWidget(this); QHBoxLayout* layout = new QHBoxLayout(centralWidget); layout->addWidget(new OSGWidget()); // 将OSGWidget加入布局 setCentralWidget(centralWidget); } ``` #### 4. **关键问题处理** - **OpenGL上下文共享**:若需要多窗口渲染,需通过`QSurfaceFormat`设置共享上下文: ```cpp QSurfaceFormat format; format.setVersion(3, 3); format.setProfile(QSurfaceFormat::CoreProfile); format.setShareOpenGLContexts(true); // 启用上下文共享 OSGWidget::setDefaultFormat(format); ``` - **事件传递**:重写`event()`函数将Qt事件传递给OSG: ```cpp bool OSGWidget::event(QEvent* event) { if (_viewer && _viewer->getEventQueue()) _viewer->getEventQueue()->windowResize(0, 0, width(), height()); return osgQt::GLWidget::event(event); } ``` ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值