ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Rust:qmetaobject 的一个实际例子

2026/9/16 11:44:22 拓冰建站 浏览量
Rust:qmetaobject 的一个实际例子

源代码如下:

Cargo.toml

[package]
name = "qt_gui"
version = "0.1.0"
edition = "2021"[build]
target = "x86_64-pc-windows-gnu"# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html[dependencies]# qt_widgets = "*"
# qt_core = "*"
qmetaobject = "0.2.10"
cstr="*"

main.rs

use cstr::cstr;
use qmetaobject::prelude::*;// The `QObject` custom derive macro allows to expose a class to Qt and QML
#[derive(QObject, Default)]
struct Greeter {// Specify the base class with the qt_base_class macrobase: qt_base_class!(trait QObject),// Declare `name` as a property usable from Qtname: qt_property!(QString; NOTIFY name_changed),// Declare a signalname_changed: qt_signal!(),// And even a slotcompute_greetings: qt_method!(fn compute_greetings(&self, verb: String) -> QString {format!("{} {}", verb, self.name.to_string()).into()})
}fn main() {// Register the `Greeter` struct to QMLqml_register_type::<Greeter>(cstr!("Greeter"), 1, 0, cstr!("Greeter"));// Create a QML engine from rustlet mut engine = QmlEngine::new();// (Here the QML code is inline, but one can also load from a file)engine.load_data(r#"import QtQuick 2.6import QtQuick.Window 2.0// Import our Rust classesimport Greeter 1.0Window {visible: true// Instantiate the rust structGreeter {id: greeter;// Set a propertyname: "World"}Text {anchors.centerIn: parent// Call a methodtext: greeter.compute_greetings("hello")}}"#.into());engine.exec();
}