Qt and environment variables passed to main

本文探讨了在Qt环境中处理环境变量的方法。指出在Ubuntu下可以通过传递环境变量到main函数中进行处理,但在Windows环境下Qt并未在qtmain_win.cpp中提供环境参数。文中提到应当使用QProcessEnvironment来解决此问题。

On ubuntu I can use the environment variables passed to main as the following, but it does not work on Windows since QT does not pass env in qtmain_win.cpp.

 

int main(int argc, char *argv[], char* env[])

{

 

    //C:/Qt/4.6.3/src/winmain/qtmain_win.cpp does not provide env argument

#ifndef _MSC_VER

    while(env[i])

    {

        BOOST_LOG_TRIVIAL(info) << env[i] ;

        environment_variable_list.append(env[i]);

        i++;

    }

#endif

 

}

Actually QProcessEnvironment should be used for this purpose. 

 

An interesting topic: Building static Qt on Windows with MSVC

# Set the minimum required version of cmake for a project and update Policy Settings # to match the version given. cmake_minimum_required(VERSION 3.1.0) message(STATUS "CMAKE_ROOT = " ${CMAKE_ROOT}) # Sets project details such as name, version, etc. and enables languages. # Stores the project name in the PROJECT_NAME variable. Additionally this sets variables: # PROJECT_SOURCE_DIR, <PROJECT-NAME>_SOURCE_DIR # PROJECT_BINARY_DIR, <PROJECT-NAME>_BINARY_DIR project(planning) message(STATUS "PROJECT_NAME = " ${PROJECT_NAME}) message(STATUS "PROJECT_SOURCE_DIR = " ${PROJECT_SOURCE_DIR}) message(STATUS "PROJECT_BINARY_DIR = " ${PROJECT_BINARY_DIR}) # Control if...else... statement format set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS ON) #set(CMAKE_BUILD_TYPE Debug) set (CMAKE_PREFIX_PATH "/opt/ros/noetic") # set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ../) # set(CMAKE_BUILD_TYPE "Debug") # Automatically add the current source and build directories to the include path. # If this variable is enabled, CMake automatically add CMAKE_CURRENT_SOURCE_DIR and # CMAKE_CURRENT_BINARY_DIR to the include path for each directory. These additional # include directories do not propagate down to subdirectories. This is useful mainly # for out-of-source builds, where files generated into the build tree are included by # files located in the source tree. set(CMAKE_INCLUDE_CURRENT_DIR ON) message(STATUS "CMAKE_CURRENT_SOURCE_DIR = " ${CMAKE_CURRENT_SOURCE_DIR}) message(STATUS "CMAKE_CURRENT_BINARY_DIR = " ${CMAKE_CURRENT_BINARY_DIR}) # Default compilation flags to be used when compiling CXX(C++) files. Will only be used # by CMake on the first configuration to determine CXX default compilation flags, after # which the value for CXXFLAGS is stored in the cache as CMAKE_CXX_FLAGS. For any # configuration run (including the first), the environment variable will be ignored if # the CMAKE_CXX_FLAGS variable is defined. set(CMAKE_CXX_FLAGS "-std=c++14 -fPIC") #set(CMAKE_CXX_FLAGS "-fPIC") # Instruct CMake to run moc automatically when needed set(CMAKE_AUTOMOC ON) # Create code from a list of Qt designer ui files # set(CMAKE_AUTOUIC ON) # Handle the Qt rcc code generator automatically # set(CMAKE_AUTORCC ON) # Enable GTest set(ENABLE_GTEST 0) if(ENABLE_GTEST) add_definitions(-DENABLE_GTEST=1) endif() # Find the QtWidgets library # find_package(Qt5Widgets COMPONENTS Qt5Core Qt5Gui Qt5OpenGL OpenGL) find_package(Qt5Widgets CONFIG REQUIRED) message(STATUS "Qt5Widgets_FOUND = " ${Qt5Widgets_FOUND}) message(STATUS "Qt5Widgets_VERSION = " ${Qt5Widgets_VERSION}) message(STATUS "Qt5Widgets_LIBRARIES = " ${Qt5Widgets_LIBRARIES}) message(STATUS "Qt5Widgets_INCLUDE_DIRS = " ${Qt5Widgets_INCLUDE_DIRS}) # Enable OpenGL set(QT_USE_QTOPENGL TRUE) find_package(Qt5OpenGL) message(STATUS "Qt5OpenGL_FOUND = " ${Qt5OpenGL_FOUND}) message(STATUS "Qt5OpenGL_VERSION = " ${Qt5OpenGL_VERSION}) message(STATUS "Qt5OpenGL_LIBRARIES = " ${Qt5OpenGL_LIBRARIES}) message(STATUS "Qt5OpenGL_INCLUDE_DIRS = " ${Qt5OpenGL_INCLUDE_DIRS}) # Using ROS # Find catkin macros and libraries # if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz) # is used, also find other catkin packages # QT暂时无法正确加载ROS环境,暂时就只能直接指定ROS的cmake目录了,不同的系统可能是不同的 # set(catkin_DIR "/opt/ros/noetic/share/catkin/cmake") #set(roscpp_DIR "/opt/ros/noetic/share/roscpp/cmake") # find_package(catkin REQUIRED COMPONENTS roscpp) message(STATUS "catkin_FOUND = " ${catkin_FOUND}) message(STATUS "catkin_VERSION = " ${catkin_VERSION}) message(STATUS "catkin_LIBRARIES = " ${catkin_LIBRARIES}) message(STATUS "catkin_INCLUDE_DIRS = " ${catkin_INCLUDE_DIRS}) # message(STATUS "roscpp_FOUND = " ${roscpp_FOUND}) # message(STATUS "roscpp_VERSION = " ${roscpp_VERSION}) # message(STATUS "roscpp_LIBRARIES = " ${roscpp_LIBRARIES}) # message(STATUS "roscpp_INCLUDE_DIRS = " ${roscpp_INCLUDE_DIRS}) ################################### ## catkin specific configuration ## ################################### # The catkin_package macro generates cmake config files for your package # Declare things to be passed to dependent projects # INCLUDE_DIRS: uncomment this if your package contains header files # LIBRARIES: libraries you create in this project that dependent projects also need # CATKIN_DEPENDS: catkin_packages dependent projects also need # DEPENDS: system dependencies of this project that dependent projects also need # catkin_package( # INCLUDE_DIRS include # LIBRARIES agitr # CATKIN_DEPENDS other_catkin_pkg # DEPENDS system_lib # ) #catkin_package( #) # CMAKE_RUNTIME_OUTPUT_DIRECTORY # Output directory in which to build RUNTIME target files. # This property specifies the directory into which runtime target files should be built. # Multi configuration generators (VS, Xcode) append a per-configuration subdirectory to # the specified direcotory. # There are three kinds of target files that may be built: archive, library, and runtime. # Executables are always treated as runtime targets. Static libraries are always treated # as archive targets. Module libraries are always treated as library targets. For non-DLL # platforms shared libraries are treated as library targets. For DLL platforms the DLL part # of a shared library is treated as a runtime target and the corresponding import library # is treated as an archive target. All Windows based systems including Cygwin are DLL platforms. # This property is initialized by the value of the variable CMAKE_RUNTIME_OUTPUT_DIRECTORY # if it is set when a target is created. message(STATUS "After load catkin:") message(STATUS "CMAKE_RUNTIME_OUTPUT_DIRECTORY = " ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}) # Add the given directories to those the compiler uses to search for include files. # Relative paths are interpreted as relative to the current source directory. include_directories( "./OSS/include/gflags-2.2.2/gflags" "./OSS/include/glog-0.3.3" "./OSS/include/gtest-1.7.0" "./OSS/include/protobuf_3_13_0" "./OSS/include/" "./AP_Platform_SDK_X86/include" ${Qt5Widgets_INCLUDE_DIRS} ${Qt5OpenGL_INCLUDE_DIRS} # ${catkin_INCLUDE_DIRS} "~/3rdparty/eigen-3.3.0" "~/3rdparty/lcm-1.4.0/build/lcm" "~/3rdparty/lcm-1.4.0" "./src/common/include" "./src/common/src" "./src/veh_model/include" "./src/veh_model/src" "./src/ad_msg/include" "./src/data_serial/include" "./src/pos_filter/include" "./src/pos_filter/src" "./src/obj_filter/include" "./src/obj_filter/src" "./src/driving_map/include" "./src/driving_map/src" "./src/planning/include" "./src/planning/src" "./src/socket_comm/include" "./src/framework" "./src/hmi" "./src/common_msgs_3_13_0" "./src/" "./pcdebug/" "./pcdebug/hmi" "./OSS/include/protomsg" ) get_property(dirs DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY INCLUDE_DIRECTORIES) message(STATUS "Show include directories:---------") foreach(dir ${dirs}) message(STATUS ${dir}) endforeach() message(STATUS "----------------------------------") # Specify the paths in which the linker should search for libraries. The command will # apply only to targets created after it is called. Relative paths given to this command # are interpreted as relative to the current source direcotry. # Note that this command is rarely necessary. Library locations returned by find_package() # and find_library() are absolute paths. Pass these absolute library file path directly to # the target_link_libraries() command. CMake will ensure the linker finds them. link_directories( "./OSS/lib/linux" "~/programs/qt/qt-5.15.2/5.15.2/gcc_64/lib" "~/3rdparty/lcm-1.4.0/build/lcm" "./src/outside_msg/msg_series_d17/lib" #"./AP_Platform_SDK_X86/lib/ara/log" "/mnt/MPA_Planning/AP_Platform_SDK_X86/lib/ara/log" "/mnt/MPA_Planning/AP_Platform_SDK_X86/lib/LSP/system" ) get_property(dirs DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY LINK_DIRECTORIES) message(STATUS "Show link directories:") foreach(dir ${dirs}) message(STATUS ${dir}) endforeach() message(STATUS "----------------------------------") # Add ui and qrc files file(GLOB QT_FORMS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ./pcdebug/hmi/ui/*.ui) file(GLOB QT_RESOURCES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ./pcdebug/hmi/resources/*.qrc) message(STATUS "QT_FORMS = " ${QT_FORMS}) message(STATUS "QT_RESOURCES = " ${QT_RESOURCES}) # if (Qt5Widgets_FOUND) # Create code from a list of Qt resource files qt5_add_resources(QT_RESOURCES_CPP ${QT_RESOURCES}) # Create code from a list of Qt designer ui files qt5_wrap_ui(QT_FORMS_HPP ${QT_FORMS}) else () message(FATAL_ERROR "Qt5Widgets not found") endif () # Add source files file(GLOB_RECURSE SRC_LIST RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} FOLLOW_SYMLINKS ./src/*.hpp ./src/*.h ./src/*.c ./src/*.cc ./src/*.cpp ./pcdebug/*.h ./pcdebug/*.cc ) message(STATUS "SRC_LIST = " ${SRC_LIST}) # Add an executable to the project using the specified source files. add_executable(${PROJECT_NAME} ${SRC_LIST} ${QT_RESOURCES_CPP} ${QT_FORMS_HPP} ) # Specify libraries or flags to use when linking a given target and/or its dependents. target_link_libraries(${PROJECT_NAME} Qt5Widgets Qt5Core Qt5Gui Qt5OpenGL Qt5Multimedia GL GLU glut ${catkin_LIBRARIES} protobuf pthread boost_thread boost_date_time boost_system boost_chrono lcm dlt # ← libdlt.so → -ldlt logTrace # ← liblogTrace.so → -llogTrace yaml-cpp # ← libyaml-cpp.so → -lyaml-cpp common_msgs # ← libcommon_msgs.so → -lcommon_msgs osApi # ← libosApi.so → -losApi(关键! ) #target_link_libraries(${PROJECT_NAME} libosApi.so libdlt.so liblogTrace.so libyaml-cpp.so libcommon_msgs.so) if(ENABLE_GTEST) target_link_libraries(${PROJECT_NAME} "./OSS/lib/linux/libgtest.so" "./OSS/lib/linux/libgtest_main.so") endif() export LD_LIBRARY_PATH=/mnt/MPA_Planning/AP_Platform_SDK_X86/lib/LSP/system:$LD_LIBRARY_PATH 可以在cmakelist怎么代替
最新发布
12-10
/************************************************************************************************** Filename: ZMain.c Revised: $Date: 2009-09-17 20:35:33 -0700 (Thu, 17 Sep 2009) $ Revision: $Revision: 20782 $ Description: Startup and shutdown code for ZStack Notes: This version targets the Chipcon CC2530 Copyright 2005-2009 Texas Instruments Incorporated. All rights reserved. IMPORTANT: Your use of this Software is limited to those specific rights granted under the terms of a software license agreement between the user who downloaded the software, his/her employer (which must be your employer) and Texas Instruments Incorporated (the "License"). You may not use this Software unless you agree to abide by the terms of the License. The License limits your use, and you acknowledge, that the Software may not be modified, copied or distributed unless embedded on a Texas Instruments microcontroller or used solely and exclusively in conjunction with a Texas Instruments radio frequency transceiver, which is integrated into your product. Other than for the foregoing purpose, you may not use, reproduce, copy, prepare derivative works of, modify, distribute, perform, display or sell this Software and/or its documentation for any purpose. YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED 揂S IS?WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS. Should you have any questions regarding your right to use this Software, contact Texas Instruments Incorporated at www.TI.com. **************************************************************************************************/ /********************************************************************* * INCLUDES */ #include "ZComDef.h" #include "OSAL.h" #include "OSAL_Nv.h" #include "OnBoard.h" #include "ZMAC.h" #ifndef NONWK #include "AF.h" #endif /* Hal */ #include "hal_lcd.h" #include "hal_led.h" #include "hal_adc.h" #include "hal_drivers.h" #include "hal_assert.h" #include "hal_flash.h" /********************************************************************* * MACROS */ /********************************************************************* * CONSTANTS */ // Maximun number of Vdd samples checked before go on #define MAX_VDD_SAMPLES 3 #define ZMAIN_VDD_LIMIT HAL_ADC_VDD_LIMIT_4 /********************************************************************* * TYPEDEFS */ /********************************************************************* * GLOBAL VARIABLES */ /********************************************************************* * EXTERNAL VARIABLES */ /********************************************************************* * EXTERNAL FUNCTIONS */ extern bool HalAdcCheckVdd (uint8 limit); /********************************************************************* * LOCAL VARIABLES */ /********************************************************************* * LOCAL FUNCTIONS */ static void zmain_dev_info( void ); static void zmain_ext_addr( void ); static void zmain_vdd_check( void ); #ifdef LCD_SUPPORTED static void zmain_lcd_init( void ); #endif /********************************************************************* * @fn main * @brief First function called after startup. * @return don't care */ int main( void ) { // Turn off interrupts osal_int_disable( INTS_ALL ); //关闭所有中断 // Initialization for board related stuff such as LEDs HAL_BOARD_INIT(); //初始化系统时钟 // Make sure supply voltage is high enough to run zmain_vdd_check(); //检查芯片电压是否正常 // Initialize board I/O InitBoard( OB_COLD ); //初始化I/O ,LED 、Timer 等 // Initialze HAL drivers HalDriverInit(); //初始化芯片各硬件模块 // Initialize NV System osal_nv_init( NULL ); //初始化Flash 存储器 // Initialize the MAC ZMacInit(); //初始化MAC 层 // Determine the extended address zmain_ext_addr(); //确定IEEE 64位地址 // Initialize basic NV items zgInit(); //初始化非易失变量 #ifndef NONWK // Since the AF isn't a task, call it's initialization routine afInit(); #endif // Initialize the operating system osal_init_system(); //初始化操作系统 // Allow interrupts osal_int_enable( INTS_ALL ); //使能全部中断 // Final board initialization InitBoard( OB_READY ); //最终板载初始化 // Display information about this device zmain_dev_info(); //显示设备信息 /* Display the device info on the LCD */ #ifdef LCD_SUPPORTED zmain_lcd_init(); //初始化LCD #endif #ifdef WDT_IN_PM1 /* If WDT is used, this is a good place to enable it. */ WatchDogEnable( WDTIMX ); #endif osal_start_system(); // No Return from here 执行操作系统,进去后不会返回 return 0; // Shouldn't get here. } // main() /********************************************************************* * @fn zmain_vdd_check * @brief Check if the Vdd is OK to run the processor. * @return Return if Vdd is ok; otherwise, flash LED, then reset *********************************************************************/ static void zmain_vdd_check( void ) { uint8 vdd_passed_count = 0; bool toggle = 0; // Repeat getting the sample until number of failures or successes hits MAX // then based on the count value, determine if the device is ready or not while ( vdd_passed_count < MAX_VDD_SAMPLES ) { if ( HalAdcCheckVdd (ZMAIN_VDD_LIMIT) ) { vdd_passed_count++; // Keep track # times Vdd passes in a row MicroWait (10000); // Wait 10ms to try again } else { vdd_passed_count = 0; // Reset passed counter MicroWait (50000); // Wait 50ms MicroWait (50000); // Wait another 50ms to try again } /* toggle LED1 and LED2 */ if (vdd_passed_count == 0) { if ((toggle = !(toggle))) HAL_TOGGLE_LED1(); else HAL_TOGGLE_LED2(); } } /* turn off LED1 */ HAL_TURN_OFF_LED1(); HAL_TURN_OFF_LED2(); } /************************************************************************************************** * @fn zmain_ext_addr * * @brief Execute a prioritized search for a valid extended address and write the results * into the OSAL NV system for use by the system. Temporary address not saved to NV. * * input parameters * * None. * * output parameters * * None. * * @return None. ************************************************************************************************** */ static void zmain_ext_addr(void) { uint8 nullAddr[Z_EXTADDR_LEN] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; uint8 writeNV = TRUE; // First check whether a non-erased extended address exists in the OSAL NV. if ((SUCCESS != osal_nv_item_init(ZCD_NV_EXTADDR, Z_EXTADDR_LEN, NULL)) || (SUCCESS != osal_nv_read(ZCD_NV_EXTADDR, 0, Z_EXTADDR_LEN, aExtendedAddress)) || (osal_memcmp(aExtendedAddress, nullAddr, Z_EXTADDR_LEN))) { // Attempt to read the extended address from the location on the lock bits page // where the programming tools know to reserve it. HalFlashRead(HAL_FLASH_IEEE_PAGE, HAL_FLASH_IEEE_OSET, aExtendedAddress, Z_EXTADDR_LEN); if (osal_memcmp(aExtendedAddress, nullAddr, Z_EXTADDR_LEN)) { // Attempt to read the extended address from the designated location in the Info Page. if (!osal_memcmp((uint8 *)(P_INFOPAGE+HAL_INFOP_IEEE_OSET), nullAddr, Z_EXTADDR_LEN)) { osal_memcpy(aExtendedAddress, (uint8 *)(P_INFOPAGE+HAL_INFOP_IEEE_OSET), Z_EXTADDR_LEN); } else // No valid extended address was found. { uint8 idx; #if !defined ( NV_RESTORE ) writeNV = FALSE; // Make this a temporary IEEE address #endif /* Attempt to create a sufficiently random extended address for expediency. * Note: this is only valid/legal in a test environment and * must never be used for a commercial product. */ for (idx = 0; idx < (Z_EXTADDR_LEN - 2);) { uint16 randy = osal_rand(); aExtendedAddress[idx++] = LO_UINT16(randy); aExtendedAddress[idx++] = HI_UINT16(randy); } // Next-to-MSB identifies ZigBee devicetype. #if ZG_BUILD_COORDINATOR_TYPE && !ZG_BUILD_JOINING_TYPE aExtendedAddress[idx++] = 0x10; #elif ZG_BUILD_RTRONLY_TYPE aExtendedAddress[idx++] = 0x20; #else aExtendedAddress[idx++] = 0x30; #endif // MSB has historical signficance. aExtendedAddress[idx] = 0xF8; } } if (writeNV) { (void)osal_nv_write(ZCD_NV_EXTADDR, 0, Z_EXTADDR_LEN, aExtendedAddress); } } // Set the MAC PIB extended address according to results from above. (void)ZMacSetReq(MAC_EXTENDED_ADDRESS, aExtendedAddress); } /************************************************************************************************** * @fn zmain_dev_info * * @brief This displays the IEEE (MSB to LSB) on the LCD. * * input parameters * * None. * * output parameters * * None. * * @return None. ************************************************************************************************** */ static void zmain_dev_info(void) { #ifdef LCD_SUPPORTED uint8 i; uint8 *xad; uint8 lcd_buf[Z_EXTADDR_LEN*2+1]; // Display the extended address. xad = aExtendedAddress + Z_EXTADDR_LEN - 1; for (i = 0; i < Z_EXTADDR_LEN*2; xad--) { uint8 ch; ch = (*xad >> 4) & 0x0F; lcd_buf[i++] = ch + (( ch < 10 ) ? '0' : '7'); ch = *xad & 0x0F; lcd_buf[i++] = ch + (( ch < 10 ) ? '0' : '7'); } lcd_buf[Z_EXTADDR_LEN*2] = '\0'; HalLcdWriteString( "IEEE: ", HAL_LCD_LINE_1 ); HalLcdWriteString( (char*)lcd_buf, HAL_LCD_LINE_2 ); #endif } #ifdef LCD_SUPPORTED /********************************************************************* * @fn zmain_lcd_init * @brief Initialize LCD at start up. * @return none *********************************************************************/ static void zmain_lcd_init ( void ) { #ifdef SERIAL_DEBUG_SUPPORTED { HalLcdWriteString( "TexasInstruments", HAL_LCD_LINE_1 ); #if defined( MT_MAC_FUNC ) #if defined( ZDO_COORDINATOR ) HalLcdWriteString( "MAC-MT Coord", HAL_LCD_LINE_2 ); #else HalLcdWriteString( "MAC-MT Device", HAL_LCD_LINE_2 ); #endif // ZDO #elif defined( MT_NWK_FUNC ) #if defined( ZDO_COORDINATOR ) HalLcdWriteString( "NWK Coordinator", HAL_LCD_LINE_2 ); #else HalLcdWriteString( "NWK Device", HAL_LCD_LINE_2 ); #endif // ZDO #endif // MT_FUNC } #endif // SERIAL_DEBUG_SUPPORTED } #endif /********************************************************************* *********************************************************************/ 根据这个代码 写一个pyqt的UI界面,实时接收终端的数据,之后要 存储在数据库里
09-05
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值