2 from PyQt4
.QtCore
import QObject
3 from PyQt4
.QtCore
import SIGNAL
4 from PyQt4
.QtGui
import QSpinBox
5 from PyQt4
.QtGui
import QPixmap
6 from PyQt4
.QtGui
import QTextEdit
7 from PyQt4
.QtGui
import QLineEdit
8 from PyQt4
.QtGui
import QListWidget
10 from observer
import Observer
12 class QObserver(Observer
, QObject
):
14 def __init__(self
, model
, view
):
15 Observer
.__init
__(self
, model
)
16 QObject
.__init
__(self
)
22 self
.__model
_to
_view
= {}
23 self
.__view
_to
_model
= {}
25 def connect(self
, obj
, signal_str
, *args
):
26 '''Convenience function so that subclasses do not have
27 to import QtCore.SIGNAL.'''
29 if type(signal
) is str:
30 signal
= SIGNAL(signal
)
31 return QObject
.connect(obj
, signal
, *args
)
33 def SLOT(self
, *args
):
34 '''Default slot to handle all Qt callbacks.
35 This method delegates to callbacks from add_signals.'''
37 widget
= self
.sender()
38 sender
= str(widget
.objectName())
40 if sender
in self
.__callbacks
:
41 self
.__callbacks
[sender
](*args
)
43 elif sender
in self
.__view
_to
_model
:
45 model_attr
= self
.__view
_to
_model
[sender
]
46 if isinstance(widget
, QTextEdit
):
47 value
= str(widget
.toPlainText())
48 model
.set(model_attr
, value
, notify
=False)
49 elif isinstance(widget
, QLineEdit
):
50 value
= str(widget
.text())
51 model
.set(model_attr
, value
, notify
=False)
53 print("SLOT(): Unknown widget:", sender
, widget
)
55 def add_signals(self
, signal_str
, *objects
):
56 '''Connects object's signal to the QObserver.'''
58 self
.connect(obj
, signal_str
, self
.SLOT
)
60 def add_callbacks(self
, callbacks
):
61 '''Registers callbacks that are called in response to GUI events.'''
62 for sender
, callback
in callbacks
.iteritems():
63 self
.__callbacks
[sender
] = callback
65 def model_to_view(self
, model_attr
, *widget_names
):
66 '''Binds model attributes to qt widgets(model->view)'''
67 self
.add_subject(model_attr
)
68 self
.__model
_to
_view
[model_attr
] = widget_names
69 for widget_name
in widget_names
:
70 self
.__view
_to
_model
[widget_name
] = model_attr
72 def add_actions(self
, model_attr
, callback
):
73 '''Register view actions that are called in response to
74 view changes.(view->model)'''
75 self
.add_subject(model_attr
)
76 self
.__actions
[model_attr
] = callback
78 def subject_changed(self
, attr
, value
):
79 '''Sends a model attribute to the view(model->view)'''
80 if attr
in self
.__model
_to
_view
:
81 for widget_name
in self
.__model
_to
_view
[attr
]:
82 widget
= getattr(self
.view
, widget_name
)
83 if isinstance(widget
, QSpinBox
):
84 widget
.setValue(value
)
85 elif isinstance(widget
, QPixmap
):
87 elif isinstance(widget
, QTextEdit
):
89 elif isinstance(widget
, QLineEdit
):
91 elif isinstance(widget
, QListWidget
):
93 for i
in value
: widget
.addItem(i
)
95 print('subject_changed(): '
99 if attr
not in self
.__actions
:
102 if attr
in self
.__model
_to
_view
:
103 for widget_name
in self
.__model
_to
_view
[attr
]:
104 widget
= getattr(self
.view
, widget_name
)
105 widgets
.append(widget
)
106 # Call the model callback w/ the view's widgets as the args
107 self
.__actions
[attr
](*widgets
)