Qt Slot With Arguments
To use Qt from Rust, add the crates as dependencies to your Cargo.toml
, for example:
Each crate re-exports its dependencies, so, for example, you can access qt_core
as qt_widgets::qt_core
without adding an explicit dependency. You can also add them as direct dependencies for convenience, but make sure to use compatible versions.
See rust-qt/examples repository to see how to use the API provided by Qt crates.
- Signals and slots are loosely coupled: A class which emits a signal neither knows nor cares which slots receive the signal. Qt's signals and slots mechanism ensures that if you connect a signal to a slot, the slot will be called with the signal's parameters at the right time. Signals and slots can take any number of arguments of any type.
- Traditional syntax: SIGNAL and SLOT QtCore.SIGNAL and QtCore.SLOT macros allow Python to interface with Qt signal and slot delivery mechanisms. This is the old way of using signals and slots. The example below uses the well known clicked signal from a QPushButton.
- Compatibility of signal’s and slot’s arguments is checked at compile time. Note that each set of argument types requires a separate Rust type of signal or slot (e.g. SlotNoArgs, SlotOfInt, etc.). Other crates may also provide new signal and slot objects (e.g.
Qt Signal Slot With 2 Arguments. The signals keyword is actually a macro. The C preprocessor converts it into standard C before the compiler sees it. Qt::CaseSensitivity is an enum type that can take the values Qt::CaseSensitive and Qt::CaseInsensitive. Signals and slots were one of the distinguishing features that made Qt an exciting and innovative tool back in time. But sometimes you can teach new tricks to an old dog, and QObjects gained a new way to connect between signals and slots in Qt5, plus some extra features to connect to other functions which are not slots. Let’s review how to get the most of that feature.
Most of the Qt API is translated to Rust as-is when possible. Identifiers are modified according to Rust’s naming convention. Overloaded methods (methods accepting multiple sets of argument types) are wrapped as distinct Rust methods with suffixes that distinguish between them.
In many cases, you can address the Qt documentation and translate examples from it almost directly to Rust code. Crate documentation (available on docs.rs or through cargo doc
) features embedded Qt documentation.
In addition, Rust crates provide some helpers to improve ergonomics:
Qt application objects (QApplication
, QGuiApplication
, QCoreApplication
) require argc
and argv
to be present, and these are not available directly in Rust. Use init
helpers to initialize the application correctly:
qt_core
provides API for using signals and slots conveniently. You can connect built-in signals to built-in slots like this:
You can also connect signals to Rust closures (see basic_form example:
You can also create and emit signals:
Compatibility of signal’s and slot’s arguments is checked at compile time.
Note that each set of argument types requires a separate Rust type of signal or slot (e.g. SlotNoArgs
, SlotOfInt
, etc.). Other crates may also provide new signal and slot objects (e.g. qt_widgets::SlotOfQTreeWidgetItem
).
QString::from_std_str
, QString::to_std_string
, QByteArray::from_slice
, and impl<'a> From<&'a QString> for String
provide conversions from Qt’s types to Rust types and back.
Qt Connect Slot With Arguments
QFlags
generic type mimics the functionality of C++'s QFlags
class.
Qt Signal And Slots
qdbg
function from qt_core
wraps a printable (with QDebug
) Qt object into a shim object that implements Rust’s fmt::Debug
.