嵌入式 QT 上位机开发

一、QT 上位机开发概述

嵌入式 QT 上位机开发在当今的科技领域中具有至关重要的地位。它的广泛应用场景涵盖了多个行业,从工业自动化到消费电子,从医疗设备到智能家居等。

在工业自动化领域,嵌入式 QT 上位机可以实现对生产线上各种设备的实时监控和控制。通过与嵌入式设备的通信,上位机能够收集设备的运行状态、生产数据等信息,并将其以直观的图形界面展示给操作人员。例如,在汽车制造工厂中,上位机可以监控机器人的工作状态、生产线的进度等,提高生产效率和质量。

在消费电子领域,QT 上位机也发挥着重要作用。例如,智能手表、智能家居设备等的管理软件通常是基于 QT 开发的上位机。这些上位机可以与设备进行通信,实现数据同步、设置参数等功能,为用户提供便捷的操作体验。

在医疗设备领域,嵌入式 QT 上位机可以用于医疗设备的监控和数据分析。例如,心电图仪、血压计等设备的上位机可以实时显示患者的生理数据,并进行数据分析和存储,为医生的诊断提供依据。

总之,嵌入式 QT 上位机开发在各个领域都有着广泛的应用,它不仅提高了设备的智能化水平和操作便捷性,还为数据的收集、分析和处理提供了强大的工具。

二、开发环境搭建

(一)QT Creator 安装

  1. 注册 QT 账号,用于安装过程。

首先,我们需要访问Qt | 软件开发全周期的各阶段工具注册一个 QT 账号。注册过程比较简单,分别输入自己的电子邮件、设置密码、确认密码以及验证码之后勾选接收并创建 Qt 账户。这里要提醒大家一定一定要把自己的邮箱密码记下来,很容易忘,Qt 密码一般要求是特殊字符 + 字母 + 数字。

  1. 下载并安装 Windows 版本的 Qt Creator,选择合适的组件。

在 Windows 上进行开发时,我们安装 Windows 版本的 Qt Creator。下载地址为https://download.qt.io/new_archive/qt/5.11/5.11.3/,下载得到 qt-opensource-windows-x86-5.11.3.exe。然后双击安装,在安装过程的第二步需要输入账号密码,把我们上面注册好的账号密码填入即可。接下来还需要选择安装组件,根据自己的需求进行选择安装。例如,“Qt 5.9” 分类下的开发组件中,MinGW 5.3.0 32 bit 是编译器模块,对于本教程使用 MinGW 编译的情况,必须安装。而对于 UWP、MSVC、Android 等组件,如果不是开发相应类型的应用程序,就可以直接忽略。Qt 的附加模块大部分建议安装,这些附加模块括号里的 TP 是指技术预览模块,还处在功能测试阶段,不是正式版模块;附加模块括号里的 Deprecated 是指抛弃的旧模块,兼容旧代码使用的,一般用不到。这些附加模块读者可以选择部分或都勾选了安装,占用空间不大。

  1. 创建桌面快捷方式,验证安装是否成功。

安装完成之后我们桌面上并没有 Qt Creator 的快捷方式,需要自己创建。找到 Qt Creator 的安装路径,然后把 Qt Creator 发送到桌面快捷方式即可。

(二)项目创建与验证

创建简单的 C++ 工程,验证 Qt Creator 安装成功。我们可以通过以下步骤进行验证:首先打开 Qt Creator,点击 “新建项目”,选择 “C++” 作为项目类型,并选择一个简单的模板,如 “Qt Console Application”。输入项目名称和保存路径,然后点击 “下一步”。在接下来的界面中,根据需要选择一些基本的配置选项,如编译器等。最后点击 “完成” 创建项目。如果项目能够成功创建并且可以编译运行,输出一些简单的结果,那么就说明 Qt Creator 安装成功了。

三、上位机设计与实现

(一)工程创建与基类选择

