rust-qt-binding-generator/README.md

93 lines
2.8 KiB
Markdown
Raw Normal View History

# Rust Qt Binding Generator
2017-08-02 14:29:32 -07:00
2017-09-03 05:08:41 -07:00
![Rust Qt Binding](demo/rust_qt_binding_generator.svg)
2017-08-25 08:07:47 -07:00
This code generator gets you started quickly to use Rust code from Qt and QML. In other words, it helps to create a Qt based GUI on top of Rust code.
Qt is a mature cross-platform graphical user interface library. Rust is a new programming language with strong compile time checks and a modern syntax.
To combine Qt and Rust, write an interface in a JSON file. From that, the generator creates Qt code and Rust code. The Qt code can be used directly. The Rust code has two files: interface and implementation. The interface can be used directly.
```json
{
"cppFile": "src/person.cpp",
"rust": {
"dir": "rust",
"interfaceModule": "interface",
"implementationModule": "implementation"
},
"objects": {
"Person": {
"type": "Object",
"properties": {
"name": {
"type": "QString",
"write": true
}
}
}
}
}
```
This file describes an binding with one object, `Person`. `Person` has one property: `name`. It is a writable property.
The Rust Qt Binding Generator will create binding source code from this description:
```bash
rust_qt_binding_generator binding.json
```
This will create four files:
* *src/person.h*
* *src/person.cpp*
* rust/src/implementation.rs
* *rust/src/interface.rs*
Only `implementation.rs` should be changed. The other files are the binding. `implementation.rs` is initialy created with a simple implementation that is shown here with some comments.
```rust
use interface::*;
/// A Person
pub struct Person {
/// Emit signals the the Qt code.
emit: PersonEmitter,
/// The name of the person.
name: String,
}
/// Implementation of the binding
impl PersonTrait for Person {
/// Create a new person with default data.
fn create(emit: PersonEmitter) -> Person {
Person {
emit: emit,
name: String::new(),
}
}
/// The emitter can emit signals to the Qt code.
fn emit(&self) -> &PersonEmitter {
&self.emit
}
/// Get the name of the Person
2017-08-30 23:52:43 -07:00
fn get_name(&self) -> &str {
&self.name
}
/// Set the name of the Person
fn set_name(&mut self, value: String) {
self.name = value;
self.emit.name_changed();
}
}
```
2017-08-15 14:12:22 -07:00
The building block of Qt and QML projects are QObject and the Model View classes. `rust_qt_binding_generator` reads a json file to generate QObject or QAbstractItemModel classes that call into generated Rust files. For each type from the JSON file, a Rust trait is generated that should be implemented.
This way, Rust code can be called from Qt and QML projects.
2017-08-28 12:16:43 -07:00
## More information
* [The QML Book](https://qmlbook.github.io/)