Простой вариант - использовать qresource, но перед этим вашей папке Темы необходимо создать qmldir:
qmldir
singleton Theme 1.0 Theme.qml
Итак, в концеВаш проект будет иметь следующую структуру:
|-- main.py
`-- qml
|-- Themes
| |-- Theme.qml
| `-- qmldir
`-- main.qml
Теперь создайте .qrc, который будет иметь .qml, и поместите его на стороне .py:
qml.qrc
<RCC>
<qresource prefix="/">
<file>qml/main.qml</file>
<file>qml/Themes/Theme.qml</file>
<file>qml/Themes/qmldir</file>
</qresource>
</RCC>
Теперь вы должны преобразовать .qrc в .py, используя pyrcc5:
pyrcc5 qml.qrc -o qml_rc.py
Получив следующую структуру:
|-- main.py
|-- qml
| |-- Themes
| | |-- Theme.qml
| | `-- qmldir
| `-- main.qml
|-- qml.qrc
`-- qml_rc.py
ТогдаВы должны импортировать qml_rc.py
в main.py
и изменить QUrl
:
import os
import sys
from PyQt5 import QtCore, QtGui, QtQml
import qml_rc
if __name__ == '__main__':
os.environ["QT_AUTO_SCREEN_SCALE_FACTOR"] = "1"
app = QtGui.QGuiApplication(sys.argv)
app.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
#Initialize the QML rendering engine
engine = QtQml.QQmlApplicationEngine()
#Load the main window element
ctx = engine.rootContext()
engine.load(QtCore.QUrl("qrc:/qml/main.qml"))
#Show the Application Window
if not engine.rootObjects():
sys.exit(-1)
#Execute and cleanup
sys.exit(app.exec_())
Вы можете найти полный проект здесь
ОБНОВЛЕНИЕ:
Также вы можете игнорировать .qrc:
|-- main.py
`-- qml
|-- Themes
| |-- Theme.qml
| `-- qmldir
`-- main.qml
со следующими main.py:
import os
import sys
from PyQt5 import QtCore, QtGui, QtQml
if __name__ == '__main__':
os.environ["QT_AUTO_SCREEN_SCALE_FACTOR"] = "1"
app = QtGui.QGuiApplication(sys.argv)
app.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
#Initialize the QML rendering engine
engine = QtQml.QQmlApplicationEngine()
#Load the main window element
ctx = engine.rootContext()
dirname = os.path.dirname(os.path.abspath(__file__))
qml_file = os.path.join(dirname, 'qml','main.qml')
engine.load(QtCore.QUrl.fromLocalFile(qml_file))
#Show the Application Window
if not engine.rootObjects():
sys.exit(-1)
#Execute and cleanup
sys.exit(app.exec_())
Вы можетенайти полный проект здесь