新建 serial_led 工程时选择 QWidget 类作为基类是有原因的。QT 有三种基类,分别是 QMainWindow 类、QWidget 类和 QDialog 类。QMainWindow 类提供一个带有菜单条、工具条和一个状态条的主应用程序窗口;QWidget 类是所有用户界面对象的基类,窗口部件是用户界面的一个基本单元,它从窗口系统接收鼠标、键盘和其他消息,并在屏幕上绘制自己;QDialog 类是对话框窗口的基类,主要用于短期任务和用户进行短期通讯的顶级窗口,可以是模态对话框或者是非模态对话框。在本次工程中,我们选择 QWidget 类,因为它更适合我们简单的上位机需求。

(二)界面设计

  1. 使用 Qt Designer 进行可视化界面设计是一种高效的方式。我们可以从左侧的控件区轻松地将所需的控件拖动到界面编辑区中。例如,可以添加按钮、文本框、标签等常用控件,通过合理布局,使界面更加美观和易用。
  1. 对于波特率下拉框,我们需要双击设置一些备选配置。这样用户在选择波特率时就有了更多的选项。在设置过程中,可以根据实际需求添加不同的波特率值,如 9600、115200 等常见的串口通信波特率。同时,我们还可以通过调整布局组件,如水平布局、垂直布局等,来优化界面的显示效果。此外,给控件命名也是非常重要的一步。有意义的名字不仅利于编写易懂的代码,还能提高开发效率。比如,我们可以将串口选择控件命名为 “serialPortComboBox”,将打开串口按钮命名为 “openSerialPortButton” 等。
  1. 在界面设计中,我们可以设置接收框为只读,以防止用户误操作。同时,为了使界面更加美观和合理,可以进行界面布局并设置最小宽度。这样可以确保在不同分辨率的屏幕上,界面都能保持较好的显示效果。

(三)逻辑代码编写

  1. 在 serial_led.pro 文件中添加串口库 “QT += core gui serialport”,并在 widget.h 文件中包含串口头文件 “#include <QSerialPort>” 和 “#include <QSerialPortInfo>”。QSerialPort 类提供了操作串口的各种接口,而 QSerialPortInfo 是一个辅助类,可以提供计算机中可用串口的各种信息。
  1. 在 widget.h 的 Widget 类中添加一个 QSerialPort 成员,以便在代码中方便地操作串口。然后,在 Widget 构造函数中创建一个串口对象并搜索所有可用串口。通过遍历 QSerialPortInfo::availablePorts (),可以获取到所有可用串口的信息,并将其添加到界面中的串口选择控件中。
  1. 编写 “打开串口” 槽函数是实现上位机功能的关键步骤之一。利用信号和槽机制,当用户点击打开串口按钮时,按钮会发出一个信号。如果有对象对这个信号感兴趣,并将其与自己的一个函数(槽函数)绑定,那么当信号发出时,被连接的槽函数会自动被回调。在槽函数中,我们可以写死数据位、停止位、校验位等参数,并增加提示框,以提高用户体验。

四、功能完善与扩展

(一)自动获取串口号

在嵌入式 QT 上位机开发中,自动获取串口号是一项非常实用的功能。通过代码可以轻松实现这一功能,并将获取到的串口号显示在 UI 界面上,方便用户选择。

在实现自动获取串口号的过程中,我们可以使用QSerialPortInfo类来获取计算机中可用的串口信息。以下是具体的实现步骤:

  1. 在widget.h文件中包含QSerialPortInfo头文件:#include <QSerialPortInfo>。
  1. 在Widget类的构造函数中,使用以下代码获取可用串口号并添加到 UI 界面的串口选择控件中:
 

Widget::Widget(QWidget *parent) :

QWidget(parent),

ui(new Ui::Widget)

{

ui->setupUi(this);

// 先定义一个 QStringList

QStringList serialNamePort;

foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) {

serialNamePort << info.portName();

}

ui->serialPortComboBox->addItems(serialNamePort);

}

通过以上代码,我们可以在程序启动时自动搜索计算机中的可用串口,并将其显示在 UI 界面上,为用户提供了便利。

(二)串口初始化与控制

  1. 关联 “打开” 操作与窗口初始化,通过信号和槽进行初始化。

在嵌入式 QT 上位机开发中,将 “打开” 操作与窗口初始化关联起来,可以通过信号和槽机制实现。这样,当用户点击 “打开串口” 按钮时,槽函数会对串口进行初始化,确保串口能够正常工作。

