qt笔记之qml和C++的交互系列(一):初记

code review!

—— 杭州 2023-11-16 夜


文章目录

  • 一.qt笔记之qml和C++的交互:官方文档阅读理解
    • 0.《Overview - QML and C++ Integration》中给出五种QML与C+集成的方法
    • 1.Q_PROPERTY:将C++类的成员变量暴露给QML
    • 2.Q_INVOKABLE()或public slots:将C++类的成员函数暴露给QML
    • 3.on\<Signal\>其中\<Signal\>第一个字母大写:暴露C++中的信号以及信号中传递的参数给QML
  • 二.qt笔记之qml和C++的交互笔记
    • 1.设置上下文属性(setContextProperty())
      • 1.1.fileio.h
      • 1.2.fileio.cpp
      • 1.3.main.cc
      • 1.4.main.qml
    • 2.在QML引擎里面注册新类型(qmlRegisterType)
      • 2.1.fileio.h
      • 2.2.fileio.cpp
      • 2.3.main.cc
      • 2.4.main.qml
    • 3.导出对应的QML扩展插件——略

一.qt笔记之qml和C++的交互:官方文档阅读理解

参考资料:

官方文档《Exposing Attributes of C++ Types to QML》(将C++类暴露给QML)
官方文档《Data Type Conversion Between QML and C++》
官方文档《The Property System》
官方文档《Defining QML Types from C++》(在QML中定义C++类)
官方文档《Overview - QML and C++ Integration》

0.《Overview - QML and C++ Integration》中给出五种QML与C+集成的方法

  • 1.Exposing Attributes of C++ Classes to QML
  • 2.Defining QML Types from C++
  • 3.Embedding C++ Objects into QML with Context Properties
  • 4.Interacting with QML Objects from C++
  • 5.Data Type Conversion Between QML and C++

1.Q_PROPERTY:将C++类的成员变量暴露给QML

Q_PROPERTY(…)
This macro is used for declaring properties in classes that inherit QObject. Properties behave like class data members, but they have additional features accessible through the Meta-Object System.
翻译:
这个宏用于在继承 QObject 的类中声明属性。属性的行为类似于类数据成员,但通过元对象系统可以访问额外的功能。

在这里插入图片描述

翻译:

为了与QML最大程度地互操作,任何可写的属性都应该有一个关联的NOTIFY信号,在属性值变化时发出。这允许该属性与属性绑定(property binding)一起使用,属性绑定是QML的一个重要特性,它通过在任何依赖项值变化时自动更新属性来强制属性之间的关系。

在上述示例中,author属性的关联NOTIFY信号是authorChanged,如Q_PROPERTY()宏调用中所指定的。这意味着每当信号被发出时——比如在Message::setAuthor()中当author发生变化时——它会通知QML引擎需要更新任何涉及author属性的绑定,进而引擎将通过再次调用Message::author()来更新text属性。

如果author属性可写,但没有关联的NOTIFY信号,text值将使用Message::author()返回的初始值进行初始化,但不会更新为此属性的任何后续更改。此外,任何尝试从QML绑定到该属性的操作都会导致引擎产生运行时警告。

注意:建议将NOTIFY信号命名为<property>Changed,其中<property>是属性的名称。由QML引擎生成的关联属性更改信号处理程序的形式始终为on<Property>Changed,而不管相关的C++信号的名称如何,因此建议信号名称遵循此约定,以避免任何混淆。

GPT解读:
在上述代码中,Q_PROPERTY(QString author READ author WRITE setAuthor NOTIFY authorChanged) 声明了一个名为 author 的属性,它具有读取方法 author() 和写入方法 setAuthor(const QString&)。该属性还使用了信号 authorChanged(),以便在属性值更改时发出通知。

setAuthor函数中修改了m_author的值后,Q_PROPERTY声明的属性author的值也会相应地改变。这是因为在setAuthor函数中,当m_author的值发生变化时,通过emit authorChanged()语句发出了信号authorChanged(),这个信号与Q_PROPERTY中的NOTIFY关键字相关联。

Q_PROPERTYNOTIFY关键字用于指定一个信号,当属性的值发生变化时,会发出这个信号。在这种情况下,authorChanged()信号与author属性相关联,意味着当m_author的值发生变化时,会发出authorChanged()信号。

