Qt6和Rust结合构建桌面应用

news2024/11/25 14:32:02

桌面应用程序是原生的、快速的、安全的,并提供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 demo
     Created 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 engine
    let mut app = QGuiApplication::new();
    let mut engine = QQmlApplicationEngine::new();

    // Load the QML path into the engine
    if let Some(engine) = engine.as_mut() {
        engine.load(&QUrl::from("qrc:/main.qml"));
    }

    // Start the app
    if 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++。

接下来,我们将创建一个名为structHello,它派生自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.horizontalCenter
        anchors.verticalCenter: parent.verticalCenter
        /* space between widget */
        spacing: 10

        Button {
            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 c
  Finished dev [unoptimized + debuginfo] target(s) in 0.04s

 最后,让我们运行应用程序:

⬢ ❯ cargo --quiet r
   Compiling demo v0.1.0
    Finished dev [unoptimized + debuginfo] target(s) in 0.49s
     Running `target/debug/demo`
Hello world!

 

Rust和qt的结合会带来新的碰撞和可能。

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

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

相关文章

如何给开源仓库提交pull request?

Pull Request&#xff08;PR&#xff09;是一种在基于版本控制系统的协作开发中使用的功能&#xff0c;它允许开发人员将自己所做的代码更改&#xff08;commits&#xff09;提交给项目的主要代码库。具体而言&#xff0c;当在分支中做出代码更新后&#xff0c;开发人员可以发起…

射频有源器件的动态范围和交越失真

射频有源器件的动态范围和交越失真 1、增益压缩 一个输入信号Vin经过一个非线性网络后输出为Vout&#xff0c;Vout与Vin用泰勒级数的关系表示&#xff1a; Vout a0 a1*Vin a2*Vin^2 a3*Vin^3 …… a0为直流输出&#xff0c;a1为线性输出&#xff0c;a2为平方输出&…

Android 基础知识

一、Activity 1、onSaveInstanceState(),onRestoreInstanceState的调用时机 onSaveInstanceState 调用时机 从最近应用中选择运行其他程序时 但用户按下Home键时 屏幕方向切换时 按下电源案件时 从当前activity启动一个新的activity时 onRestorInstanceState调用时机 只…

windows下安装go环境 和vscode中go扩展

1. 首先安装GO Go下载地址&#xff1a;go.dev 选择相对应的版本&#xff0c;下载&#xff0c;运行安装程序&#xff0c;并打开命令提示符&#xff0c;运行 go env &#xff0c;确认已经安装go 注意关注其中GOPATH和GOROOT&#xff0c;这两个地址可以在系统环境变量中进行设置…

在其他python环境中使用jupyter notebook

1、切换到目标python环境 activate 目标python环境 2、安装notebook内核包 pip install ipykernel 3、加环境加入到notebook中 python -m ipykernel install 目标python环境 4、切换到base环境 activate base 5、打开目标项目的对应盘 如果&#xff0c;项目在c盘&…

docker-maven-plugin直接把镜像推到私有仓库

接着上篇 推送到本地docker 我们已经把服务做成镜像推到docker&#xff0c;也可以通过docker login 私有地址&#xff0c;去push。麻烦 直接上代码 1、pom改动 <properties><docker.registry>eco-registry.XXX.com</docker.repostory><docker.registry…

云从科技“AI困局”:上半年营收腰斩、亏损超3亿

“AI四小龙”云从科技难“从容”&#xff1f; 8月12日&#xff0c;云从科技集团股份有限公司(下称“云从科技”,688327.SH)公布了2023半年报。上半年云从科技推出“从容”大模型&#xff0c;但此后其迎来大规模解禁。 5月29日&#xff0c;云从科技宣布将4.55亿股股份解除限售…

如何选择合适的供应商管理系统?

供应商管理系统可以对企业的业务及其日常运营产生深远影响。该解决方案可集中管理采购、预算编制、供应商选择、交付跟踪、发票开具和报告。管理这些流程既费时又费钱&#xff0c;这也解释了为什么一半以上的企业目前都将数字化转型作为重中之重。 但是&#xff0c;如何选择合…

MediaPlayer音频与视频的播放介绍

作者&#xff1a;向阳逐梦 Android多媒体中的——MediaPlayer&#xff0c;我们可以通过这个API来播放音频和视频该类是Androd多媒体框架中的一个重要组件&#xff0c;通过该类&#xff0c;我们可以以最小的步骤来获取&#xff0c;解码和播放音视频。 它支持三种不同的媒体来源…

Binder通信的核心思想

Binder到底是什么&#xff1f;Binder通信到底是怎么实现的&#xff1f;脱离复杂的Android Framework代码&#xff0c;用最简单的方式来理解下什么是Binder通信。 关于IPC通信 在Linux系统中&#xff0c;正常运行的两个进程A和B&#xff0c;它们之间如果要进行数据的通信&#x…

iview时间控件 动态不可选日期 可选择24小时范围内 时间往后退24小时

演示 html 设定 起始时间 触发on-change 方法结束时间 options 动态设置不可选择的日期。 <!-- 起始时间 --> <FormItem :label"$t(startTime)" prop"startTime"><DatePickertransfertype"datetime":placeholder"$t(pleas…

文件和IO的核心API

操作文件 public static void main(String[] args) throws IOException {//创建一个文件对象&#xff0c;并且指向某个路径File file new File("C:\\Users\\1162\\Desktop\\1.trx");//创建文件System.out.println(file.exists());boolean newFile file.createNewFi…

Mysql-InnoDB数据页结构

一、页结构说明 大致分7部分 二、记录在页中的存储 2.1 页面记录内存结构 行格式 存储到 User Records 部分&#xff0c;每当我们插入一条记录&#xff0c;都会从 Free Space 部分申请一个记录大小的空间划分到 User Records 部分 &#xff0c;用完则申请新的页&#xff1b; …

Vue中使用element-plus中的el-dialog定义弹窗-内部样式修改-v-model实现-demo

效果图 实现代码 <template><el-dialog class"no-code-dialog" v-model"isShow" title"没有收到验证码&#xff1f;"><div class"nocode-body"><div class"tips">请尝试一下操作</div><d…

用香港服务器域名需要备案吗?

​  在选择服务器的时候&#xff0c;很多人会考虑使用香港服务器。香港服务器的一个优势就是不需要备案。不管是虚拟主机还是云主机&#xff0c;无论是个人网站还是商业网站&#xff0c;都不需要进行备案手续。 域名实名认证 虽然不需要备案&#xff0c;但使用香港服务器搭建…

Doris安装及使用

Doris简介 Apache Doris 是一个基于 MPP 架构的高性能、实时的分析型数据库&#xff0c;以极速易用的特点被人们所熟知&#xff0c;仅需亚秒级响应时间即可返回海量数据下的查询结果&#xff0c;不仅可以支持高并发的点查询场景&#xff0c;也能支持高吞吐的复杂分析场景。基于…

怎么做出老板看得懂的财务数据分析报表?

财务数据分析报表的主要作用就是为决策提供必不可少的数据信息&#xff0c;让老板以及管理层在充分了解企业现金流情况、债务能力、还债能力、进账情况等财务信息后&#xff0c;更科学地做出运营管理决策。因此&#xff0c;财务数据分析报表必须做得直观易懂&#xff0c;毕竟不…

Linux监控基础命令

Linux资源监控 一.资源监控常用命令汇总 内存&#xff1a;top、free、vmstat、pmap I/O&#xff1a;vmstat、sar CPU&#xff1a;top、vmstat、mpstat、iostat 二.监控命令 日常检测使用top和free就足够了&#xff0c;如果要对系统进行日常监控可以使用zabbix或者prometh…

微软宣布在 Excel 中使用 Python:结合了 Python 的强大功能和 Excel 的灵活性。

自诞生以来&#xff0c;Microsoft Excel 改变了人们组织、分析和可视化数据的方式&#xff0c;为每天使用它的数百万人提供了决策基础。今天&#xff0c;我们宣布发布 Excel 中的 Python 公共预览版&#xff0c;从而使 Excel 中的分析功能取得重大进展。 Excel 中的 Python 可…

网易2023年Q2财报:营收240亿元,游戏技术跨产业创造数字就业

8月24日&#xff0c;网易发布2023年Q2财报。二季度&#xff0c;网易继续聚焦主营业务&#xff0c;业绩表现稳健&#xff1b;净收入240亿元&#xff0c;非公认会计准则下归属于公司股东的持续经营净利润90亿元&#xff0c;研发投入39亿元&#xff0c;相当于拿出近一半利润投入研…