73 lines
2.6 KiB
Python
73 lines
2.6 KiB
Python
from lib.helpers import get_resource
|
|
from PyQt5.QtCore import QObject, Qt, QUrl
|
|
from PyQt5.QtQuickWidgets import QQuickWidget
|
|
|
|
# TODO: https://www.pythonguis.com/tutorials/qml-qtquick-python-application/
|
|
|
|
|
|
class Qml_Widget(QQuickWidget):
|
|
def __init__(self, background=None):
|
|
super().__init__()
|
|
self.setAttribute(Qt.WA_DeleteOnClose)
|
|
# self.setAttribute(Qt.WA_TranslucentBackground)
|
|
if background is None:
|
|
self.setClearColor(Qt.transparent)
|
|
self.setAttribute(Qt.WA_AlwaysStackOnTop)
|
|
else:
|
|
self.setClearColor(background)
|
|
me = self.__class__.__name__
|
|
u = get_resource("ui/{0}/{0}.qml".format(me.lower()))
|
|
self.setSource(QUrl(u))
|
|
# self.qml_item = self.rootObject().findChild(QObject, me)
|
|
self.qml_item = self.rootObject()
|
|
# self.setResizeMode(self.SizeViewToRootObject)
|
|
# self.setResizeMode(self.SizeRootObjectToView)
|
|
# print(self.dump(self.get_child(self.qml_item, "gauge")), flush=True)
|
|
|
|
# def dump(self, object=None):
|
|
# if object is None:
|
|
# object = self.qml_item
|
|
# mo = object.metaObject()
|
|
# d = {}
|
|
# for i in range(mo.propertyCount()):
|
|
# mp = mo.property(i)
|
|
# try:
|
|
# d[mp.name()] = mp.read(object)
|
|
# except TypeError:
|
|
# d[mp.name()] = None
|
|
# return d
|
|
|
|
def get_child(self, item=None, address=0):
|
|
if item is None:
|
|
item = self.qml_item
|
|
|
|
def _get_child(item, address=0):
|
|
if address is None:
|
|
return item
|
|
elif type(address) is str:
|
|
return item.findChild(QObject, address)
|
|
elif type(address) is int:
|
|
children = item.children()
|
|
if address < len(children):
|
|
return children[address]
|
|
else:
|
|
raise AttributeError("{!r}".format(address))
|
|
|
|
try:
|
|
if type(address) is list:
|
|
for a in address:
|
|
item = _get_child(item, a)
|
|
else:
|
|
item = _get_child(item, address)
|
|
return item
|
|
except AttributeError as e:
|
|
raise AttributeError("qml child item not found: {} ({!r})".format(str(e), address))
|
|
|
|
def set(self, property, value, child=None):
|
|
item = self.get_child(self.qml_item, child)
|
|
item.setProperty(property, value)
|
|
|
|
def get(self, property, child=None):
|
|
item = self.get_child(self.qml_item, child)
|
|
return item.property(property)
|