因此,当m_author的值在setAuthor函数中被修改时,会发出authorChanged()信号,这将导致与author属性相关联的代码(例如绑定到该属性的UI元素)能够接收到信号并相应地更新属性的值。

QString author() constMessage 类的成员函数,用于读取私有成员变量 m_author 的值并返回。

QString m_authorMessage 类的私有成员变量,用于存储作者的名称。

main 函数中,通过创建 Message 类的实例 msg,将其设置为上下文属性,使其可以在 QML 文件中访问。

MyItem.qml 中,通过 msg.author 可以读取 Message 类中的 author 属性值。这将调用 Message::author() 方法。

Component.onCompleted 中,将 msg.author 设置为 “Jonah”,这将调用 Message::setAuthor() 方法,并且在属性值更改后会发出 authorChanged() 信号。

在这里插入图片描述

2.Q_INVOKABLE()或public slots:将C++类的成员函数暴露给QML

Exposing Methods (Including Qt Slots):
在这里插入图片描述

3.on<Signal>其中<Signal>第一个字母大写:暴露C++中的信号以及信号中传递的参数给QML

在这里插入图片描述

翻译:

任何继承自QObject类型的公共信号都可以在QML代码中访问。

QML引擎会自动为在QML中使用的任何继承自QObject类型的信号创建信号处理器。信号处理器的命名规则是on<信号名>,其中<信号名>是信号的名称,首字母大写。通过参数名,可以在信号处理器中访问所有通过信号传递的参数。

例如,假设MessageBoard类具有一个带有单个参数subject的newMessagePosted()信号:

class MessageBoard : public QObject
{Q_OBJECT
public:// ...
signals:void newMessagePosted(const QString &subject);
};

如果MessageBoard类型已在QML类型系统中注册,那么在QML中声明的MessageBoard对象可以通过名为onNewMessagePosted的信号处理器接收newMessagePosted()信号,并检查subject参数的值:

MessageBoard {onNewMessagePosted: (subject)=> console.log("New message received:", subject)
}

二.qt笔记之qml和C++的交互笔记

原文链接:

QML进阶(八)实现QML界面与C++类型交互

在QML工程中,一般QML界面只负责前端交互,而真正的业务逻辑都是C++模块实现的。为了实现前端和后端的顺利衔接,我们需要做好QML界面与C++的交互。这里就介绍一下如何在QML中调用对应的C++模块。在QML中调用C++模块的方法主要有三种,分别是:

1.设置上下文属性(setContextProperty())
2.在QML引擎里面注册新类型(qmlRegisterType)
3.导出对应的QML扩展插件。

下面介绍一下三个方法的优缺点:
对于小型应用来说,方法一设置上下文属性是最简单实用的方法。开发者只需要将对应的接口和变量暴露给QML就行。由于设置在QML中的变量是全局的,一定要注意避免名称冲突。

在QML引擎里面注册新的类型,允许用户在QML文件中控制C++对象的生命周期,这是设置上下文属性这种方法无法实现的。同时注册新类型的方法,不会污染全局命名空间。但是这种方法也有一个缺点,就是QML中的类型都需要提前注册,所有用到的库都需要在程序启动的时候链接,无法动态链接。但在绝大多数情况下,这并不是一个问题。

QML扩展插件是弹性最好,但也是最复杂的方法。QML允许用户在插件里面注册对应的新类型。这些新类型在QML第一次导入对应的符号的时候被加载。同时,通过使用QML单例引入,我们的新类型不会污染全局命名空间。由于新类型被插件化了,我们可以很轻松的在多个项目中复用我们之前定义的新类型。

1.设置上下文属性(setContextProperty())

1.1.fileio.h

在这里插入图片描述

1.2.fileio.cpp

在这里插入图片描述

1.3.main.cc

在这里插入图片描述

1.4.main.qml

在这里插入图片描述

代码
fileio.h