具体实现步骤如下:

  • 在widget.h文件中,声明一个槽函数,用于处理 “打开串口” 按钮的点击事件:
 

private slots:

void on_openSerialPortButton_clicked();

  • 在widget.cpp文件中,实现该槽函数。首先定义一些变量,用于存储串口的参数,如波特率、数据位、停止位、校验位等:
 

void Widget::on_openSerialPortButton_clicked()

{

QSerialPort::BaudRate bauRate;

QSerialPort::DataBits dataBits;

QSerialPort::StopBits stopBits;

QSerialPort::Parity checkBits;

}

  • 然后,根据用户在 UI 界面上选择的参数,为这些变量赋值。例如,如果用户选择了波特率为 9600,则将bauRate变量设置为QSerialPort::Baud9600:
 

if(ui->baudRateComboBox->currentText() == "9600"){

bauRate = QSerialPort::Baud9600;

}

  • 接着,将这些参数设置到串口对象中:
 

serialPort->setPortName(ui->serialPortComboBox->currentText());

serialPort->setBaudRate(bauRate);

serialPort->setDataBits(dataBits);

serialPort->setStopBits(stopBits);

serialPort->setParity(checkBits);

  • 最后,打开串口并检查是否成功。如果成功,显示提示信息;如果失败,显示错误信息:
 

if(serialPort->open(QIODevice::ReadWrite) == true){

QMessageBox::information(this,"提示","成功");

}else{

QMessageBox::critical(this,"提示","失败");

}

  1. 设计 “关闭功能”,实现串口的打开和关闭控制。

设计 “关闭功能” 非常简单。在 UI 文件中选中关闭按钮,右键点击 “转到槽”,选择合适的信号(如clicked信号),系统会自动在widget.cpp文件中生成一个槽函数。在这个槽函数中,写入关闭串口的语句即可:

 

void Widget::on_closeSerialPortButton_clicked()

{

serialPort->close();

}

这样,当用户点击关闭按钮时,串口会被关闭。再次点击打开按钮时,就可以重新打开串口,而不会出现错误提示。

通过以上步骤,我们实现了串口的初始化与控制,包括自动获取串口号、关联 “打开” 操作与窗口初始化以及设计 “关闭功能”。这些功能的实现,使得嵌入式 QT 上位机更加完善和实用。

五、开发注意事项与难点

(一)注意事项

  1. 考虑硬件资源限制,确保应用程序在嵌入式设备上正常运行。
    • 在进行嵌入式 QT 上位机开发时,我们需要充分了解嵌入式设备的硬件资源限制,包括处理器性能、内存大小、存储空间等。例如,一些低性能的嵌入式设备可能只有有限的内存和处理能力,这就要求我们在开发过程中优化代码,避免过度占用资源。据统计,某些低端嵌入式设备可能只有几十兆字节的内存和较低频率的处理器,这就需要我们在设计上位机应用程序时,尽量减少不必要的功能和复杂的图形界面,以确保应用程序能够在这些限制下正常运行。
  1. 注意操作系统和驱动兼容性,确保良好的兼容性。
    • Qt 嵌入式开发需要考虑到设备的特殊操作系统和驱动程序。不同的嵌入式设备可能运行着不同的操作系统,如 Linux、VxWorks 等,这些操作系统在命名规则、文件系统结构等方面可能与常见的桌面操作系统有所不同。例如,在 Linux 系统中,串口的命名可能是/dev/ttyS0或/dev/ttyUSB0这种形式,而在 Windows 系统中则是com1等形式。因此,我们需要确保我们的应用程序能够与设备的操作系统和硬件有良好的兼容性,避免出现因不兼容而导致的无法正常运行的情况。
  1. 进行性能优化和功耗管理,延长设备使用时间。
    • 另外,Qt 嵌入式开发也需要考虑到应用程序的性能优化和功耗管理。在嵌入式设备中,资源通常是有限的,因此我们需要尽量减少应用程序对设备资源的占用,以延长设备的使用时间。例如,我们可以通过优化算法、减少不必要的计算和数据传输等方式来降低应用程序的功耗。同时,我们还可以根据设备的使用情况,合理地调整应用程序的运行模式,如在设备空闲时进入低功耗模式等。
  1. 选择适合的 Qt 模块和功能,满足设备特定需求。
    • 对于不同的嵌入式设备,我们需要针对性地选择适合的 Qt 模块和功能,以满足设备的特定需求。Qt 提供了丰富的模块和功能,如串口通信、网络通信、图形绘制等。但是,在嵌入式设备中,我们可能并不需要所有的模块和功能,而且一些模块可能会占用较多的资源。因此,我们需要根据设备的实际需求,选择合适的模块和功能,以提高应用程序的性能和稳定性。
  1. 重视应用程序安全性,保护用户数据不被非法获取。
    • 最后,我们需要重视应用程序的安全性,尤其是对于涉及到用户隐私和数据安全的应用程序。在嵌入式设备中,由于设备通常连接到网络或其他外部设备,因此存在着被攻击的风险。我们需要考虑到设备的安全机制和加密方法,以保护用户数据不被非法获取。例如,我们可以使用加密算法对用户数据进行加密存储,或者使用防火墙等安全设备来保护设备的网络安全。

