Releases: KDAB/cxx-qt
0.8.0 - Build System Stabilization 🔨
Version 0.8 of CXX-Qt focuses on the build system, with large internal refactors and a new API for cxx-qt-build.
The new API is now considered stable. We aim to avoid backwards-incompatible changes in the future.
This new API provides a much clearer handling of Qml modules, with more options and flexibility, as they are now integrated into the main CxxQtBuilder.
Many CxxQtBuilder functions can now also take configurable objects, instead of just file paths, like QmlFile instances, that allow configuring the version of the Qml component, etc.
For ease-of-use, strings and lists of strings will automatically be converted to the right types in these cases.
So the API is both powerful and easy to use.
Additionally, CXX-Qt projects can now span multiple crates, either by providing one QML module or QObject library per crate.
The C++ interface for each create is now defined clearer through the Interface type and allows complete control of the available header files for downstream dependencies.
Qmlls and qmllint are now also officially supported, and should work out of the box. CXX-Qt will even generate you the right configuration file by default.
Build times should now also be faster and automatic resource initialization is more stable and can be forced if necessary.
All of this is of course still integrated with CMake via cxx-qt-cmake!
With CMake it is now also possible to build dynamic Qml module plugins, although we still recommend sticking with static modules by default.
Check out our examples for references of what is possible with this new release. Specifically the qml_multi_crates and qml_minimal_plugin examples show off what is possible with this new release.
Casting C++ types up and down their type hierarchy is now also possible in Rust!
This allows CXX-Qt users to express powerful APIs that can accept anything that is castable to a QObject, or any other polymorphic C++ type.
A special shout out also goes to @jnbooth, who improved and fixed many things in cxx-qt-lib and keeps pushing the API boundary of Qt in Rust!
Thanks also to everyone else who contributed and took part in the discusions on our Zulip and here on Github.
Changelog
Added
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
Removed
- CXX-Qt-build: Interface no longer includes compiler definitions (#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.3
Fixed
- Fix QEnum generation for Qt 6.9.2+
0.7.2
What's Changed
Added
impl cxx_qt::Initialize for X {}as shorthand forimpl cxx_qt::Constructor<()> for X {}extern "RustQt"blocks no longer have to be markedunsafe
Fixed
- 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
Full Changelog: v0.7.1...v0.7.2
0.7.1
The GIT_TAG for this release is 0.7.1, (and not v0.7.1).
We will no longer use the v prefix for cxx-qt-cmake releases going forward.
We have chosen to make this change for two reasons:
- It's now consistent with version declarations in Cargo, which don't use the
vprefix - As the name is now consistent with our
0.7branch name, you can use GIT_TAG0.7to simply follow the latest patch release, similar to specifying "0.7" in Cargo.toml.
Added
- Allow creating a
QImagefrom animage::RgbaImage.
Fixed
- 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
- cxx-qt-cmake: Fix build errors with rustup 1.28.0 by bumping Corrosion
0.7.0
Added
#[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
Changed
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)
Removed
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
Fixed
- 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
Added
- 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
Changed
- 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
Fixed
- 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
- 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
Fixed
- 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
Fixed
- Builds failing due to
link modifiers combination +bundle,+whole-archive is unstable when generating rlibs
0.5.1
Fixed
qrcresources added toCxxQtBuilderorQtBuildnow triggercargo:rerun-if-changedfor file entries- Fix not being able to use
QVariantas a#[qproperty], because thePartialEqimplementation was missing