How to create QML singleton
-
If I move Colors.qml to root folder and change CMakeList.txt accordingly:
set_source_files_properties(Colors.qml PROPERTIES QT_QML_SINGLETON_TYPE TRUE) qt_add_qml_module(appSingletonTest URI SingletonTest VERSION 1.0 QML_FILES qml/main.qml Colors.qml )
I get this error when I run the application:
qrc:/SingletonTest/qml/main.qml:14: ReferenceError: Colors is not defined
It seems all QML files must be in root folder including some other custom components files.
If I do this, it works:
set_source_files_properties(Colors.qml PROPERTIES QT_QML_SINGLETON_TYPE TRUE) qt_add_qml_module(appSingletonTest URI SingletonTest VERSION 1.0 QML_FILES main.qml Colors.qml SomeComponent.qml )
This strange, so far I put all my QML files to dedicated folder (qml/) to separate it from C++ and everything was working (see my first example code) - only the singleton causes some problem.
I could consider this as workaround but I do not like it since I will mix QML with C++ and it will be a mess :-(
EDIT: It seems that this construction works too:
set_source_files_properties(qmlfiles/Colors.qml PROPERTIES QT_QML_SINGLETON_TYPE TRUE) set_source_files_properties(qmlfiles/main.qml PROPERTIES QT_RESOURCE_ALIAS main.qml) set_source_files_properties(qmlfiles/Colors.qml PROPERTIES QT_RESOURCE_ALIAS Colors.qml) set_source_files_properties(qmlfiles/SomeComponent.qml PROPERTIES QT_RESOURCE_ALIAS SomeComponent.qml) qt_add_qml_module(appSingletonTest URI SingletonTest VERSION 1.0 QML_FILES qmlfiles/main.qml qmlfiles/Colors.qml qmlfiles/SomeComponent.qml )
-
It seems all QML files must be in root folder including some other custom components files.
If I do this, it works:
set_source_files_properties(Colors.qml PROPERTIES QT_QML_SINGLETON_TYPE TRUE) qt_add_qml_module(appSingletonTest URI SingletonTest VERSION 1.0 QML_FILES main.qml Colors.qml SomeComponent.qml )
This strange, so far I put all my QML files to dedicated folder (qml/) to separate it from C++ and everything was working (see my first example code) - only the singleton causes some problem.
I could consider this as workaround but I do not like it since I will mix QML with C++ and it will be a mess :-(
EDIT: It seems that this construction works too:
set_source_files_properties(qmlfiles/Colors.qml PROPERTIES QT_QML_SINGLETON_TYPE TRUE) set_source_files_properties(qmlfiles/main.qml PROPERTIES QT_RESOURCE_ALIAS main.qml) set_source_files_properties(qmlfiles/Colors.qml PROPERTIES QT_RESOURCE_ALIAS Colors.qml) set_source_files_properties(qmlfiles/SomeComponent.qml PROPERTIES QT_RESOURCE_ALIAS SomeComponent.qml) qt_add_qml_module(appSingletonTest URI SingletonTest VERSION 1.0 QML_FILES qmlfiles/main.qml qmlfiles/Colors.qml qmlfiles/SomeComponent.qml )
@KejPi open a bugreport because QML SINGLETON doesn't work if not in root folder
-
@KejPi open a bugreport because QML SINGLETON doesn't work if not in root folder
-
I do not know why the one from the post does not work, but singletons from subdirectories work.
I used here
@Mesrine aaah - good to know. just porting my apps from QMake to CMake. next step will be to modernize my apps, where I'll need QML SINGLETONS, too
-
It seems all QML files must be in root folder including some other custom components files.
If I do this, it works:
set_source_files_properties(Colors.qml PROPERTIES QT_QML_SINGLETON_TYPE TRUE) qt_add_qml_module(appSingletonTest URI SingletonTest VERSION 1.0 QML_FILES main.qml Colors.qml SomeComponent.qml )
This strange, so far I put all my QML files to dedicated folder (qml/) to separate it from C++ and everything was working (see my first example code) - only the singleton causes some problem.
I could consider this as workaround but I do not like it since I will mix QML with C++ and it will be a mess :-(
EDIT: It seems that this construction works too:
set_source_files_properties(qmlfiles/Colors.qml PROPERTIES QT_QML_SINGLETON_TYPE TRUE) set_source_files_properties(qmlfiles/main.qml PROPERTIES QT_RESOURCE_ALIAS main.qml) set_source_files_properties(qmlfiles/Colors.qml PROPERTIES QT_RESOURCE_ALIAS Colors.qml) set_source_files_properties(qmlfiles/SomeComponent.qml PROPERTIES QT_RESOURCE_ALIAS SomeComponent.qml) qt_add_qml_module(appSingletonTest URI SingletonTest VERSION 1.0 QML_FILES qmlfiles/main.qml qmlfiles/Colors.qml qmlfiles/SomeComponent.qml )
-
I do not know why the one from the post does not work, but singletons from subdirectories work.
I used here
-
I do not know how to attach file, so this is cope and paste of minimal example:
CMakeList.txt
cmake_minimum_required(VERSION 3.16) project(SingletonTest VERSION 0.1 LANGUAGES CXX) set(CMAKE_CXX_STANDARD_REQUIRED ON) find_package(Qt6 6.4 REQUIRED COMPONENTS Quick) qt_standard_project_setup() qt_add_executable(appSingletonTest main.cpp ) set_source_files_properties(qml/Colors.qml PROPERTIES QT_QML_SINGLETON_TYPE TRUE) qt_add_qml_module(appSingletonTest URI SingletonTest VERSION 1.0 QML_FILES qml/main.qml QML_FILES qml/Colors.qml ) # Qt for iOS sets MACOSX_BUNDLE_GUI_IDENTIFIER automatically since Qt 6.1. # If you are developing for iOS or macOS you should consider setting an # explicit, fixed bundle identifier manually though. set_target_properties(appSingletonTest PROPERTIES # MACOSX_BUNDLE_GUI_IDENTIFIER com.example.appSingletonTest MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION} MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR} MACOSX_BUNDLE TRUE WIN32_EXECUTABLE TRUE ) target_link_libraries(appSingletonTest PRIVATE Qt6::Quick ) include(GNUInstallDirs) install(TARGETS appSingletonTest BUNDLE DESTINATION . LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} )
main.cpp:
#include <QGuiApplication> #include <QQmlApplicationEngine> int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); QQmlApplicationEngine engine; const QUrl url(u"qrc:/SingletonTest/qml/main.qml"_qs); QObject::connect( &engine, &QQmlApplicationEngine::objectCreationFailed, &app, []() { QCoreApplication::exit(-1); }, Qt::QueuedConnection); engine.load(url); return app.exec(); }
qml/main.qml:
import QtQuick import SingletonTest Window { width: 640 height: 480 visible: true title: qsTr("Hello World") Rectangle { width: parent.width/2 height: parent.height/2 anchors.centerIn: parent color: Colors.myColor } }
qml/Colors.qml:
pragma Singleton import QtQuick QtObject { id: colors readonly property color myColor: "red" }
When I run it I get this message:
qrc:/SingletonTest/qml/main.qml:14: TypeError: Colors was a singleton at compile time, but is not a singleton anymore.
I have used your minimal example and works ok :) .
The only thing I changed was that instead of
CMakeList.txt
i namedCMakeLists.txt
.I have tested it with qt(shared libraries) 6.5,6.6,6.7 in Linux.
Make sure you are using the correct
CMakeLists.txt
.
And let us know your platform and Qt version. -
Yes, it was only typo, I use the CMakeLists.txt created by Qt Creator.
I am running it on MacOS 14.2, Qt version 6.5.3@KejPi
Do you run the application that is on the build directory or the installed one?Try putting
set_source_files_properties(qml/Colors.qml PROPERTIES QT_QML_SINGLETON_TYPE TRUE)
before
qt_add_executable(appSingletonTest main.cpp )
in your minimal example.
If that does not work try removing some macos properties in the CMakeLists.txt.
If nothing works I would say you can open a bug as suggested by @ekkescorner -
@KejPi
Do you run the application that is on the build directory or the installed one?Try putting
set_source_files_properties(qml/Colors.qml PROPERTIES QT_QML_SINGLETON_TYPE TRUE)
before
qt_add_executable(appSingletonTest main.cpp )
in your minimal example.
If that does not work try removing some macos properties in the CMakeLists.txt.
If nothing works I would say you can open a bug as suggested by @ekkescorner