Qt6和Rust结合构建桌面应用
桌面应用程序是原生的、快速的、安全的,并提供Web应用程序无法比拟的体验。
Rust 是一种低级静态类型多范式编程语言,专注于安全性和性能,解决了 C/C++ 长期以来一直在努力解决的问题,例如内存错误和构建并发程序。
在桌面应用程序开发中使用的所有编程语言中,Rust逐渐成为受欢迎的语言之一。Rust被广泛认为是可靠的、高性能的、多产的和通用的。事实上,许多组织正在将其应用程序迁移到Rust。GNOME Linux开发环境就是一个例子。
1、Rust Qt框架选择
Rust有几个Qt绑定。最受欢迎的是Ritual,CXX-Qt和qmetaobject
。Ritual不再维护,qmetaobject
不支持QWidgets
。所以CXX-Qt是我们目前最好的选择
Rust是一门相对较新的语言。生态系统也是如此。CXX-Qt不如PyQt成熟。但它在去那里的路上。目前最新的版本已经有了一个好的和简单的API。
2、搭建rust和qt
开始使用Rust和Qt
使用以下命令安装Rust:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
如果您https://rustup.rs/要确保一切正常,请在终端中运行以下命令:
rustc --version
接下来,安装Qt:
# Ubuntu
sudo apt install qt6-base-dev qt6-declarative-dev# Fedora
sudo dnf install qt6-qtbase-devel qt6-qtdeclarative-devel# If you are unsure. Just install all Qt dependencies
# It is no more than 200 MB
sudo apt install qt6*
sudo dnf install qt6*
要检查Qt是否成功安装,请检查您是否能够运行以下命令:
qmake --version
应用组件
CXX-Qt是Rust Qt绑定。它为Qt代码和Rust之间的桥接提供了一种安全的机制。与典型的一对一绑定不同。CXX-Qt使用CXX来桥接Qt和Rust。这提供了更强大的代码,安全的API,以及两个代码之间的安全多线程。与之前的版本不同。在最新版本中,您不需要接触任何C++代码。
QML是一种开发用户界面的编程语言。它非常易读,因为它提供了类似JSON的语法。QML还支持命令式JavaScript表达式和动态属性绑定;这将有助于编写凯撒密码应用程序。如果您需要复习,请参阅此QML介绍。
Qt应用演示
为了演示如何使用Qt和Rust,我们将构建一个简单的“Hello World”应用程序。
创建Rust项目
首先,我们需要创建一个Rust项目,如下所示:
❯ cargo new --bin demoCreated binary (application) `demo` package
接下来,打开Cargo.toml
文件并添加依赖项:
[dependencies] cxx = "1.0.83" cxx-qt = "0.5" cxx-qt-lib = "0.5"[build-dependencies] cxx-qt-build = "0.5"
现在,让我们为应用程序创建入口点。在src/main.rs
文件中,我们将初始化GUI应用程序和QML引擎。然后我们将加载QML文件并告诉应用程序启动:
use cxx_qt_lib::{QGuiApplication, QQmlApplicationEngine, QUrl};fn main() {// Create the application and enginelet mut app = QGuiApplication::new();let mut engine = QQmlApplicationEngine::new();// Load the QML path into the engineif let Some(engine) = engine.as_mut() {engine.load(&QUrl::from("qrc:/main.qml"));}// Start the appif let Some(app) = app.as_mut() {app.exec();}
}
为了在Rust和Qt之间建立通信,我们将在src/cxxqt_oject.rs
文件中定义对象:
// src/cxxqt_object.rs#[cxx_qt::bridge]
mod my_object {#[cxx_qt::qobject(qml_uri = "demo", qml_version = "1.0")]#[derive(Default)]pub struct Hello {}impl qobject::Hello {#[qinvokable]pub fn say_hello(&self) {println!("Hello world!")}}
}
属性宏用于启用CXX-Qt功能。
#[cxx_qt::bridge]
:标记Rust模块能够与C++交互#[cxx_qt::qobject]
:将Rust结构体作为QObject子类公开给Qt#[qinvokable]
:将QObject上的函数作为Q_INVOKABLE暴露给QML和C++。
接下来,我们将创建一个名为struct
的Hello
,它派生自qobject
traits。然后我们可以实现常规的Rust函数来打印问候语:
// src/main.rs+ mod cxxqt_object;use cxx_qt_lib::{QGuiApplication, QQmlApplicationEngine, QUrl};
设计UI
我们将使用QML来设计用户界面。UI文件位于qml/main.qml
文件中:
Hello {id: hello}Column {anchors.horizontalCenter: parent.horizontalCenteranchors.verticalCenter: parent.verticalCenter/* space between widget */spacing: 10Button {text: "Say Hello!"onClicked: hello.sayHello()}}
}
如果你仔细观察sayHello
函数,你会注意到CXX-Qt将Rust函数的snake case转换为camelCase C++约定。现在,我们的QML代码看起来并不奇怪!
接下来,我们必须使用Qt资源文件告诉Qt QML的位置。它应该位于qml/qml.qrc
文件中:
<!DOCTYPE RCC> <RCC version="1.0"><qresource prefix="/"><file>main.qml</file></qresource> </RCC>
构建应用程序
最后一步是构建应用程序。为了教Rust如何构建cxxqt_object.rs
和QML文件,我们需要首先在build.rs
文件中定义它:
fn main() {CxxQtBuilder::new()// Link Qt's Network library// - Qt Core is always linked// - Qt Gui is linked by enabling the qt_gui Cargo feature (default).// - Qt Qml is linked by enabling the qt_qml Cargo feature (default).// - Qt Qml requires linking Qt Network on macOS.qt_module("Network")// Generate C++ from the `#[cxx_qt::bridge]` module.file("src/cxxqt_object.rs")// Generate C++ code from the .qrc file with the rcc tool// https://doc.qt.io/qt-6/resources.html.qrc("qml/qml.qrc").setup_linker().build();
}
最终的结构应该是这样的:
现在,让我们使用cargo check
来确保我们有一个正确的代码。
# `cargo c` is an alias to `cargo check` ❯ cargo cFinished dev [unoptimized + debuginfo] target(s) in 0.04s
最后,让我们运行应用程序:
⬢ ❯ cargo --quiet rCompiling demo v0.1.0Finished dev [unoptimized + debuginfo] target(s) in 0.49sRunning `target/debug/demo` Hello world!
Rust和qt的结合会带来新的碰撞和可能。
相关文章:
Qt6和Rust结合构建桌面应用
桌面应用程序是原生的、快速的、安全的,并提供Web应用程序无法比拟的体验。 Rust 是一种低级静态类型多范式编程语言,专注于安全性和性能,解决了 C/C 长期以来一直在努力解决的问题,例如内存错误和构建并发程序。 在桌面应用程序开…...
Kubernetes(K8S)简介
Kubernetes (K8S) 是什么 它是一个为 容器化 应用提供集群部署和管理的开源工具,由 Google 开发。Kubernetes 这个名字源于希腊语,意为“舵手”或“飞行员”。k8s 这个缩写是因为 k 和 s 之间有八个字符的关系。 Google 在 2014 年开源了 Kubernetes 项…...
面试中问:React中函数组件和class组件的区别,hooks模拟生命周期
React中函数组件和class组件的区别,hooks模拟生命周期 React中函数组件和class组件的区别hooks模拟生命周期 React中函数组件和class组件的区别 函数组件: 定义:函数组件是使用纯函数定义的组件,它接受 props 作为参数并返回 JSX。简洁性&am…...
Python高光谱遥感数据处理与高光谱遥感机器学习方法应用
本文提供一套基于Python编程工具的高光谱数据处理方法和应用案例。 本文涵盖高光谱遥感的基础、方法和实践。基础篇以学员为中心,用通俗易懂的语言解释高光谱的基本概念和理论,旨在帮助学员深入理解科学原理。方法篇结合Python编程工具,专注…...
Java实现接收xml格式数据并解析,返回xml格式数据
需求描述:后端接受xml格式数据,解析出相应数据,并返回xml格式数据。 <!--XML解析--><dependency><groupId>com.fasterxml.jackson.dataformat</groupId><artifactId>jackson-dataformat-xml</artifactId>…...
【C++】初步认识模板
🏖️作者:malloc不出对象 ⛺专栏:C的学习之路 👦个人简介:一名双非本科院校大二在读的科班编程菜鸟,努力编程只为赶上各位大佬的步伐🙈🙈 目录 前言一、泛型编程二、函数模板2.1 函…...
Ansible 临时命令搭建安装仓库
创建一个名为/ansible/yum.sh 的 shell 脚本,该脚本将使用 Ansible 临时命令在各个受管节点上安装 yum 存储库. 存储库1: 存储库的名称为 EX294_BASE 描述为 EX294 base software 基础 URL 为 http://content/rhel8.0/x86_64/dvd/BaseOS GPG 签名检查为…...
phpstorm动态调试
首先在phpstudy搭建好网站,在管理拓展开启xdebug拓展 查看php.ini配置已经更改 需要增添修改一下设置 [Xdebug] zend_extensionD:/phpstudy_pro/Extensions/php/php5.6.9nts/ext/php_xdebug.dll xdebug.collect_params1 xdebug.collect_return1 xdebug.auto_trace…...
二叉树的层序遍历及完全二叉树的判断
文章目录 1.二叉树层序遍历 2.完全二叉树的判断 文章内容 1.二叉树层序遍历 二叉树的层序遍历需要一个队列来帮助实现。 我们在队列中存储的是节点的地址,所以我们要对队列结构体的数据域重定义, 以上代码 从逻辑上来讲就是1入队,1出队&am…...
java八股文面试[JVM]——JVM内存结构
参考: JVM学习笔记(一)_卷心菜不卷Iris的博客-CSDN博客 JVM是运行在操作系统之上的,它与硬件没有直接的交互 JVM内存结构: 方法区:存储已被虚拟机加载的类元数据信息(元空间) 堆:存放对象实…...
Kafka基本使用
查看Kafka的进程是否在运行 #命令行终端中运行如下命令 ps -ef | grep kafkafind / -iname kafka-server-start.shcd /usr/local/kafka/bin/#启动kafka ./kafka-server-start.sh -daemon /usr/local/kafka/config/server.propertiesKafka默认使用9092端口提供服务…...
【目标检测】理论篇(2)YOLOv3网络构架及其代码实现
网络构架图: 代码实现: import math from collections import OrderedDictimport torch.nn as nn#---------------------------------------------------------------------# # 残差结构 # 利用一个1x1卷积下降通道数,然后利用一个3x3卷…...
k8s之工作负载、Deployment、DaemonSet、StatefulSet、Job、CronJob及GC
文章目录 1、工作负载1.1、定义1.2、分类 2、Deployment2.1、定义2.2、Deployment创建2.3、Deployment 更新机制2.3.1、比例缩放(Proportional Scaling)2.3.2、HPA(动态扩缩容)2.3.2.1、需要先安装metrics-server2.3.2.2、配置hpa…...
IDEA项目实践——Element UI概述
系列文章目录 IDEA项目实践——JavaWeb简介以及Servlet编程实战 IDEA项目实践——Spring当中的切面AOP IDEA项目实践——Spring框架简介,以及IOC注解 IDEA项目实践——动态SQL、关系映射、注解开发 IDEWA项目实践——mybatis的一些基本原理以及案例 文章目录 …...
Docker 容器学习笔记
Docker 容器学习笔记 容器的由来 早先,虚拟机通过操作系统实现相互隔离,保证应用程序在运行时相互独立,避免相互干扰。但是操作系统又笨又重,耗费资源严重: 容器技术只隔离应用程序的运行时环境但容器之间共享同一个…...
Day03-vue基础
Day03-vue基础 一 列表渲染 v-for这个指令可以实现列表渲染 1 数组 <ul><!-- v-for遍历的时候,key必须赋唯一值第一个参数是数组元素,第二个参数是元素下标--><li v-for="(item,index) in [1,3,5,7]" :key="item">{{item}}--{{index}…...
RAC sid=‘*‘ 最好加上 v$system_parameter
实验结论:在RAC环境中,最好修改参数sid* 安全可靠,因为暂时未明确知道哪些参数是默认全局修改,什么参数是默认单节点修改的,* 靠谱,不容易出问题 在RAC环境中,修改全局参数scopespfile生效时&am…...
【位运算进阶之----左移(<<)】
今天我们来谈谈左移这件事。 ❤️简单来说,对一个数左移就是在其的二进制表达末尾添0。左移一位添一个0,结果就是乘以2;左移两位添两个0,结果就乘以2 ^ 2;左移n位添n个0,结果就是乘以2 ^ n,小心…...
石油石化行业网络监控运维方案,全局态势感知,实时预警
石油石化行业是一个高科技密集型行业,投资巨大、人员众多,各产业价值链的关联度较高,大型石油石化企业实现了上中下游产业的一体化协同发展。随着工业4.0时代的来临,信息化和工业化融合,物联网、云计算等新技术的普及推…...
MyBatis 的关联关系配置 一对多,一对一,多对多 关系的映射处理
目录 一.关联关系配置的好处 二. 导入数据库表: 三. 一对多关系:-- 一个订单对应多个订单项 四.一对一关系:---一个订单项对应一个订单 五.多对多关系(两个一对多) 一.关联关系配置的好处 MyBatis是一…...
Diffusion Models for Image Restoration and Enhancement – A Comprehensive Survey
图像恢复与增强的扩散模型综述 论文链接:https://arxiv.org/abs/2308.09388 项目地址:https://github.com/lixinustc/Awesome-diffusion-model-for-image-processing/ Abstract 图像恢复(IR)一直是低水平视觉领域不可或缺的一项具有挑战性的任务&…...
Springboot开发所遇问题(持续更新)
SpringBoot特征: 1. SpringBoot Starter:他将常用的依赖分组进行了整合,将其合并到一个依赖中,这样就可以一次性添加到项目的Maven或Gradle构建中。 2,使编码变得简单,SpringBoot采用 JavaConfig的方式对Spring进行配置…...
智能电视与win10电脑后续无法实现DLNA屏幕共享
问题背景: 我用的是TCL电视,但是并不是最新,打开的方式是U盘->电脑,各位看自己情况,很多问题都大概率是智能电视问题。 情景假设: 假设你已经完成原先智能电视该有的步骤,通过DLNA…...
如何可以管理监督员工工作微信?
自从微信管理系统研发上线之后,为了各企业带来了福音。 很多用户企业都是这样评论微信管理系统的:员工的所有微信聊天记录后台都可以清楚明了的看到,聊天记录都是永久保存的,不担心员工在手机上把聊天记录删除,杜绝员…...
【Django】如何转化已有的数据表到Django模型--20230823
初步生成model.py $ python manage.py inspectdb $ python manage.py inspectdb > models.py python manage.py inspectdb # This is an auto-generated Django model module. # Youll have to do the following manually to clean this up: # * Rearrange models order…...
【C语言】喝汽水问题
大家好!今天我们来学习C语言中的喝汽水问题! 目录 1. 题目内容: 2. 思路分析 2.1 方法一 2.2 方法二 2.3 方法三 3. 代码实现 3.1 方法一 3.2 方法二 3.3 方法三 1. 题目内容 喝汽水,1瓶汽水1元,2个空瓶可以…...
项目进度管理(4-2)关键链法和关键路径法的区别和联系
1 关键链法和关键路径法的主要区别 1.1 关键链法和关键路径法的关注焦点不同 关键路径法(CPM):关注项目中最长的路径,也就是所需时间最长的路径,这被称为关键路径。关键路径决定了项目的最早完成时间。关键链法&…...
基于Java+SpringBoot+Vue前后端分离医院后台管理系统设计和实现
博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…...
二维数组传参
在C语言中,可以通过指针来传递二维数组。二维数组实际上是一个连续的内存块,可以使用指针来表示二维数组的行和列。以下是一个示例: #include <stdio.h>void myFunction(int arr[][3], int rows) {for (int i 0; i < rows; i) {fo…...
AI 绘画Stable Diffusion 研究(十四)SD 图生图+剪映制作人物说话视频
大家好,我是风雨无阻。 前一篇,我们详细介绍了使用 SadTlaker制作数字人视频案例,感兴趣的朋友请前往查看:AI 绘画Stable Diffusion 研究(十三)SD数字人制作工具SadTlaker使用教程。 对于没有安装 SadTlaker 插件的朋友…...
网络代理免费/百度seo排名优化公司哪家好
公告 :本博客为微软云计算中文博客 的镜像博客。 部分文章因为博客兼容性问题 ,会影响阅读体验 。如遇此情况,请访问 原博客 。 网易科技 讯 10月6日消息,据国外媒体报道,微软CEO史蒂夫鲍尔默 …...
.net网站方案/seo是什么服务器
在OAF页面的查找后台的数据源相对于在Form中显得更加麻烦,同时也无法像Form中那样能够较为准确的定位,但是也能够查找出大部分的内容。 本文介绍如何使用OAF提供的诊断功能来快速查找OAF页面对应的数据库对象: 关于本页功能(About this Page)…...
搭建网站挣钱/网易疫情实时最新数据
负责控制信号的输入和输出叫做使能,是一个动词,英文‘Enable’。英文Enable,前缀en-就是使的意思,able就是能够。合起来就是使能。使能通俗点说就是一个“允许”信号,进给使能也就是允许进给的信号,也就是说…...
温州优化网站/刘雯每日资讯
IEC62087音视频类设备功耗测量方法;南非偏差:SANS 941 2009年7月23日,欧委会在其官方公报(OJ)上公布了ErP的电视机实施条例(EC) No 642/2009,并于2009年8月12日开始生效。该条例主要 规定了电视机的生态设计…...
网站关键词做标签/百度免费安装下载
小白向单片机笔记七:电机前言一、电机驱动电机单极性步进电机原理图ULN2003D驱动芯片二、代码1.直流电机中断初始化函数 interrupt_utils.h主函数2.步进电机时延函数delay.h中断初始化函数interrupt_utils.h电机控制相关函数step_utils.h主函数前言 ULN2003D芯片&a…...
投注类网站怎么做自动软件/2024年新冠疫情最新消息今天
风格化Stylize阈值 Threshold与 Ps 中的阈值调整命令一致,将灰度或彩色图像转换纯黑与纯白效果。画笔描边 Brush Strokes与 Ps 滤镜库中的画笔描边中的喷溅效果基本一致,对图像应用粗糙的绘画外观效果。卡通 Cartoon模拟实色填充或描线的绘画。半径越大&…...