#ifndef FILEIO_H
#define FILEIO_H#include <QtCore>
//用来打开的保存对应的文件
class FileIO : public QObject
{Q_OBJECT//定义QML可以访问的属性,定义格式如下//Q_PROPERTY(变量类型 访问名称 READ 读方法 WRITE 写方法 NOTIFY 发生变化的通知信号)//需要定义在Q_OBJECT之后第一个public之前Q_PROPERTY(QUrl source READ source WRITE setSource NOTIFY sourceChanged)Q_PROPERTY(QString text READ text WRITE setText NOTIFY textChanged)//ui_title是在QML使用的别名,m_title_content是对应的变量名称//CONSTANT说明是只读的Q_PROPERTY(QString ui_title MEMBER m_title_content CONSTANT)
public:FileIO(QObject *parent = 0);~FileIO();//定义QML可以访问的方法Q_INVOKABLE void read();Q_INVOKABLE void write();QUrl source() const;QString text() const;
public slots:void setSource(QUrl source);void setText(QString text);
signals:void sourceChanged(QUrl arg);void textChanged(QString arg);
private:QUrl m_file_source;QString m_file_content;//用来测试的只读title数据QString m_title_content;
};#endif // FILEIO_H

fileio.cpp

#include "fileio.h"
FileIO::FileIO(QObject *parent): QObject(parent),m_title_content(QString("fileio"))
{
}FileIO::~FileIO()
{
}void FileIO::read()
{if(m_file_source.isEmpty()) {return;}QFile file(m_file_source.toLocalFile());if(!file.exists()) {qWarning() << "Does not exits: " << m_file_source.toLocalFile();return;}if(file.open(QIODevice::ReadOnly)) {QTextStream stream(&file);m_file_content = stream.readAll();emit textChanged(m_file_content);}
}void FileIO::write()
{if(m_file_source.isEmpty()) {return;}QFile file(m_file_source.toLocalFile());if(file.open(QIODevice::WriteOnly)) {QTextStream stream(&file);stream << m_file_content;}
}QUrl FileIO::source() const
{return m_file_source;
}QString FileIO::text() const
{return m_file_content;
}void FileIO::setSource(QUrl source)
{if (m_file_source == source)return;m_file_source = source;emit sourceChanged(source);
}void FileIO::setText(QString text)
{if (m_file_content == text)return;m_file_content = text;emit textChanged(text);
}

main.cc

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include <QFont>
#include "fileio.h"
int main(int argc, char *argv[])
{QGuiApplication app(argc, argv);//根据不同的QT版本设置对应的编码app.setFont(QFont("Microsoft Yahei", 9));
#if (QT_VERSION <= QT_VERSION_CHECK(5,0,0))
#if _MSC_VERQTextCodec *codec = QTextCodec::codecForName("gbk");
#elseQTextCodec *codec = QTextCodec::codecForName("utf-8");
#endifQTextCodec::setCodecForLocale(codec);QTextCodec::setCodecForCStrings(codec);QTextCodec::setCodecForTr(codec);
#elseQTextCodec *codec = QTextCodec::codecForName("utf-8");QTextCodec::setCodecForLocale(codec);
#endif//定义对应的类型指针QScopedPointer<FileIO> current_file_io(new FileIO());QQmlApplicationEngine engine;//在加载对应的URL之前, 设置上下文属性engine.rootContext()->setContextProperty("qmlfileio",current_file_io.data());engine.load(QUrl(QStringLiteral("qrc:/main.qml")));if (engine.rootObjects().isEmpty())return -1;return app.exec();
}

main.qml

