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.rhkb.cn/news/194556.html

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

相关文章

【python】均值、中值和高斯滤波详解和示例

本文对均值、中值和高斯滤波进行详解&#xff0c;以帮助大家理解和使用。 这里写目录标题 均值滤波中值滤波高斯滤波核大小为&#xff08;9,9&#xff09;核大小为&#xff08;51,51&#xff09; 小结 下面是示例中使用的原图。 均值滤波 均值滤波是一种简单的平滑滤波器&…

nodejs+vue教室管理系统的设计与实现-微信小程序-安卓-python-PHP-计算机毕业设计

用户 用户管理&#xff1a;查看&#xff0c;修改自己的个人信息 教室预约&#xff1a;可以预约今天明天的教室&#xff0c;按着时间段预约&#xff08;可多选&#xff09;&#xff0c;如果当前时间超过预约时间段不能预约该时间段的教室 预约教室的时候要有个预约用途&#xff…

python趣味编程-5分钟实现一个Flappy Bird游戏(含源码、步骤讲解)

Python 中的 Flappy Bird 游戏可以免费下载开源代码,它是为想要学习 Python 的初学者创建的。 该项目系统使用了 Pygame 和 Random 模块。 Pygame 是一组跨平台的 Python 模块,专为编写视频游戏而设计。 Python 中的 Flappy Bird 代码 – 项目信息 项目名称:Python 中的 Fl…

redis设置密码

首先到redis的下载目录下&#xff1a;运行 redis-cli 查看redis密码&#xff1a; config get requirepass 设置redis密码为123456&#xff1a; config set requirepass 123456

Spring SPI

SPI 服务供给接口&#xff08;Service Provider Interface&#xff09;。是Java 1.5新添加的一个内置标准&#xff0c;允许不同的开发者去实现某个特定的服务。 1 SPI 介绍 一个接口&#xff0c;可能会有许多个实现&#xff0c;我们在编写代码时希望能动态切换具体实现&#…

基于STM32的循迹小车项目实战

循迹小车是一种能够沿着预定路线行驶的智能小车&#xff0c;通过巡线传感器检测路面的线路&#xff0c;并根据检测结果调整行驶方向。本项目将基于STM32微控制器实现一个简单的循迹小车&#xff0c;通过学习和实践&#xff0c;帮助初学者熟悉STM32的开发流程和掌握循迹小车的实…

linux运行java程序

这个帖子实现的是linux上运行java代码 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 事情发生的原因是博洋需要知道海外城市的数量&#xff0c;我一开始准备将全量数据拉取到本地&#xff0c;用代码遍历一遍。但是打包好全量数据&…

CentOS中安装常用环境

一、CentOS安装 redis ①&#xff1a;更新yum sudo yum update②&#xff1a;安装 EPEL 存储库 Redis 通常位于 EPEL 存储库中。运行以下命令安装 EPEL 存储库 sudo yum install epel-release③&#xff1a;安装 Redis sudo yum install redis④&#xff1a;启动 Redis 服…

MYSQL中的触发器TRIGGER

1.概念 触发器是一个特殊的存储过程&#xff0c;当触发器保护的数据发生变更时就会触发。 2.特性 1.触发器与表息息相关&#xff0c;一般我们一个表创建六个触发器。 2.六个触发器其实是三种类六个 insert 类型 before | after insertupdate 类型 before | af…

STM32中断看这一篇就够了

&#x1f64c;秋名山码民的主页 &#x1f602;oi退役选手&#xff0c;Java、大数据、单片机、IoT均有所涉猎&#xff0c;热爱技术&#xff0c;技术无罪 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; 获取源码&#xff0c;添加WX 目录 1. 前言…

基于SSM的教学管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

【Proteus仿真】【Arduino单片机】HC05蓝牙通信

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器&#xff0c;使用PCF8574、LCD1602液晶、HC05蓝牙传感器等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD1602显示蓝牙接收数据。 二、软件设计 /* 作者…

MR外包团队:MR、XR混合现实技术应用于游戏、培训,心理咨询、教育成为一种创新的各行业MR、XR形式!

随着VR、AR、XR、MR混合现实等技术逐渐应用于游戏开发、心理咨询、培训、教育各个领域&#xff0c;为教育、培训、心理咨询等行业带来了全新的可能性。MR、XR游戏开发、心理咨询是利用虚拟现实技术模拟真实场景&#xff0c;让学生身临其境地参与学习和体验&#xff0c;从而提高…

MapApp 地图应用

1. 简述 1.1 重点 1&#xff09;更好地理解 MVVM 架构 2&#xff09;更轻松地使用 SwiftUI 框架、对齐、动画和转换 1.2 资源下载地址: Swiftful-Thinking:https://www.swiftful-thinking.com/downloads 1.3 项目结构图: 1.4 图片、颜色资源文件图: 1.5 启动图片配置图: 2. Mo…

Linux | 安装openGauss数据库

Linux 安装openGauss数据库 今天我们来安装一下国产数据库openGauss~~ 下载openGauss 首先在官网:https://opengauss.org/zh/download/下载对应的安装包&#xff0c;我们这里下载LInux 极简版来演示安装 下载后,使用root用户上传到Linux ,这边上传到/usr/local/目录下, 使用…

IoC和DI

Spring 是包含众多工具的 IoC 容器,存的是对象,对象这个词在 Spring 的范围内,称之为 bean IoC 是控制反转 控制权进行了反转,比如对某一个东西的控制权在 A 手上,结果变成了 B ,Spring 管理的是 bean ,所以这里的控制权指的是 bean 的控制权,也就是对象的控制权进行了反转 …

SAP PI/PO中使用UDF解决按字节拆分字符串的需求

需求背景&#xff1a; SAP需要将采购订单信息通过PI发送到SFTP服务器上&#xff0c;生成文件&#xff0c;一般对日项目上文件内容通常都是按照指定的字节数拆分的&#xff0c;而不是字符数&#xff0c;类似下面的格式。 问题点&#xff1a; 如果是使用FTP适配器&#xff0c;则…

MySQL JDBC编程

MySQL JDBC编程 文章目录 MySQL JDBC编程1. 数据库编程的必备条件2. Java的数据库编程&#xff1a;JDBC3. JDBC工作原理4. JDBC使用5. JDBC常用接口和类5.1 JDBC API5.2 数据库连接Connection5.3 Statement对象5.4 ResultSet对象 1. 数据库编程的必备条件 编程语言&#xff1a;…

[PyTorch][chapter 63][强化学习-时序差分学习]

目录&#xff1a; 蒙特卡罗强化学习的问题 基于转移的策略评估 时序差分评估 Sarsa-算法 Q-学习算法 一 蒙特卡罗强化学习的的问题 有模型学习&#xff1a; Bellman 等式 免模型学习: 蒙特卡罗强化学习 迭代&#xff1a; 使用策略 生成一个轨迹&#xff0c; for t…

京联易捷科技与劳埃德私募基金管理有限公司达成合作协议签署

京联易捷科技与劳埃德私募基金管理有限公司今日宣布正式签署合作协议,双方在数字化进程、资产管理与投资以及中英金融合作方面将展开全面合作。 劳埃德(中国)私募基金管理有限公司是英国劳埃德私募基金管理有限公司的全资子公司,拥有丰富的跨境投资经验和卓越的募资能力。该集…