Add a template that is built by Cargo
parent
c1a0bd7bfb
commit
ed2de05492
|
@ -0,0 +1,11 @@
|
||||||
|
[package]
|
||||||
|
name = "qt_quick_cargo"
|
||||||
|
version = "0.1.0"
|
||||||
|
build = "build.rs"
|
||||||
|
links = "qt_quick_cargo"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
libc = "*"
|
||||||
|
|
||||||
|
[build-dependencies]
|
||||||
|
rust_qt_binding_generator = { path = "../.." }
|
|
@ -0,0 +1,34 @@
|
||||||
|
import QtQuick 2.6
|
||||||
|
import RustCode 1.0
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
property alias mouseArea: mouseArea
|
||||||
|
property alias textEdit: textEdit
|
||||||
|
|
||||||
|
Simple {
|
||||||
|
id: rust
|
||||||
|
}
|
||||||
|
|
||||||
|
width: 360
|
||||||
|
height: 360
|
||||||
|
|
||||||
|
MouseArea {
|
||||||
|
id: mouseArea
|
||||||
|
anchors.fill: parent
|
||||||
|
}
|
||||||
|
|
||||||
|
TextEdit {
|
||||||
|
id: textEdit
|
||||||
|
text: rust.message
|
||||||
|
verticalAlignment: Text.AlignVCenter
|
||||||
|
anchors.top: parent.top
|
||||||
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
|
anchors.topMargin: 20
|
||||||
|
Rectangle {
|
||||||
|
anchors.fill: parent
|
||||||
|
anchors.margins: -10
|
||||||
|
color: "transparent"
|
||||||
|
border.width: 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,13 @@
|
||||||
|
Qt Quick template project with Rust bindings
|
||||||
|
|
||||||
|
This is a template project for writing a Qt Quick GUI on top of Rust code.
|
||||||
|
|
||||||
|
`bindings.json` defines the interface between the Qt and Rust code.
|
||||||
|
|
||||||
|
Build instructions are written in `build.rs`.
|
||||||
|
|
||||||
|
Build this code with
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cargo build
|
||||||
|
```
|
|
@ -0,0 +1,19 @@
|
||||||
|
{
|
||||||
|
"cppFile": "Bindings.cpp",
|
||||||
|
"rust": {
|
||||||
|
"dir": "",
|
||||||
|
"interfaceModule": "interface",
|
||||||
|
"implementationModule": "implementation"
|
||||||
|
},
|
||||||
|
"objects": {
|
||||||
|
"Simple": {
|
||||||
|
"type": "Object",
|
||||||
|
"properties": {
|
||||||
|
"message": {
|
||||||
|
"type": "QString",
|
||||||
|
"write": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,10 @@
|
||||||
|
extern crate rust_qt_binding_generator;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let out_dir = ::std::env::var("OUT_DIR").unwrap();
|
||||||
|
rust_qt_binding_generator::build::Build::new(&out_dir)
|
||||||
|
.bindings("bindings.json")
|
||||||
|
.qrc("qml.qrc")
|
||||||
|
.cpp("src/main.cpp")
|
||||||
|
.compile("qt_quick_cargo");
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
import QtQuick 2.6
|
||||||
|
import QtQuick.Window 2.2
|
||||||
|
|
||||||
|
Window {
|
||||||
|
visible: true
|
||||||
|
width: 640
|
||||||
|
height: 480
|
||||||
|
title: qsTr("Hello World")
|
||||||
|
|
||||||
|
MainForm {
|
||||||
|
anchors.fill: parent
|
||||||
|
mouseArea.onClicked: {
|
||||||
|
console.log(qsTr('Clicked on background. Text: "' + textEdit.text + '"'))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
<RCC>
|
||||||
|
<qresource prefix="/">
|
||||||
|
<file>main.qml</file>
|
||||||
|
<file>MainForm.ui.qml</file>
|
||||||
|
</qresource>
|
||||||
|
</RCC>
|
|
@ -0,0 +1,26 @@
|
||||||
|
use interface::*;
|
||||||
|
|
||||||
|
pub struct Simple {
|
||||||
|
emit: SimpleEmitter,
|
||||||
|
message: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl SimpleTrait for Simple {
|
||||||
|
fn new(emit: SimpleEmitter) -> Simple {
|
||||||
|
Simple {
|
||||||
|
emit: emit,
|
||||||
|
message: String::new(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fn emit(&mut self) -> &mut SimpleEmitter {
|
||||||
|
&mut self.emit
|
||||||
|
}
|
||||||
|
fn message(&self) -> &str {
|
||||||
|
"Hello World!"
|
||||||
|
}
|
||||||
|
fn set_message(&mut self, value: String) {
|
||||||
|
self.message = value;
|
||||||
|
self.emit.message_changed();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
#include "Bindings.h"
|
||||||
|
|
||||||
|
#include <QtCore/QFile>
|
||||||
|
#include <QtGui/QGuiApplication>
|
||||||
|
#include <QtQml/QQmlApplicationEngine>
|
||||||
|
#include <QtQml/qqml.h>
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
int main_cpp(const char* app);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main_cpp(const char* appPath)
|
||||||
|
{
|
||||||
|
int argc = 1;
|
||||||
|
char* argv[1] = { (char*)appPath };
|
||||||
|
QGuiApplication app(argc, argv);
|
||||||
|
qmlRegisterType<Simple>("RustCode", 1, 0, "Simple");
|
||||||
|
|
||||||
|
QQmlApplicationEngine engine;
|
||||||
|
if (QFile("main.qml").exists()) {
|
||||||
|
engine.load(QUrl(QStringLiteral("main.qml")));
|
||||||
|
} else {
|
||||||
|
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
|
||||||
|
}
|
||||||
|
if (engine.rootObjects().isEmpty())
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
return app.exec();
|
||||||
|
}
|
|
@ -0,0 +1,20 @@
|
||||||
|
extern crate libc;
|
||||||
|
|
||||||
|
mod implementation;
|
||||||
|
pub mod interface {
|
||||||
|
include!(concat!(env!("OUT_DIR"), "/src/interface.rs"));
|
||||||
|
}
|
||||||
|
|
||||||
|
use std::os::raw::c_char;
|
||||||
|
extern {
|
||||||
|
fn main_cpp(app: *const c_char);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
use std::ffi::CString;
|
||||||
|
let mut args = ::std::env::args();
|
||||||
|
let app = CString::new(args.next().unwrap()).unwrap();
|
||||||
|
unsafe {
|
||||||
|
main_cpp(app.as_ptr());
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue