Solved issue:
- Issue 211: Building QtJambi 6.8.0 from sources fails on Kubuntu 24.10
- Issue 214: QtJambi 6.8.1 RC1 does not build from sources against Qt 6.8.1
- Fixed: Crashes in QML due to forwarded Java exceptions
- Fixed: Crash on macOS when using application-wide event filter and QtWebEngine
- New JVM option
io.qt.no-exception-forwarding-from-meta-calls
to avoidQMetaObject
calls (like method invocation and property access) forwarding exceptions to the Qt caller in any case (it is avoided by default in case of Qml-related QObjects). QtUtilities::setNoExceptionForwardingFromMetaCallsEnabled(boolean)
enable/disable avoiding exception forwarding from meta calls.- New JVM option
io.qt.no-exception-forwarding-from-virtual-calls
to avoid virtual calls (i.e. Java overrides) forwarding exceptions to the Qt caller in any case. QtUtilities::setNoExceptionForwardingFromVirtualCallsEnabled(boolean)
enable/disable avoiding exception forwarding from virtual calls.- New JVM option
io.qt.enable-signal-emit-thread-check
to activate thread checks on signal emits. If a signal is emitted from a foreign thread a warning is given. Install custom handler withQtUtilities.installSignalEmitThreadCheckHandler
to change this behavior. QtUtilities::setSignalEmitThreadCheckEnabled(boolean)
enable/disable thread checks at signal emit.QtUtilities::installSignalEmitThreadCheckHandler(BiConsumer<QObject,AbstractSignal>)
Install a handler for signal emit thread checks to be is executed every time an event is emitted from a foreign thread.QObject::connect
,Signal::connect
,QTimer::singleShot
as well asQMetaObject::invokeMethod
now accept class method handles, e.g.QMetaObject::invokeMethod(widget, QWidget::setVisible, true);
- Performance improvements on
QMetaObject::invokeMethod
. - More flexibility for selective event filters: class type filtering, object name filtering (string comparison or regular expression match). Moved from
QtUtilities
toQCoreApplication
. QAbstractFileEngineHandler
can be created from file name tests (string comparison or regular expression match). This avoids Java calls for every single file operation.- QtJambi is now shipped with native binaries for Linux arm64 (6.8 and higher).
- Added API method:
QRandomGenerator::bounded
,QAbstractHttpServer::addWebSocketUpgradeVerifier
- Added API types:
QSemaphoreReleaser
,QReadLocker
,QWriteLocker
andQMutexLocker
to be used in try-with-resources
QtUtilities.asSelectiveEventFilter(eventFilter, eventType...)
now deprecated. UseQCoreApplication.asSelectiveEventFilter
instead.
QtJambi 6.8.1 is not binary-compatible to Qt 6.8.0. Please use Qt 6.8.1 or higher.
QtJambi 6.8.0 is equivalent to QtJambi 6.7.3.
Solved issue:
- Issue 203: qtjambi-native-linux-x64 5.15 crash on ubuntu 24.04
- Issue 206: Nullability of arguments and return values -
QUndoGroup::addStack
does no longer acceptnull
- Issue 208: nothing happened after click executable exe when I follow the guide in How-to-deploy-QtJambi-applications - improved documentation
- Fixed: Deadlock in QML engine when using qml-registered type
- Fixed: Crash during JVM shutdown on macOS
- Fixed: Java-adopted Thread object for native QThread remaining alife after thread end
- New JVM option
io.qt.enable-event-logs
to activate logging of all handled events with their receivers. QtUtilities::setDanglingPointerCheckEnabled(boolean)
enable/disable dangling pointer checks at runtimeQtUtilities::setMethodLogsEnabled(boolean)
enable/disable method logging at runtimeQtUtilities::setEventLogsEnabled(boolean)
enable/disable event logging at runtime- Number of JNI global references per object has been reduced
- Java representatives of Qt containers (
QList
,QMap
,QHash
,QSet
) have been improved QSpan
now available as Java type- Signals now able to treat single shot connections
QtJambi 6.7.3 is not binary-compatible to Qt 6.7.0. Please use Qt 6.7.1 or higher. QtJambi 6.8.0 is not binary-compatible to Qt 6.8.1.
Solved issue:
- Exception when emitting
QAbstractItemModel.dataChanged
with default arguments - Auto-detected invokable method in subclass shadowing superclass property
- Signal connections to lambda expression fail on queued emit
- Type registration of
QMetaType(QAbstractItemModel\*)
incomplete when implicitly done during subclass registration - Running on Android again
- New nullness support in
QVariant
:QVariant.fromValue()
with argumentnull
now converts toQVariant(Nullptr)
(QVariant.setValue()
similar)QVariant.NULL
is an alias object representsQVariant(Nullptr)
QVariant.nullable(Object)
returns the given object if notnull
andQVariant.NULL
otherwiseQVariant.typedNullable<T>(Object,Class,QMetaType...)
returns the given object if notnull
and a type-specific null alias object otherwise
- New experimental features to be enabled by JVM argument
-D<prop>=true
or viaSystem.setProperty("<prop>", "true")
:io.qt.experimental.fast-jni
enables improved gathering of JNI environment during native callsio.qt.experimental.fast-jni-for-overrides
enables improved gathering of JNI environment during native virtual calls- Following experimental features deal with the improvement of item model performance:
io.qt.experimental.item-model-cached-virtuals
item model'srowCount()
andcolumnCount()
return values are cached to improve performance of item views.io.qt.experimental.enable-invalid-modelindex-singleton
invalidQModelIndex
is represented by one single Java object.io.qt.experimental.enable-ephemeral-modelindexes
instead of calling virtual Java methods with a copy of a QModelIndex argument it submits an alias which is invalidated after use.
- QPropertyAlias is deprecated
QtJambi 6.7.2 is not binary-compatible to Qt 6.7.0. Please use Qt 6.7.1 or higher.
Solved issue:
- switch over extensible enum
- using
QObject::eventFilter
on dying objects - bugfix related to missing RTTI in libraries on macOS
- Issue 197: Meta object does not take public field if getter and setter are available
- Issue 199:
QTextCursor
is doing a dangling pointer check onQTextDocument
before GCed to avoid crashes - QML: Initializing lightweight Java types with QML null without crash
QObject::destructed
signal now sending proxy instance for GCed objects
- You can now declare a signal to be lightweight by using
@QtUninvokable
annotation. Such a signal is not implemented by Qt's meta object system but purely in Java. QtUtilities.asSelectiveEventFilter(eventFilter, eventType...)
now allows you to produce an event filter only for selected event types. This saves native-to-java conversion for irrelevant cases.- support of
std::unique_ptr
in Qt API - Class
QChar
giving static access to Qt's character API - JVM argument
io.qt.enable-cleanup-logs=true
allows you to print all cleanup operations after Java objects are GCed (Issue 199)
- Performance improvements for thread-affine deletions (e.g. GC deleting a
QPersistentModelIndex
) - Adding
@since
information to Java Docs. - Extra signals of internal QObject's without API representation now support cloned signals (signals with default arguments).
QtJambi 6.7.1 is not binary-compatible to Qt 6.7.0. Please use Qt 6.7.1 or higher.
Solved issue:
- Bugfix in detecting unreadable meta properties
- Bugfix in handling lightweight Java types in Qt containers
- Bugfix in deployer
QObject.findChild
now having the correct return type- Meta object auto-detection now skips methods if property of same name is also available. This led to access errors in QML/JavaScript.
- Improved the API of several
QDBusArgument
extraction methods.
- Improved error message when trying to use QtJambi with mismatching Qt build
- Improvement of
QMetaObject.invokeMethod
implementation. - Providing
QMetaObject.writeProperty
and readProperty doing thread-affine access toQProperty
. - Providing
QMetaProperty.fromProperty
giving theQMetaProperty
of aQProperty
. - Generator is now able to map c++ array types and
std::array
. - Generator is now able to treat int-based template parameters.
- Added
QIconEngine.virtual_hook
This will be the last release with Maven-published binaries for Qt 5.15 and Qt 6.6.
Solved issue:
- Issue 185: QtJambi build from scratch on windows has missing opengl classes
- Java-written
QObject
s wrapped as nativeQVariant
can be now used in Qml/JavaScript.
- QtJambi's build system is now able to run on Windows arm64 and FreeBSD.
- Java-based QML plugins now survive a reset by
qmlClearTypeRegistrations()
without crash - QVariant-wrapped QObject pointers can now be used in QML/JavaScript even when they are Java-owned
- binary compatibility to Qt 6.6.2
- ready for Qt 6.7
Solved issue:
- Issue 168: QtJambi does not build from sources using JDK 21 - further improvements
Blindfix for issue:
- Issue 184: QtJambi 6.6.0 seems to not update cache of Java resources accessible via Qt?
std::chrono
types now map tojava.time
classes.- New class
QScope
to manage resources in a try-with-resources block. - QtJambi API changes its type mapping of data pointers from arrays to NIO buffers. This is especially relevant for virtual functions like
QIODevice::readData
,QIODevice::writeData
and similar methods. They are now buffer-based. The former array-based API is available as final delegate functions. Subclasses ofQIODevice
,QAbstractFileEngine
andQPicture
implementing read/write need to be changed to using buffers instead. - The native pointer corresponds to a NIO buffer's position.
- Java arrays can be specified with offset and length parameter to be translated to native pointer and length.
- QtJambi API now provides function overloads for all possibles calls according to implicit constructors of argument types. For legacy code, this may lead to ambiguous situations when using
null
as argument. - Automatic download of Android SDK/NDK during the build process
- Made some array arguments of
QPaintEngine
andQPainter
's draw functions vararg.
Solved issues:
- Issue 168: QtJambi does not build from sources using JDK 21
- Improved Qt container access
This version of QtJambi is source and binary-compatible with its predecessor versions.
Solved issues:
- Issue 166: QByteArrayView(byte[]) not working correctly
- QtJambi now includes
QStringDecoder
andQStringEncoder
QCollator
now derivesComparator<String>
and provides comparison of char arrays.- New QtGraphs API available as QtJambi module
- QtEndian now available as QtJambi class
- Debug info is now available for Windows, Linux and macOS
- QNetworkAccessManager is now thread-affine
This version of QtJambi is source compatible with its predecessor versions.
Solved issues:
- Issue 163: QModelIndex implementation of 5.15.15 slower than 5.15.11
- Issue 160: QMetaType.metaObject() returns null although instance expected
- Issue 159: Custom subclasses of QPaintEngine crash when using QPaintEngineState
- Re-parenting of Qt container types
- Improved java comments
deployment
directory now only contains Java modules. Source bundles are located in subdirectorysources
, docs are located in subdirectoriesjavadocs
and native bundles are loacted in subdirectorynative
.
This version of QtJambi is source but not binary-compatible ti its predecessor versions.
Solved issues:
- Issue 148: QGuiApplication.overrideCursor() is crashing
Solved issues:
- Issue 147: [uic] Add an option to not generate the "MyForm" container class
- Issue 149: Improve QTJAMBI_DEBUG_TRACE feature
- Issue 150: Use RTTI to identify dangling pointers
- Issue 151: Make diagnostics features disabled by default
- Issue 152: Configurable log levels
- Issue 153: Make concurrent modification detection on Qt containers optional
- Issue 158: Make QPlatformIntegration available
Solved issues:
- Issue 143: QObject.connect methods are non-static with 6.4.4
QJSEngine::CppOwnership
is now renamed toJavaOwnership
to avoid missunderstanding. When working with Qml, QObjects are either managed by the Java programmer or by the Qml engine.- Further improvements of QtJambi generator.
Solved issues:
- Issue 129: UIC to Kotlin errors and exceptions
- Issue 135: Decreasing UI performance of QListView
- Issue 125: Slow/Unresponsive UI starting Jambi 6.4.2
- QtJambi API now gives information about arguments' nullability.
- Further improvements of QtJambi generator.
QtJambi 6.4.4, 6.2.12 and 5.15.14 are source- and binary-compatible to its predecessor releases.
Solved issues:
- Issue 125: Slow/Unresponsive UI starting Jambi 6.4.2
- Issue 118: Support for calling special squish functions from java
- First attempts in making QtJambi compatible to GraalVM (see here).
QtJambi 6.4.3, 6.2.11 and 5.15.13 are source- and binary-compatible to its predecessor releases.
Solved issues:
- Issue 103: QList can‘t be sorted
- Issue 118: Support for calling special squish functions from java
- Issue 121: Class Qt3DWindow can‘t be new
- Issue with
QMap
orQHash
of java types fixed
- Completely refactored library kernel
- 99% of third-party legacy code removed
qHash(T)
now available inQtGlobal
namespaceqobject_cast<T>(QObject)
now available as static method inQObject
QModelIndex
is now a Java wrapper for the native type. Thus, it no longer converts to null but to invalidQModelIndex
instance- Making QtJambi Generator available
- Making QtJambi header files available
QtJambi 6.4.2, 6.2.10 and 5.15.12 are source-compatible but not binary-compatible to its predecessor releases.
Solved issues:
- Issue 94: A lot of new logs in the code that seems to have no obvious errors
- Issue 93: Final class fields are not marked as constant when imported as qobject properties
- Issue 92: Meta Object loading system doesn't use custom classloaders - can't find classes from downloaded jars
- Issue 98: QObect meta type parsing broken?
- removing memory leak in QQmlListProperty. QQmlListProperty now requires QList instead of java list. Alternatively, you can specify access functions similar to native Qt.
- Resolved: Stack overflow caused by cascades of registering meta types and generating meta objects.
- Resolved: NullPointerException in combination with classpath resources.
- You can now use annotations from
io.qt.qml.util
to define Qml types. Then, useQtQml.qmlRegisterTypesAndRevisions()
to register these types to Qml. - Ability to define value types for Qml in Qt 6.4.
- Ability to register metatype converters.
- Ability to use the same signal as notifier for different properties.
- Non-public methods with non-void return type are now considered not to be invokable.
QtJambi 6.4.1, 6.2.9 and 5.15.11 are source-compatible and binary-compatible to its predecessor releases (except QQmlListProperty
constructor).
This is the last regular release for Qt 5.15.
Solved issues:
qrc:
paths not working for directory classpaths- Issue 89: Functions missing from QQuickRenderTarget
- Issue 86: Add all java object constants as readonly properties when used in qml
- Issue 85: Fix ‘numeric_limits’ is not a member of ‘std’ error
- Issue 84: Could not load the Qt platform plugin "wayland" in "" even though it was found.
- Issue 83: QUrl with "qrc:" not working for resources in directory-based class paths.
- Issue 79: Wrong minial version for QWebEngineFileSystemAccessRequest?
- Issue 78: better description of macos startup in readme
- Issue 77: Using "Object" in a slot
- Issue 75: QProperty and notification signals
- New modules QtHttpServer and QtSpatialAudio
- New classes QtMath, QtAlgorithms and QtGlobal making available many Qt functions in global scope
- Providing QVariant as value class.
- Removing
$
character from class names translated to native. - All Java classes lead to distinct values in
QMetaType.fromType()
. - All Java classes can be gadgets ready for meta-programming and qml.
- Improved "reduce" features in QtConcurrent
QtJambi 6.3.5, 6.2.8 and 5.15.10 are source-compatible and in most cases binary-compatible to its predecessor releases.
Solved issues:
- Issue 73: Add support for QQuickWebEngineView
- Issue 72: Web page runJavascript always crashes jvm when you try to use the returned object
- Issue 71: Java DeferredDelete throws thread affinity exception, one of threads is undefined
- Solved bug in converting QVariantMap
- Added QQmlEngine template method:
singletonInstance
- Added QJSEngine template methods:
fromScriptValue
,toScriptValue
,fromManagedValue
,toManagedValue
- Added functions to QtQml:
qmlTypeId
,qjsEngine
- Added functions to QtWebEngineQuick:
toWebEngineSettings
,toWebEngineScriptCollection
- Qt 6.4 ready.
QtJambi 6.3.4, 6.2.7 and 5.15.9 are source- and binary-compatible to its predecessor releases.
Solved issues:
- Issue 69: Signal connection does not work as expected with generics
- Issue 66: raiseQThreadAffinityException cores java instead of throwing an exception (blindfixed)
- Issue 64: QtJambi build failed
- Issue 63: Program cannot be started
- Issue 62: symbol lookup error
- Issue 60: Deployment Icon not working in windows (feature removed)
- Class
io.qt.core.QString
now makes all data conversion and formatting features available in Java. - Qt 6.4 ready.
QtJambi 6.3.3, 6.2.6 and 5.15.8 are source- and binary-compatible to its predecessor releases.
Solved issues:
- Issue 56: QtJambi UIC produces wrong code for Form Layout
- Issue 55: Some methods of the QOpenGLFunctions_3_2_Core class do not work as expected
- Android support!!! See here how to create Android apps with QtJambi.
- Massive size reduction of
QtJambi
andQtJambiCore
library - QtJambi Deployer is now able to create self-extracting Qt library bundles.
QtJambi 6.3.2, 6.2.5 and 5.15.7 are source- and binary-compatible to its predecessor releases.
Solved issues:
- Issue 51: UIC: tabwidget conversion problem
- Issue 48: iconfont does not work as expected
- Issue 27: Building QtJambi on windows using mingw
- Issue 52: The qtjambi-deployer module does not work with jre8
- Issue 53: Child thread executes custom signal and crashes when updating interface content
- Comining qtjambi* and qtjambi*-jre8 modules.
- Subsuming classpath resources under Qt resources identified with colon path
":path/to/resource"
. You can continue to use"classpath:path/to/resource"
but it is subject to be removed in the future. Classpath resources asQUrl
is specified byqrc
scheme:new QUrl("qrc:path/to/resource")
. - Allowing to combine QtJambi 6.3.1 with QtJambi modules of different version 6.3.x
- Adding operator functions for QPoint, QSize, QCborArray, QJsonArray, QDeadlineTimer, QPainterPath and QJSPrimitiveValue to be used in Kotlin.
- Removing outdated source code of examples and utilities
- Improved exception handling in QThreads
QtJambi 6.3.1, 6.2.4 and 5.15.6 are source- and binary-compatible to its predecessor releases.
Solved issues:
- Issue 15: Crash during shutdown on some linux systems is solved now (verified).
- Issue 18: FileAlreadyExistsException fixed
- Module QtQuickTest now available
- Module ActiveQt now available
- Module QtPDF now available for Qt 6.3
- Module QtUiTools now also available for QtJambi 5
io.qt.QtResources
is now deprecated. Its functions are moved toio.qt.core.QResource
.QHashSeed
is now availableQList.of(T...)
now returnsQStringList
ifT
isString
.- Adding missing functions:
QUuid::fromString
QStringConverter::encodingForHtml
QStringConverter::encodingForData
QBluetoothUuid::toUInt16
QBluetoothUuid::toUInt32
endl
onQTextStream
QStack::top
- QtJambi now gives information when trying to combine MinGW and MSVC compiled libraries.
- Tool UIC for QtJambi (Issue 17)
- Deployer now generates source code for compiling plugin library
QtJambi 6.2.3 and 5.15.5 are source- and binary-compatible to its predecessor releases.
Solved issues:
- Issue 15: Crash during shutdown on some linux systems should be solved (blind fix).
- Issue 16: All possible race conditions in
QMetaObject
solved. - Issue 18: QtJambi stores library files temporarily or persistently by choice. Therefore, use JVM arguments
io.qt.keep-temp-deployment
orio.qt.deploymentdir
. - Issue 19:
QDBusReply<T>
andQDBusPendingReply<T>
now work as expected. - Issue 23: QPainter now also works fine in
QOpenGLWidget::paintGL()
. - Issue 25: invalid
QVariant
is now coded by Javanull
. If you want to specify null pointer variant you need to callQVariant.fromValue(null)
. - Issue 27: Reduced size of single compilation units to support MinGW.
- Issue 30: QML debugging is now possible by starting an application with Java runtime flag
-Dio.qt.enabled-qml-debugging=true
. - Signal connection to synthetic java method no longer throws an exception.
QtJambi 6.2.2 and 5.15.4 are source- and binary-compatible to its predecessor releases.
#Versioning
Since there are multiple releases of QtJambi for the same Qt version and since QtJambi is now available on Maven, it is necessary to use more specific version numbers for different QtJambi releases.
From now on, QtJambi builds have the major and minor version of their assigned Qt versions (e.g. 6.2) and an increasing patch version counting the number of releases. Since QtJambi for Qt 5.15 was published three times up to now, the current forth QtJambi release is 5.15.3. QtJambi for Qt6.2 is release number 6.2.1. The first QtJambi for Qt 6.3 will be versioned 6.3.0.
QtJambi 5.15.3 works with any patch version of Qt 5.15 and, accordingly, QtJambi 6.2.1 works with any patch version of Qt 6.2.
QCoreApplication
, QWindow
and other components now give access to their platform integration on macOS, Windows and X11. Example:
QWindow window = ...
QWindowsWindow windowsWindow = window.nativeInterface(QWindowsWindow.class);
QCocoaWindow macWindow = window.nativeInterface(QCocoaWindow.class);
QXcbWindow x11Window = window.nativeInterface(QXcbWindow.class);
Implementing overloaded signals is simplyfied and can now be done even outside of QObjects. Therefore, subclass QObject.MultiSignal
,
QInstanceMemberSignals.MultiSignal
or QStaticMemberSignals.MultiSignal
and add custom overloaded emit methods.
The underlying signal structure is generated automatically.
Beside this, you can connect to overloaded signals without specifying its parameters by overload(Class)
.
The intended parameterized signal is determined in accordance with the slot's parameters. Example:
QCompleter completer = ...
completer.activated.connect(receiver, "onActivatedIndex(QModelIndex)");
completer.activated.connect(receiver, "onActivatedText(String)");
completer.activated.connect(receiver::onActivatedIndex);
completer.activated.connect(receiver::onActivatedText);
Signal initialization is improved bringing better performance for object initialization.
A lot!
QtJambi 6.2.1 and 5.15.3 are source-compatible but maybe not be binary-compatible to its predecessor releases. You might need to compile your code with the new QtJambi version again.