(二)开发难点

  1. 信号和槽机制的正确使用与理解。
    • 信号和槽机制是 Qt 的核心机制之一,但也是开发中的难点之一。正确使用和理解信号和槽机制需要对 Qt 的编程模型有深入的了解。例如,在连接信号和槽时,需要注意信号和槽的参数类型和数量必须匹配,否则会出现编译错误或运行错误。同时,信号和槽的连接顺序也可能会影响程序的执行结果。因此,在开发过程中,我们需要仔细调试和测试信号和槽的连接,确保其正确无误。
  1. 串口初始化和属性设置的复杂性。
    • 串口初始化和属性设置也是开发中的难点之一。在嵌入式设备中,串口的参数设置可能会因设备而异,如波特率、数据位、停止位、校验位等。同时,串口的初始化过程也可能会受到设备的操作系统和驱动程序的影响。因此,我们需要仔细阅读设备的文档,了解串口的参数设置和初始化过程,以确保串口能够正常工作。
  1. 确保界面布局的合理性和美观性。
    • 确保界面布局的合理性和美观性也是开发中的难点之一。在嵌入式设备中,屏幕大小和分辨率可能会受到限制,因此我们需要根据设备的实际情况,合理地设计界面布局,以确保界面能够在不同的设备上正常显示。同时,我们还需要考虑到用户的使用习惯和审美需求,设计出美观、易用的界面。例如,我们可以使用 Qt 的布局管理器来自动调整界面布局,以适应不同的屏幕大小和分辨率。同时,我们还可以使用 Qt 的样式表来美化界面,提高用户体验。

六、开发实例展示

(一)需求分析

开发一个串口助手,需要实现自动搜索本机串口、手动配置串口参数(如波特率、数据位、停止位、校验位等)、打开和关闭串口、发送和接收串口数据、支持中文显示以及自定义波特率等功能。

(二)界面设计

  1. 使用 Qt Designer 进行可视化界面设计,添加所需的控件,如接收框(Plain Text Edit,设置为只读)、发送框(Line Edit)、波特率下拉框(Combo Box)、数据位下拉框、停止位下拉框、校验位下拉框、打开串口按钮、关闭串口按钮、发送数据按钮、清空接收框按钮等。
  1. 通过合理布局,如水平布局、垂直布局和栅格布局,使界面更加美观和易用。同时,设置最小宽度,确保在不同分辨率的屏幕上都能有较好的显示效果。
  1. 给控件命名,方便编写代码和提高开发效率。

(三)功能实现

  1. 自动搜索本机串口
    • 在widget.h文件中包含QSerialPortInfo头文件。
    • 在Widget类的构造函数中,使用QSerialPortInfo::availablePorts()获取可用串口号,并添加到串口选择控件中。
  1. 串口初始化与控制
    • 关联 “打开” 操作与窗口初始化,通过信号和槽机制实现。在槽函数中定义变量存储串口参数,根据用户选择赋值,并设置到串口对象中,最后打开串口并检查是否成功。
    • 设计 “关闭功能”,在关闭按钮的槽函数中写入关闭串口的语句。
  1. 发送和接收串口数据
    • 接收数据:使用信号readyRead(),在槽函数中读取串口接收的数据,转换为中文格式并显示在接收框中。
    • 发送数据:在发送按钮的槽函数中,获取发送框中的数据,转换为合适的格式并通过串口发送出去。
  1. 支持中文显示:使用fromLocal8Bit()函数实现从 Unicode 到本地字符集的转换,处理汉语显示乱码问题。
  1. 自定义波特率:在波特率下拉框的槽函数中,当选择自定义波特率时,设置下拉框内容为空并可编辑,接收用户输入的波特率值,并设置到串口对象中。

