extern "C++Qt"
#[cxx_qt::bridge]
mod ffi {
extern "C++Qt" {
}
}
The extern "C++Qt"
section of a CXX-Qt bridge declares Qt types and signatures to be made available to Rust,
and gives the paths of the headers which contain the corresponding Qt declarations.
A bridge module may contain zero or more extern "C++Qt"
blocks.
This complements the extern "C++"
CXX section
but allows for declaring Qt specific features on C++ types.
Automatically converting to camel or snake case can be done through an attribute at the block level.
QObject
s
QObject types that are defined in C++ can be made available to Rust, by declaring them as opaque types with a #[qobject]
attribute.
📝 Note: Types inside
extern "C++Qt"
are currently required to have a#[qobject]
attribute
#[cxx_qt::bridge]
mod ffi {
extern "C++Qt" {
include!(<QtWidgets/QPushButton>);
#[qobject]
type QPushButton;
}
}
Methods
Methods can be specified on the QObject type in the same way as extern "RustQt"
blocks.
This is the same as CXX Functions and member functions.
#[cxx_qt::bridge]
mod ffi {
unsafe extern "C++" {
include!("cxx-qt-lib/qstring.h");
type QString = cxx_qt_lib::QString;
}
extern "C++Qt" {
include!(<QtWidgets/QPushButton>);
#[qobject]
type QPushButton;
fn text(self: &QPushButton) -> QString;
fn setText(self: Pin<&mut QPushButton>, text: &QString);
}
}
Signals
Signals can be specified on the Qt type in the same way as extern "RustQt"
blocks.
#[cxx_qt::bridge]
mod ffi {
extern "C++Qt" {
include!(<QtWidgets/QPushButton>);
#[qobject]
type QPushButton;
#[qsignal]
fn clicked(self: Pin<&mut QPushButton>, checked: bool);
}
}
This then causes CXX-Qt to generate Rust methods to emit and connect to the #[qsignal]
,
in the same way as a #[qsignal]
in a extern "RustQt"
block.
📝 Note: Using
pub(self)
as the visibility of the signal allows for declaring private signals