import QtQuick 2.8
import QtQuick.Window 2.2
import Qt.labs.platform 1.0Window {visible: truewidth: 440height: 300title: qsTr("Context fileIO")Column{Rectangle{id:contentRectx:10; y:10width: 400height: 150//用于显示打开的文本文件的内容Text{                id:contentanchors.top :contentRect.topanchors.bottom: contentRect.bottomanchors.left: contentRect.leftanchors.right: contentRect.righttext: qmlfileio.text}border.color: "#CCCCCC"}//点击的按钮用来选择对应的文件Rectangle{anchors.horizontalCenter:contentRect.horizontalCentercolor: "#4D9CF8"width:200height: 30Text{anchors.centerIn: parenttext:"点击打开文件"}MouseArea {anchors.fill: parentonClicked: {fileDialog.open();}}}}//文件选择窗口,选择需要打开的文件//并读取文件中对应的内容FileDialog{id: fileDialogfolder: StandardPaths.standardLocations(StandardPaths.PicturesLocation)[0]onFileChanged: {qmlfileio.source = fileDialog.file;qmlfileio.read();}}
}

2.在QML引擎里面注册新类型(qmlRegisterType)

2.1.fileio.h

在这里插入图片描述

2.2.fileio.cpp

在这里插入图片描述

2.3.main.cc

在这里插入图片描述

2.4.main.qml

在这里插入图片描述

代码
fileio.h

#ifndef FILEIO_H
#define FILEIO_H#include <QtCore>
//用来打开的保存对应的文件
class FileIO : public QObject
{Q_OBJECT//定义QML可以访问的属性,定义格式如下//Q_PROPERTY(变量类型 访问名称 READ 读方法 WRITE 写方法 NOTIFY 发生变化的通知信号)//需要定义在Q_OBJECT之后第一个public之前Q_PROPERTY(QUrl source READ source WRITE setSource NOTIFY sourceChanged)Q_PROPERTY(QString text READ text WRITE setText NOTIFY textChanged)//ui_title是在QML使用的别名,m_title_content是对应的变量名称//CONSTANT说明是只读的Q_PROPERTY(QString ui_title MEMBER m_title_content CONSTANT)
public:FileIO(QObject *parent = 0);~FileIO();//定义QML可以访问的方法Q_INVOKABLE void read();Q_INVOKABLE void write();QUrl source() const;QString text() const;
public slots:void setSource(QUrl source);void setText(QString text);
signals:void sourceChanged(QUrl arg);void textChanged(QString arg);
private:QUrl m_file_source;QString m_file_content;//用来测试的只读title数据QString m_title_content;
};#endif // FILEIO_H

fileio.cpp

#include "fileio.h"
FileIO::FileIO(QObject *parent): QObject(parent),m_title_content(QString("fileio"))
{
}FileIO::~FileIO()
{
}void FileIO::read()
{if(m_file_source.isEmpty()) {return;}QFile file(m_file_source.toLocalFile());if(!file.exists()) {qWarning() << "Does not exits: " << m_file_source.toLocalFile();return;}if(file.open(QIODevice::ReadOnly)) {QTextStream stream(&file);m_file_content = stream.readAll();emit textChanged(m_file_content);}
}void FileIO::write()
{if(m_file_source.isEmpty()) {return;}QFile file(m_file_source.toLocalFile());if(file.open(QIODevice::WriteOnly)) {QTextStream stream(&file);stream << m_file_content;}
}QUrl FileIO::source() const
{return m_file_source;
}QString FileIO::text() const
{return m_file_content;
}void FileIO::setSource(QUrl source)
{if (m_file_source == source)return;m_file_source = source;emit sourceChanged(source);
}void FileIO::setText(QString text)
{if (m_file_content == text)return;m_file_content = text;emit textChanged(text);
}

main.cc

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include <QFont>
#include "fileio.h"
int main(int argc, char *argv[])
{QGuiApplication app(argc, argv);//在engine声明之前注册C++类型//@1:类在qml中别名 @2:版本主版本号 @3:版本的次版本号 @4类的名称qmlRegisterType<FileIO>("org.fileio",1,0,"FileIO");QQmlApplicationEngine engine;engine.load(QUrl(QStringLiteral("qrc:/main.qml")));if (engine.rootObjects().isEmpty())return -1;return app.exec();
}

main.qml:import org.fileio 1.0

import QtQuick 2.8
import QtQuick.Window 2.2
import Qt.labs.platform 1.0
import org.fileio 1.0Window {visible: truewidth: 440height: 300title: qsTr("Context fileIO")Column{Rectangle{id:contentRectx:10; y:10width: 400height: 150//用于显示打开的文本文件的内容Text{                id:contentanchors.top :contentRect.topanchors.bottom: contentRect.bottomanchors.left: contentRect.leftanchors.right: contentRect.righttext: fileIO.text}border.color: "#CCCCCC"}//点击的按钮用来选择对应的文件Rectangle{anchors.horizontalCenter:contentRect.horizontalCentercolor: "#4D9CF8"width:200height: 30Text{anchors.centerIn: parenttext:"点击打开文件"}//点击按钮弹出选择文件的对话框MouseArea {anchors.fill: parentonClicked: {fileDialog.open();}}}}//文件选择窗口,选择需要打开的文件//并读取文件中对应的内容FileDialog{id: fileDialogfolder: StandardPaths.standardLocations(StandardPaths.PicturesLocation)[0]onFileChanged: {fileIO.source = fileDialog.file;fileIO.read();}}//外部导入的C++类型,可以直接定义使用//外部通过ID来访问该模块FileIO{id:fileIO}
}

3.导出对应的QML扩展插件——略

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/146123.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024年山东省职业院校技能大赛中职组“网络安全”赛项竞赛试题-B

2024年山东省职业院校技能大赛中职组 “网络安全”赛项竞赛试题-B 一、竞赛时间 总计&#xff1a;360分钟 二、竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 A、B模块 A-1 登录安全加固 180分钟 200分 A-2 本地安全策略设置 A-3 流量完整性保护 A-4 …

探索arkui(2)--- 布局(列表)--- 2(支持分组/实现响应滚动位置)

前端开发布局是指前端开发人员宣布他们开发的新网站或应用程序正式上线的活动。在前端开发布局中&#xff0c;开发人员通常会展示新网站或应用程序的设计、功能和用户体验&#xff0c;并向公众宣传新产品的特点和优势。前端开发布局通常是前端开发领域的重要事件&#xff0c;吸…

MongoDB分片集群搭建

----前言 mongodb分片 一般用得比较少&#xff0c;需要较多的服务器&#xff0c;还有三种的角色 一般把mongodb的副本集应用得好就足够用了&#xff0c;可搭建多套mongodb复本集 mongodb分片技术 mongodb副本集可以解决数据备份、读性能的问题&#xff0c;但由于mongodb副本集是…

创作者焦点:Temple of Dum-Dum(试炼 3)

《Bomkus 博士的试炼》创作的幕后花絮。 《创作者焦点》系列共分为六部分&#xff0c;重点介绍《Bomkus 博士的试炼》的游戏创作过程及其独特的游戏功能。 Temple of Dum-Dum&#xff1a; Temple of Dum-Dum 是 Bomkus 博士试炼中的第三个挑战&#xff0c;该试炼由六项体验组成…

SecureCRT 9.4.2 for Mac

SecureCRT是一款由VanDyke Software公司开发的终端仿真软件&#xff0c;它提供了类似于Telnet和SSH等协议的远程访问功能。SecureCRT专门为网络管理员、系统管理员和其他需要保密访问网络设备的用户设计。 SecureCRT具有以下特点&#xff1a; 安全性&#xff1a;SecureCRT支持…

windows服务器热备、负载均衡配置

安装网络负载平衡 需要加入的服务器上全部需要安装网络负载平衡管理器 图形化安装&#xff1a;使用服务器管理器安装 在服务器管理器中&#xff0c;使用“添加角色和功能”向导添加网络负载均衡功能。 完成向导后&#xff0c;将安装 NLB&#xff0c;并且不需要重启计算机。 …

337. 打家劫舍 III

小偷又发现了一个新的可行窃的地区。这个地区只有一个入口&#xff0c;我们称之为 root 。 除了 root 之外&#xff0c;每栋房子有且只有一个“父“房子与之相连。一番侦察之后&#xff0c;聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果 两个直接相连…

MATLAB中zticks函数用法

目录 语法 说明 示例 指定 z 轴刻度值和标签 指定非均匀 z 轴刻度值 以 2 为增量递增 z 轴刻度值 将 z 轴刻度值设置回默认值 指定特定坐标区的 z 轴刻度值 删除 z 轴刻度线 zticks函数的功能是设置或查询 z 轴刻度值。 语法 zticks(ticks) zt zticks zticks(auto)…

ReportLab创建合同PDF

一、前言 有一个项目需要将电子签名后的报价合同和生成的发票发送给客户&#xff0c;这种发送给客户的文件一般都是使用PDF格式&#xff0c;主要是因为PDF特别适合阅读且不同平台打开文件格式不会变形&#xff0c;不过要在程序中生成PDF还是比较麻烦的&#xff0c;我们的发票是…

TCP与UDP协议

TCP与UDP协议 1、TCP协议&#xff1a; 1、TCP特性&#xff1a; TCP 提供一种面向连接的、可靠的字节流服务。在一个 TCP 连接中&#xff0c;仅有两方进行彼此通信。广播和多播不能用于 TCP。TCP 使用校验和&#xff0c;确认和重传机制来保证可靠传输。TCP 给数据分节进行排序…

AdaBoost 算法:理解、实现和掌握 AdaBoost

一、介绍 Boosting 是一种集成建模技术&#xff0c;由 Freund 和 Schapire 于 1997 年首次提出。从那时起&#xff0c;Boosting 就成为解决二元分类问题的流行技术。这些算法通过将大量弱学习器转换为强学习器来提高预测能力 。 Boosting 算法背后的原理是&#xff0c;我们首先…

万宾科技智能传感器EN100-C2有什么作用?

在日常生活中井盖是一种常见的城市设施&#xff0c;但井盖出现问题可能会对人们的生活造成什么影响呢&#xff1f;移位或老化的井盖可能会威胁人们的安全&#xff0c;同时也会影响城市生命线的正常运行。然而智能井盖的出现为解决这些问题提供了有效的应对方案。 WITBEE万宾智能…

udp多点通信-广播-组播

单播 每次只有两个实体相互通信&#xff0c;发送端和接收端都是唯一确定的。 广播 主机之间的一对多的通信所有的主机都可以接收到广播消息(不管你是否需要)广播禁止穿过路由器&#xff08;只能做局域网通信&#xff09;只有UDP可以广播广播地址 有效网络号全是1的主机号 192.1…

Pikachu(皮卡丘靶场)初识XSS(常见标签事件及payload总结)

目录 1、反射型xss(get) 2、反射性xss(post) 3、存储型xss 4、DOM型xss 5、DOM型xss-x XSS又叫跨站脚本攻击&#xff0c;是HTML代码注入&#xff0c;通过对网页注入浏览器可执行代码&#xff0c;从而实现攻击。 ​ 1、反射型xss(get) Which NBA player do you like? 由…

nvm安装详细教程(卸载旧的nodejs,安装nvm、node、npm、cnpm、yarn及环境变量配置)

文章目录 一、完全卸载旧的nodejs1、打开系统的控制面板&#xff0c;点击卸载程序&#xff0c;卸载nodejs&#xff08;1&#xff09;打开系统的控制面板&#xff0c;点击程序下的卸载程序&#xff08;2&#xff09;找到node.js&#xff0c;鼠标右击出现下拉框&#xff0c;点卸载…

YOLO改进系列之注意力机制(EffectiveSE模型介绍)

模型结构 ESE(Effective Squeeze and Extraction) layer是CenterMask模型中的一个block&#xff0c;基于SE&#xff08;Squeeze and Extraction&#xff09;改进得到。与SE的区别在于&#xff0c;ESE block只有一个fc层&#xff0c;(CenterMask : Real-Time Anchor-Free Insta…

【git】远程远程仓库命令操作详解

这篇文章主要是针对git的命令行操作进行讲解&#xff0c;工具操作的基础也是命令行&#xff0c;如果基本命令操作都不理解&#xff0c;就算是会工具操作&#xff0c;真正遇到问题还是一脸懵逼 如果需要查看本地仓库的详细操作可以看我上篇文件 【git】git本地仓库命令操作详解…

IIC总线概述和通信时序代码详细图文解析

IIC总线 1 IIC总线概述 I2C总线两线制包括&#xff1a;串行数据SDA&#xff08;Serial Data&#xff09;、串行时钟SCL&#xff08;Serial Clock&#xff09;。总线必须由主机&#xff08;通常为微控制器&#xff09;控制&#xff0c;主机产生串行时钟&#xff08;SCL&#x…

Linux安装DMETL5与卸载

Linux安装DMETL5与卸载 环境介绍1 DM8数据库配置1.1 DM8数据库安装1.2 初始化达梦数据库1.3 创建DMETL使用的数据库用户 2 配置DMETL52.1 解压DMETL5安装包2.2 安装调度器2.3 安装执行器2.4 安装管理器2.5 启动dmetl5 调度器2.6 启动dmetl5 执行器2.7 启动dmetl5 管理器2.8 查看…

跨境电商与文化多样性:市场中的机遇

在数字时代&#xff0c;跨境电商已经成为全球贸易的主要驱动力之一。随着互联网的普及和物流的改善&#xff0c;企业有机会将产品和服务推向全球市场。 然而&#xff0c;随着全球市场的扩大&#xff0c;文化多样性也成为了一个重要的考虑因素。本文将深入探讨跨境电商与文化多…