I guess PySide saves the QApplication internally, while PyQt4 doesn't.
Saving the QApplication as a global prevents it from getting garbage
collected. Saving the QApplication as an instance variable in the
ImageViewer also works, but that might prevent the ImageViewer from getting
garbage collected in an interactive session. (weakref doesn't seem to work here.)
New QApplication and event-loop implementation stolen shamelessly from
IPython. Strangely, running the viewer at the IPython prompt will
open an orphan Matplotlib figure window, but running a script using
`%run` does not.
Only tested on PySide (not PyQt4).
nose and autodoc imports the viewer modules so all PyQt4 imports must be wrapped in a try-except block. In addition, any classes derived from PyQt4 must be proxied since the class definition are run on import. This is really hacky.
The `ptype` parameter of widget can now be set to 'plugin'. When this is the case, the plugin will set a plugin attribute whenever the widget is updated.
As an example, this commit adds a ComboBox widget which is hooked into the overlay color of the OverlayPlugin.