git clone https://gist.github.com/fa01c80080363df3433d.git qmlreload
cd qmlreload
python main.pyEdit either SceneGraphEditor.qml or Viewport.qml and then hover it and hit F5 to reload.
| # Based on this question on StackOverflow | |
| # http://stackoverflow.com/questions/19604552/qml-loader-not-shows-changes-on-qml-file | |
| import sys | |
| from PyQt5 import QtQml, QtGui, QtCore | |
| class ComponentCacheManager(QtCore.QObject): | |
| def __init__(self, engine): | |
| super(ComponentCacheManager, self).__init__() | |
| self.engine = engine | |
| @QtCore.pyqtSlot() | |
| def trim(self): | |
| self.engine.clearComponentCache() | |
| if __name__ == '__main__': | |
| app = QtGui.QGuiApplication(sys.argv) | |
| engine = QtQml.QQmlApplicationEngine() | |
| manager = ComponentCacheManager(engine) | |
| context = engine.rootContext() | |
| context.setContextProperty("componentCache", manager) | |
| engine.load(QtCore.QUrl.fromLocalFile("main.qml")) | |
| app.exec_() |
| import QtQuick 2.5 | |
| import QtQuick.Controls 1.2 | |
| import QtQuick.Layouts 1.1 | |
| import QtQuick.Window 2.2 | |
| ApplicationWindow { | |
| id: window | |
| width: 300 | |
| height: 200 | |
| visible: true | |
| title: "Feather 0.1" | |
| Row { | |
| id: sv | |
| anchors.fill: parent | |
| Loader { | |
| property string path: "SceneGraphEditor.qml" | |
| width: 150 | |
| height: 200 | |
| source: path | |
| } | |
| Loader { | |
| property string path: "Viewport.qml" | |
| width: 150 | |
| height: 200 | |
| source: path | |
| } | |
| } | |
| MouseArea { | |
| id: ma | |
| anchors.fill: parent | |
| hoverEnabled: true | |
| } | |
| Action { | |
| shortcut: "F5" | |
| onTriggered: { | |
| var loader = sv.childAt(ma.mouseX, ma.mouseY); | |
| print("Reloading ", loader.path); | |
| loader.setSource(""); | |
| componentCache.trim(); | |
| loader.setSource(loader.path); | |
| } | |
| } | |
| } |
| import QtQuick 2.5 | |
| Rectangle { | |
| color: "purple" | |
| } |
| import QtQuick 2.5 | |
| Rectangle { | |
| color: "yellow" | |
| } |
Thanks!!