1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
|
#------------------------------------------------------------------------------
# Copyright (c) 2013-2025, Nucleic Development Team.
#
# Distributed under the terms of the Modified BSD License.
#
# The full license is in the file LICENSE, distributed with this software.
#------------------------------------------------------------------------------
from atom.api import Typed
from enaml.widgets.toolkit_object import ProxyToolkitObject
from .QtCore import QObject
# PySide requires weakrefs for using bound methods as slots.
# PyQt doesn't, but executes unsafe code if not using weakrefs.
class QtToolkitObject(ProxyToolkitObject, enable_weakrefs=True):
""" A Qt implementation of an Enaml ProxyToolkitObject.
"""
#: A reference to the toolkit widget created by the proxy.
widget = Typed(QObject)
#--------------------------------------------------------------------------
# Initialization API
#--------------------------------------------------------------------------
def create_widget(self):
""" Create the toolkit widget for the proxy object.
This method is called during the top-down pass, just before the
'init_widget()' method is called. This method should create the
toolkit widget and assign it to the 'widget' attribute.
"""
self.widget = QObject(self.parent_widget())
def init_widget(self):
""" Initialize the state of the toolkit widget.
This method is called during the top-down pass, just after the
'create_widget()' method is called. This method should init the
state of the widget. The child widgets will not yet be created.
"""
widget = self.widget
if widget is not None:
# Each Qt object gets a name. If one is not provided by the
# widget author, one is generated. This is required so that
# Qt stylesheet cascading can be prevented (Enaml's styling
# engine applies the cascade itself). Names provided by the
# widget author are assumed to be unique.
d = self.declaration
name = d.name or 'obj-%d' % id(d)
widget.setObjectName(name)
def init_layout(self):
""" Initialize the layout of the toolkit widget.
This method is called during the bottom-up pass. This method
should initialize the layout of the widget. The child widgets
will be fully initialized and layed out when this is called.
"""
pass
#--------------------------------------------------------------------------
# ProxyToolkitObject API
#--------------------------------------------------------------------------
def activate_top_down(self):
""" Activate the proxy for the top-down pass.
"""
self.create_widget()
self.init_widget()
def activate_bottom_up(self):
""" Activate the proxy tree for the bottom-up pass.
"""
self.init_layout()
def destroy(self):
""" A reimplemented destructor.
This destructor will clear the reference to the toolkit widget
and set its parent to None.
"""
widget = self.widget
if widget is not None:
widget.setParent(None)
widget.deleteLater()
del self.widget
super(QtToolkitObject, self).destroy()
def child_removed(self, child):
""" Handle the child removed event from the declaration.
This handler will unparent the child toolkit widget. Subclasses
which need more control should reimplement this method.
"""
super(QtToolkitObject, self).child_removed(child)
if child.widget is not None:
child.widget.setParent(None)
#--------------------------------------------------------------------------
# Public API
#--------------------------------------------------------------------------
def parent_widget(self):
""" Get the parent toolkit widget for this object.
Returns
-------
result : QObject or None
The toolkit widget declared on the declaration parent, or
None if there is no such parent.
"""
parent = self.parent()
if parent is not None:
return parent.widget
def child_widgets(self):
""" Get the child toolkit widgets for this object.
Returns
-------
result : iterable of QObject
The child widgets defined for this object.
"""
for child in self.children():
w = child.widget
if w is not None:
yield w
|