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.7.0 - 2024-10-30
#[auto_cxx_name]
and#[auto_rust_name]
attributes forextern
blocks, 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 onQModelIndex
c_void
in CXX-Qt-lib for easy access tovoid *
CxxQtThread
is now marked asSync
so 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_quickcontrols
feature. - 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_WASM
CMake 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
VCPKG
is now being removed entirely- Connection now return a
QMetaObjectConnectionGuard
andQMetaObjectConnection
is a separate type - Internal
cxx-qt
headers have moved to the namespacecxxqt1
and the foldercxx-qt
cxx-qt-gen
now does not generate code requiringcxx-qt-lib
, this allows forcxx-qt-lib
to 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_stem
has 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_gui
andqt_qml
features fromcxx-qt-build
they are only used incxx-qt-lib(-headers)
nowcxx-qt-lib-headers
andcxx-qt-lib-extras-headers
are now merged into their respective base cratesBuildOpts
are replaced by theInterface
type 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::Locking
trait is no longer available.
- The
0.6.1 - 2024-04-19
- Missing include for
MaybeLockGuard
when 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::T
blocks - 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::T
to disable internal lockingDeref
is now implemented forqobject::T
to reach theT
Rust 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::Initialize
trait for easier default-constructor implementationextern "C++Qt"
block support for declaring existing types with methods and signals#[qenum]
attribute forQ_ENUM
andQ_ENUM_NS
supportqnamespace!
macro to support exposing namespaced enums to QML
- Pretty-print errors messages when build script fails
QDateTime
API to usecurrent_date_time
rather thancurrent_date
- Always call
qt_build_utils::setup_linker()
inCxxQtBuilder
and remove the proxy method - Moved to
syn
2.0 internally and for any exportedsyn
types impl cxx_qt::Threading for qobject::T
now 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_mut
is 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
qobject
module is no longer generatedimpl cxx_qt::trait for qobject::T
inside the bridge is nowimpl cxx_qt::trait for T
qobject::T
as 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_name
instead ofq{core,gui}application_set_organization_name
in 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
Pin
in 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_type
andcxx_return_type
and related conversion methods. - Removed
newCppObject
function 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
mut
on 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
qrc
resources added toCxxQtBuilder
orQtBuild
now triggercargo:rerun-if-changed
for file entries- Fix not being able to use
QVariant
as a#[qproperty]
, because thePartialEq
implementation 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
main
function) - 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
Default
constructors, string formatting,std::cmp
order and operators
QVariant
now has a uses aQVariantValue
trait for supported types, allowing custom types to be used with QVariantQtGui
andQtQml
types in cxx-qt-lib are now behind the featuresqt_gui
andqt_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