All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
0.9.1 - 2026-07-03
- Fix finding qmake in PATH when only qmake6 is available and no qmake
0.9.0 - 2026-06-23
- Add experimental Qt Minimal installation support to
qt-build-utils - Binding for
QQmlImageProvderBase,QQmlEngine::addImageProvider, andQ(Gui)Application::applicationDisplayName - Add
FromIteratorforQStringList,QMap, andQHash
- Constructors no longer fail silently in certain situations
- Deprecation message about
QImage::mirror - Fix
qenumattribute breaking builds in certain situations
0.8.1 - 2026-02-16
- Skip empty line at the end of rcc output
- Fully qualify Pin in threading generation
- Allow for dead_code on signal generation
- Removed deprecated
doc_auto_cfgconfigure attribute
QObjectExt::set_parentnow accepts a pinned mutable reference to any type that can upcast toQObject, rather than an immutable reference toSelf.- Moved subtype aliases for
QEventLoop,QTimeZone, andQUuidinto therust::cxxqtlib1namespace.
0.8.0 - 2025-12-18
QDateTime::from_stringto parseQDateTimefrom aQString.QSet::reserveto reserve capacity up-front.- Support for further types:
QUuid - New example: Basic greeter app
- Support for further types:
qreal,qint64,qintptr,qsizetype,quint64,quintptr,QQuaternion - Support for
cfgattributes through to C++ generation - CXX-Qt-build: Improved compile time and propagation of initializers between crates
- CXX-Qt-build: Multi-crate projects are now possible with Cargo and CMake (see
examples/qml_multi_crates) - CXX-Qt-build: Allow forcing initialization of crates/QML modules (
cxx_qt::init_crate!/cxx_qt::init_qml_module!) - CXX-Qt-build:
CxxQtBuilder::filesto add multiple files - CXX-Qt-build: Allow building dynamic QML module plugins with CMake
- CXX-Qt-build: Rename
CxxQtBuilder::qobject_headertoCxxQtBuilder::cpp_fileand allow compiling .cpp files. - Add pure virtual function specified through the
#[cxx_pure]attribute - Add wrappers for up and down casting, for all types which inherit from QObject, available for &T, &mut T and Pin<&mut T>
#[base = T]is now supported inextern "C++Qt"blocks- Casting is automatically implemented for qobjects or types which have
#[base = T]in"RustQt"or"C++Qt"blocks - Support for
QMessageLogContextand sending log messages to the Qt message handler. - Serde support for further types:
QByteArray,QSet,QStringList,QVector,QUrl - Added
QEventLoopto cxx-qt-lib-extras. - Support for setting Qt log message patterns with
q_set_message_patternand formatting log messages ithq_format_log_message. - Implement
IntoIteratorfor&QHash,&QList,&QMap,&QSet, and&QVector. - Add
QByteArray:from_base64_encodingandQByteArray::to_base64. - Added support for qmllint and qmlls due to correct QML module export (qmldir, .qml files, qmltypes etc) and .qmlls.ini generation
- CXX-Qt-build: Interface no longer includes compiler definitions (KDAB#1165)
- CXX-Qt-build: Interface no longer includes initializers
- CXX-Qt-build: QML modules no longer include Rust files (use
CxxQtBuilder::filesinstead) - CXX-Qt-build: Only allow one QML module per
CxxQtBuilder - CXX-Qt-build: Make
CxxQtBuilder::cc_builderunsafe to use, to indicate its lack of guarantees
0.7.2 - 2025-04-28
impl cxx_qt::Initialize for X {}as shorthand forimpl cxx_qt::Constructor<()> for X {}extern "RustQt"blocks no longer have to be markedunsafe
- cxx-qt-build: Use shorter paths to avoid file path length limitations on Windows
- CMake: Use Release Qt DLLs and runtime for MSVC Debug builds
- Fix some generated links to book page
#[inherit]attributes are no longer ignored inextern "C++Qt"blocks - they now trigger an error
0.7.1 - 2025-03-04
- Allow creating a
QImagefrom animage::RgbaImage.
- Prevent clippy from tripping lint
- Build warnings due to unused unsafe blocks since CXX 1.0.130
- On non-Unix platforms, use deep copying rather than symlinking
0.7.0 - 2024-10-30
- New example: ToDo app
#[auto_cxx_name]and#[auto_rust_name]attributes forexternblocks, which will convert the case of names, automatically camelCase for cxx, and snake_case for rust- Support for further types:
QLine,QLineF,QImage,QPainter,QFont,QPen,QPolygon,QPolygonF,QRegion,QAnyStringView internal_pointer_mut()function onQModelIndexc_voidin CXX-Qt-lib for easy access tovoid *CxxQtThreadis now marked asSyncso that it can be used by reference- Add cxx-qt-lib-extras crate which contains:
QCommandLineOption,QCommandLineParser,QElapsedTimer,QApplication - Serde support for
QString(requires "serde" feature on cxx-qt-lib) - A new QuickControls module, which exposes
QQuickStyle. This module is enabled by default and is behind theqt_quickcontrolsfeature. - Add support for specifying read write and notify in qproperty macro, including support for custom user defined functions
- Add support for the constant, required, reset and final flags in the qproperty macro
- QObject subclasses can now inherit from other CXX-Qt generated QObject classes
BUILD_WASMCMake option to support WebAssembly builds and a book page for building for WASM- Add support for cxx_name and rust_name on qproperty attributes which applies to the QProperty generated as well as functions
VCPKGis now being removed entirely- Connection now return a
QMetaObjectConnectionGuardandQMetaObjectConnectionis a separate type - Internal
cxx-qtheaders have moved to the namespacecxxqt1and the foldercxx-qt cxx-qt-gennow does not generate code requiringcxx-qt-lib, this allows forcxx-qt-libto be optional- File name is used for CXX bridges rather than module name to match upstream
#[qobject]attribute is now optional on types inextern "RustQt"#[qobject]attribute is now required on types inextern "C++Qt"#[qenum]s now resolve their namespace independently from their associated QObject- Reworked cxx-qt-build and the integration with CMake
- Dependencies are now automatically detected and configured by cxx-qt-build
- Libraries can pass build information to cxx-qt-build in the form of a
cxx_qt_build::Interface - Add CMake wrappers around corrosion to simplify importing crates and qml modules that were built with cxx-qt-build
- CMake code has been extracted into a separate repository for faster downloads (kdab/cxx-qt-cmake)
- Folder structure of Rust bridges is now considered in the same way as CXX in
CxxQtBuilder cxx_file_stemhas been removed from#[cxx_qt::bridge]and the source file name is now used for generated headers similar to CXX- Base attribute now takes an ident not a string, e.g.
#[base = ParentClass]instead of#[base = "ParentClass"] - No Cxx-qt-lib features are on by default now, instead we have a 'full' feature for the previously enabled features, making them opt in
- Removed implicit auto camel conversion with no attributes, instead use cxx_name and rust_name like CXX (this may come back but be explicit opt-in)
qt_guiandqt_qmlfeatures fromcxx-qt-buildthey are only used incxx-qt-lib(-headers)nowcxx-qt-lib-headersandcxx-qt-lib-extras-headersare now merged into their respective base cratesBuildOptsare replaced by theInterfacetype which does not need to be reiterated by downstream dependencies- Locking has been removed from the generated QObjects. Qt/User C++ code is responsible for upholding Rusts Safety guarantees.
- The
cxx_qt::Lockingtrait is no longer available.
- The
0.6.1 - 2024-04-19
- Missing include for
MaybeLockGuardwhen using onlyextern "C++Qt"signals - Fix build issues with Qt 6.7
- Improve handling of Apple frameworks with Qt
- Run qmlcachegen only when required
- Support for building with no Rust or C++ files in the builder script
0.6.0 - 2023-11-17
- Allow associated constants, types and macro invocations within
impl qobject::Tblocks - Ensure that generated Rust code works when
#![deny(missing_docs)]is enabled - Ability to connect and disconnect from signals in Rust triggering a function pointer or closure
unsafe impl !cxx_qt::Locking for qobject::Tto disable internal lockingDerefis now implemented forqobject::Tto reach theTRust struct- Support for C++ only methods by not having a
#[qinvokable]attribute - Ability to define a custom C++ Constructor using
cxx_qt::Constructor cxx_qt::Initializetrait for easier default-constructor implementationextern "C++Qt"block support for declaring existing types with methods and signals#[qenum]attribute forQ_ENUMandQ_ENUM_NSsupportqnamespace!macro to support exposing namespaced enums to QML
- Pretty-print errors messages when build script fails
QDateTimeAPI to usecurrent_date_timerather thancurrent_date- Always call
qt_build_utils::setup_linker()inCxxQtBuilderand remove the proxy method - Moved to
syn2.0 internally and for any exportedsyntypes impl cxx_qt::Threading for qobject::Tnow needs to be specified forqt_thread()to be available#[cxx_qt::qsignals]and#[cxx_qt::inherit]are now used in anextern "RustQt"block as#[qsignal]and#[inherit]#[qinvokable]is now defined as a signature inextern "RustQt"rust_mutis now safe to call#[qproperty]is now defined as an attribute on the qobject rather than the field- QObject struct is now split between the bridge and implementation outside via a type alias
qobjectmodule is no longer generatedimpl cxx_qt::trait for qobject::Tinside the bridge is nowimpl cxx_qt::trait for Tqobject::Tas the self parameter in the bridge is nowT#[cxx_override],#[cxx_final],#[cxx_virtual]are now independant attributes rather than embedded in#[qinvokable]- Use
set_organization_nameinstead ofq{core,gui}application_set_organization_namein cxx-qt-lib
- Do not use -bundle otherwise CMake builds are missing qt-static-initalizers (note this is broken in rustc 1.69)
- Do not import
Pinin hidden module as invokables are outside now, resolving IDE integration - Rust always links against a non-debug Windows runtime with *-msvc targets, so we need to link to MultiThreadedDLL
- Removed support for
cxx_typeandcxx_return_typeand related conversion methods. - Removed
newCppObjectfunction that allowed creation of default-constructed QObject from Rust. - Generation of getter and setter for private Rust fields
- Generation of mutable getter for properties, instead use
rust_mut
0.5.3 - 2023-05-19
- Ensure that QVariant{Hash,List,Map} cxx-qt-lib equivalents are registered so that they work in QML
- Stop generating
muton self pins unnecessarily
0.5.2 - 2023-04-27
- Builds failing due to
link modifiers combination +bundle,+whole-archive is unstable when generating rlibs
0.5.1 - 2023-03-27
qrcresources added toCxxQtBuilderorQtBuildnow triggercargo:rerun-if-changedfor file entries- Fix not being able to use
QVariantas a#[qproperty], because thePartialEqimplementation was missing
0.5.0 - 2023-03-08
- Support for inheriting methods from the superclass into Rust using
#[cxx_qt::inherit]. - Register QML types at build time:
#[cxxqt::qobject(qml_uri = "foo.bar", qml_version = "1.0")] - Register QRC resources at build time in Cargo builds (don't need to call initialization function from Rust
mainfunction) - Support for container types:
QSet<T>,QHash<K, V>,QList<T>,QMap<K, V>,QVector<T> - Support for further types:
QByteArray,QCoreApplication,QGuiApplication,QMargins,QMarginsF,QModelIndex,QPersistentModelIndex,QQmlApplicationEngine,QQmlEngine,QStringList,QTimeZone,QVector2D,QVector3D,QVector4D - Support for nesting objects in properties, invokables, and signals with
*mut T - Allow for marking signals as existing in the base class
- Support for conversions to types in third-party crates:
bytes,chrono,http,rgb,time,url - Add several quality of life functions to builtin cxx-qt-lib types, including
Defaultconstructors, string formatting,std::cmporder and operators
QVariantnow has a uses aQVariantValuetrait for supported types, allowing custom types to be used with QVariantQtGuiandQtQmltypes in cxx-qt-lib are now behind the featuresqt_guiandqt_qml
- Support for generating correct C++ code for
Pin<T>Rust types - Support namespace attribute on shared types, QObject struct, and extern blocks
- Asserts for 32bit platforms such as Wasm
- Errors from the generation not pointing to the span where they occurred
0.4.1 - 2022-11-18
- Multiple QObjects can be defined in one bridge
- Fixed linking Qt with macOS frameworks. This allows using Qt from Homebrew.
0.4.0 - 2022-10-28
- Addition of qt-build-utils crate
- Add generic system for performing type conversions in C++
- Refactor of API so that CXX-Qt is a superset of CXX
- Rewrite of build system, removal of custom cmake file, corrosion is used for CMake and support for building with only Cargo
- Refactor of internal generation code so it's split into stages and removal of pattern matching for types, so arbritary CXX types can be supported
- Mark Qt relocatable types as trivial to CXX
- Use Rust closures to queue tasks onto the Qt thread
- Support for nested objects
0.3.0 - 2022-06-10
- Add a demo for showing complex threading and async
- Support for declaring and emitting signals
- Use CXX itself for bridging Qt types
0.2.1 - 2022-03-21
- Add vcpkg for Windows and macOS, then use this for CI
- Support mutable invokables
0.2.0 - 2022-02-28
- Add more Qt types, QDate, QDateTime, Qpoint, QRect, QRectF, QSize, QTime, QUrl
- Support Qt 6 for Qt types
- Use a "CppObj" to represent the C++ context
- Add a book for documentation
- Use postEvent for emitting events safely
0.1.0 - 2021-12-03
- Initial release
- Support for bridging properties and invokables
- Support for QColor, QPointF, QSizeF, QString, QVariant
- Support for nested objects