88 lines
2.7 KiB
Markdown
88 lines
2.7 KiB
Markdown
# Runtime QML for Qt
|
|
|
|
**Written by**: *Benjamin Balga.*
|
|
**Copyright**: ***2018***, *Benjamin Balga*, released under BSD license.
|
|
|
|
|
|
## About
|
|
|
|
This is a base project to get runtime QML reload in your Qt project.
|
|
It allows you to reload all QML code at runtime, without recompiling or restarting your app, saving time.
|
|
|
|
With auto-reload, QML files are watched (based on the QRC file) and reloaded when you save them, or can trigger it manually.
|
|
|
|
On reload, all windows are closed, and the main window is reloaded. All "QML-only data" is lost, so use links to C++ models/properties as needed.
|
|
|
|
It only works with Window component as top object, or QQuickWindow subclasses.
|
|
|
|
### Examples
|
|
Example project is located here: https://github.com/GIPdA/runtimeqml_examples
|
|
|
|
|
|
## How to use it in your project
|
|
|
|
Clone the repo into your project (or copy-paste the ```runtimeqml``` folder) and import the ```.pri``` project file into your ```.pro``` file:
|
|
|
|
include(runtimeqml/runtimeqml.pri)
|
|
|
|
|
|
### With Qbs
|
|
The Qbs project file includes RuntimeQML as a static library. Check the example project to see how to include it in your project.
|
|
|
|
|
|
## Usage
|
|
|
|
Include ```runtimeqml.h``` header file, and create the RuntimeQML object (after the QML engine) :
|
|
|
|
RuntimeQML *rt = new RuntimeQML(&engine, QRC_SOURCE_PATH"/qml.qrc");
|
|
|
|
The second argument is the path to your qrc file listing all your QML files, needed for the auto-reload feature only. You can omit it if you don't want auto-reload.
|
|
```QRC_SOURCE_PATH``` is defined in the ```.pri/.qbs``` file to its parent path, just to not have to manually set an absolute path...
|
|
|
|
|
|
Set the "options" you want, or not:
|
|
|
|
rt->noDebug(); // Removes debug prints
|
|
rt->setAutoReload(true); // Enable auto-reload (begin to watch files)
|
|
//rt->setCloseAllOnReload(false); // Don't close all windows on reload. Not advised!
|
|
rt->setMainQmlFilename("main.qml"); // This is the file that loaded on reload, default is "main.qml"
|
|
|
|
For the auto-reload feature:
|
|
|
|
rt->addSuffix("conf"); // Adds a file suffix to the "white list" for watched files. "qml" is already in.
|
|
rt->ignorePrefix("/test"); // Ignore a prefix in the QRC file.
|
|
rt->ignoreFile("/Page2.qml"); // Ignore a file name with prefix (supports classic wildcard matching)
|
|
|
|
|
|
Then load the main QML file :
|
|
|
|
rt->reload();
|
|
|
|
And you're all set!
|
|
|
|
|
|
You can also check the test project. Beware, includes and defines differs a bit...
|
|
|
|
|
|
## Manual reload
|
|
|
|
Add the RuntimeQML object to the QML context:
|
|
|
|
engine.rootContext()->setContextProperty("RuntimeQML", rt);
|
|
|
|
Trigger the reload when and where you want, like with a button:
|
|
|
|
Button {
|
|
text: "Reload"
|
|
onClicked: {
|
|
RuntimeQML.reload();
|
|
}
|
|
}
|
|
|
|
You can do it in C++ too, of course.
|
|
|
|
|
|
|
|
## License
|
|
See LICENSE file.
|