File tree 6 files changed +56
-4
lines changed
6 files changed +56
-4
lines changed Original file line number Diff line number Diff line change 11
11
#include < memory>
12
12
13
13
#include < QtQml/QQmlApplicationEngine>
14
+ #include < QtQml/QQmlEngine>
14
15
15
16
namespace rust {
16
17
namespace cxxqtlib1 {
17
18
18
19
::std::unique_ptr<QQmlApplicationEngine>
19
20
qqmlapplicationengineNew ();
20
21
22
+ QQmlEngine&
23
+ qqmlapplicationengineAsQQmlEngine (QQmlApplicationEngine&);
24
+
21
25
}
22
26
}
23
27
Original file line number Diff line number Diff line change @@ -16,5 +16,11 @@ qqmlapplicationengineNew()
16
16
return ::std::make_unique<QQmlApplicationEngine>();
17
17
}
18
18
19
+ QQmlEngine&
20
+ qqmlapplicationengineAsQQmlEngine (QQmlApplicationEngine& engine)
21
+ {
22
+ return static_cast <QQmlEngine&>(engine);
23
+ }
24
+
19
25
}
20
26
}
Original file line number Diff line number Diff line change @@ -61,11 +61,22 @@ mod ffi {
61
61
fn setOfflineStoragePath ( self : Pin < & mut QQmlApplicationEngine > , dir : & QString ) ;
62
62
}
63
63
64
+ unsafe extern "C++" {
65
+ include ! ( "cxx-qt-lib/qqmlengine.h" ) ;
66
+ type QQmlEngine = crate :: QQmlEngine ;
67
+ }
68
+
64
69
#[ namespace = "rust::cxxqtlib1" ]
65
70
unsafe extern "C++" {
66
71
#[ doc( hidden) ]
67
72
#[ rust_name = "qqmlapplicationengine_new" ]
68
73
fn qqmlapplicationengineNew ( ) -> UniquePtr < QQmlApplicationEngine > ;
74
+
75
+ #[ doc( hidden) ]
76
+ #[ rust_name = "qqmlapplicationengine_as_qqmlengine" ]
77
+ fn qqmlapplicationengineAsQQmlEngine (
78
+ ptr : Pin < & mut QQmlApplicationEngine > ,
79
+ ) -> Pin < & mut QQmlEngine > ;
69
80
}
70
81
71
82
// QQmlApplicationEngine is not a trivial to CXX and is not relocatable in Qt
@@ -75,9 +86,17 @@ mod ffi {
75
86
impl UniquePtr < QQmlApplicationEngine > { }
76
87
}
77
88
89
+ use crate :: QQmlEngine ;
90
+ use core:: pin:: Pin ;
91
+
78
92
pub use ffi:: QQmlApplicationEngine ;
79
93
80
94
impl QQmlApplicationEngine {
95
+ /// Convert the existing [QQmlApplicationEngine] to a [QQmlEngine]
96
+ pub fn as_qqmlengine < ' a > ( self : Pin < & ' a mut Self > ) -> Pin < & ' a mut QQmlEngine > {
97
+ ffi:: qqmlapplicationengine_as_qqmlengine ( self )
98
+ }
99
+
81
100
/// Create a new QQmlApplicationEngine
82
101
pub fn new ( ) -> cxx:: UniquePtr < Self > {
83
102
ffi:: qqmlapplicationengine_new ( )
Original file line number Diff line number Diff line change 3
3
//
4
4
// SPDX-License-Identifier: MIT OR Apache-2.0
5
5
6
- #[ cxx :: bridge]
6
+ #[ cxx_qt :: bridge( cxx_file_stem = "qqmlengine" ) ]
7
7
mod ffi {
8
+ unsafe extern "C++Qt" {
9
+ include ! ( "cxx-qt-lib/qqmlengine.h" ) ;
10
+ type QQmlEngine ;
11
+
12
+ /// This signal is emitted when the QML loaded by the engine would like to exit from the event loop with the specified return code ret_code.
13
+ #[ qsignal]
14
+ fn exit ( self : Pin < & mut QQmlEngine > , ret_code : i32 ) ;
15
+
16
+ /// This signal is emitted when the QML loaded by the engine would like to quit.
17
+ #[ qsignal]
18
+ fn quit ( self : Pin < & mut QQmlEngine > ) ;
19
+ }
20
+
8
21
unsafe extern "C++" {
9
22
include ! ( "cxx-qt-lib/qstring.h" ) ;
10
23
type QString = crate :: QString ;
@@ -13,9 +26,6 @@ mod ffi {
13
26
include ! ( "cxx-qt-lib/qurl.h" ) ;
14
27
type QUrl = crate :: QUrl ;
15
28
16
- include ! ( "cxx-qt-lib/qqmlengine.h" ) ;
17
- type QQmlEngine ;
18
-
19
29
/// Adds path as a directory where the engine searches for installed modules in a URL-based directory structure.
20
30
#[ rust_name = "add_import_path" ]
21
31
fn addImportPath ( self : Pin < & mut QQmlEngine > , path : & QString ) ;
Original file line number Diff line number Diff line change @@ -28,6 +28,13 @@ fn main() {
28
28
engine. load ( & QUrl :: from ( "qrc:/qt/qml/com/kdab/cxx_qt/demo/qml/main.qml" ) ) ;
29
29
}
30
30
31
+ if let Some ( engine) = engine. as_mut ( ) {
32
+ // Listen to a signal from the QML Engine
33
+ engine. as_qqmlengine ( ) . on_quit ( |_| {
34
+ println ! ( "QML Quit!" ) ;
35
+ } ) ;
36
+ }
37
+
31
38
// Start the app
32
39
if let Some ( app) = app. as_mut ( ) {
33
40
app. exec ( ) ;
Original file line number Diff line number Diff line change @@ -51,6 +51,12 @@ Window {
51
51
52
52
onClicked: myObject .sayHi (myObject .string , myObject .number )
53
53
}
54
+
55
+ Button {
56
+ text: qsTr (" Quit" )
57
+
58
+ onClicked: Qt .quit ()
59
+ }
54
60
}
55
61
}
56
62
// ANCHOR_END: book_main_qml
You can’t perform that action at this time.
0 commit comments