(四)开发过程中的问题与解决方法

  1. 布局混乱问题:在设计过程中,可能会出现布局混乱的情况。可以通过打破布局,重新调整控件的布局方式,如使用栅格布局等方法来解决。
  1. 中文显示乱码问题:使用fromLocal8Bit()函数将接收到的数据转换为中文格式,解决中文显示乱码问题。
  1. 串口只能打开一次问题:设计 “关闭功能”,在关闭串口后,下次可以正常打开串口,避免出现只能打开一次的问题。

(五)总结

通过这个串口助手的开发实例,展示了嵌入式 QT 上位机开发的全过程。从需求分析、界面设计到功能实现,以及在开发过程中遇到的问题和解决方法,都为开发者提供了宝贵的经验。在实际开发中,还可以根据具体需求进一步扩展和优化功能,使上位机更加完善和实用。

七、总结与展望

(一)总结

嵌入式 QT 上位机开发为众多领域带来了高效、便捷的解决方案。通过对开发环境的搭建、上位机的设计与实现、功能完善与扩展以及开发注意事项与难点的探讨,我们可以总结出以下要点:

  1. 开发环境搭建是基础,正确安装 Qt Creator 并创建合适的项目,为后续开发提供了稳定的平台。
  1. 上位机设计与实现需要合理选择基类、进行界面设计和逻辑代码编写,确保上位机的功能完善和易用性。
  1. 功能完善与扩展可以通过自动获取串口号、串口初始化与控制、发送和接收串口数据等功能的实现,提高上位机的实用性。
  1. 开发注意事项包括考虑硬件资源限制、注意操作系统和驱动兼容性、进行性能优化和功耗管理、选择适合的 Qt 模块和功能以及重视应用程序安全性,确保上位机在嵌入式设备上的稳定运行。
  1. 开发难点主要集中在信号和槽机制的正确使用与理解、串口初始化和属性设置的复杂性以及确保界面布局的合理性和美观性等方面,需要开发者深入理解 Qt 的编程模型和设备特性。

(二)展望

  1. 随着物联网技术的不断发展,嵌入式 QT 上位机在智能家居、智能工业、智能医疗等领域的应用前景将更加广阔。例如,在智能家居系统中,上位机可以实现对各种智能设备的集中控制和管理,为用户提供更加便捷的生活体验。
  1. 未来,嵌入式 QT 上位机将更加注重与人工智能技术的结合。通过集成人工智能算法,上位机可以实现对设备的智能控制和数据分析,提高设备的智能化水平。
  1. 跨平台性将继续成为嵌入式 QT 上位机的重要优势。随着不同操作系统和硬件平台的不断发展,上位机需要能够在各种环境下稳定运行,为用户提供一致的使用体验。
  1. 界面设计将更加注重用户体验和美观性。随着用户对软件界面的要求不断提高,上位机需要具备更加简洁、直观的界面设计,提高用户的操作便捷性和满意度。
  1. 安全性将成为嵌入式 QT 上位机开发的重要关注点。随着设备连接到网络的增多,安全风险也随之增加。上位机需要加强安全机制,保护用户数据和设备的安全。

总之,嵌入式 QT 上位机开发在未来将继续发挥重要作用,为各个领域的智能化发展提供强大的支持。

<think>嗯,用户想了解如何使用Qt进行嵌入式上位机开发,需要教程或解决方案。首先,我得回忆一下Qt嵌入式开发中的应用场景和相关知识。根据引用[1],Qt上位机开发涉及到环境搭建、界面设计、功能扩展以及注意事项,比如硬件资源限制和操作系统兼容性。还有引用[2]提到Qt是跨平台的框架,适合图形界面开发,这对嵌入式系统应该很重要。 用户可能已经知道Qt的基础,但作为新手,可能需要从环境搭建开始。嵌入式开发可能需要特定的工具链,比如交叉编译环境。此外,Qt Creator的安装和配置是关键步骤,需要确保目标设备的兼容性。比如,是否需要安装特定版本的Qt库或者模块? 然后是界面设计部分。Qt的信号和槽机制是核心,用户可能需要示例代码来理解如何连接界面元素和后台逻辑。比如串口通信,引用[1]里提到了自动获取串口号和发送接收数据,这部分可能需要用到Qt的SerialPort模块。需要确认用户是否了解QSerialPort类的使用,或者是否需要提供相关代码示例。 功能扩展方面,用户可能需要知道如何处理硬件资源限制,比如内存优化或功耗管理。引用[1]提到性能优化和安全性,这些都是开发中需要注意的点。此外,嵌入式设备可能有不同的显示需求,比如触摸屏适配,这涉及到界面布局和响应式设计。 用户的问题可能还涉及到实际开发中的难点,比如信号槽的正确使用、串口初始化的复杂性。需要解释这些挑战并提供解决建议,比如调试技巧或常见错误处理。引用[3]和[4]提到开发过程中的困难和可能需要的前端知识,但Qt相比Electron可能更适合嵌入式,因为Qt本身就是为跨平台设计的,不需要依赖Web技术。 最后,应该推荐学习资源,比如官方文档、书籍和社区论坛,帮助用户继续深入学习。同时,应用实例的参考项目能提供实践机会,巩固知识。可能用户需要知道未来趋势,比如与AI结合或跨平台需求,引用[1]里的展望部分可以作为补充信息。 总结下来,回答的结构应该是分步骤的教程,涵盖环境搭建、界面设计、功能实现、注意事项和资源推荐,同时解答常见问题和难点,确保用户能系统地进行学习。</think>### Qt嵌入式上位机开发解决方案 #### 一、开发环境搭建 1. **安装Qt Creator** - 下载Qt官方维护的嵌入式版本(如Qt for Embedded Linux)并安装,需注意选择与目标设备匹配的工具链[^1][^2] - 示例安装命令: ```bash sudo apt-get install qt5-default qtcreator ``` 2. **交叉编译配置** - 创建针对ARM架构的编译工具链(如使用Yocto或Buildroot) - 在Qt Creator中配置设备连接(SSH或串口协议)[^1] #### 二、基础框架设计 ```cpp // 主窗口类定义示例 class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr); private: QSerialPort *serial; // 串口对象 QLabel *statusLabel; // 状态显示 void initSerialPort();// 串口初始化 }; ``` #### 三、核心功能实现 1. **串口通信模块** ```cpp // 自动扫描可用串口 QList<QSerialPortInfo> ports = QSerialPortInfo::availablePorts(); foreach (const QSerialPortInfo &info, ports) { ui->comboBox->addItem(info.portName()); } // 数据接收槽函数 connect(serial, &QSerialPort::readyRead, [=](){ QByteArray data = serial->readAll(); statusLabel->setText("接收数据:" + data.toHex()); }); ``` 2. **界面布局优化** - 使用`QGridLayout`实现自适应布局 - 添加`QSS`样式表增强视觉效果: ```css QPushButton { background-color: #4CAF50; border-radius: 5px; padding: 8px 16px; } ``` #### 四、关键注意事项 1. **硬件资源管理** - 通过`QElapsedTimer`监控代码执行时间 - 使用`QPixmap::cacheLimit()`控制图像缓存 2. **跨平台兼容性** - 条件编译处理平台差异: ```cpp #ifdef Q_OS_LINUX // Linux特定代码 #elif defined(Q_OS_WIN) // Windows特定代码 #endif ``` #### 五、进阶开发技巧 1. **自定义控件开发** ```cpp class GaugeWidget : public QWidget { Q_OBJECT public: explicit GaugeWidget(QWidget *parent = nullptr); void setValue(int value); protected: void paintEvent(QPaintEvent *event) override; }; ``` 2. **多语言支持** - 使用`tr()`标记可翻译字符串 - 生成.ts翻译文件并部署 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值