changeset 27645:028205a91a07

eliminate global access to Octave resources in qt graphics classes Provide reference to base_qobject to qt graphics classes to eliminate need for accessing it through a global variable. * qt-graphics-toolkit.h, qt-graphics-toolkit.cc (qt_graphics_toolkit::m_octave_qobj): New member variable. (qt_graphics_toolkit::qt_graphics_toolkit): Accept reference to base_qobject as argument. (qt_graphics_toolkit::create_object): Pass m_octave_qobj to create functions for individual graphics objects. * __init_qt__.cc (__init__): Temporarily access base_qobject by calling octave::base_qobject::the_octave_qobject. Pass it to qt_graphics_toolkit constructor. * BaseControl.h, BaseControl.cc, ButtonControl.h, ButtonControl.cc, ButtonGroup.h, ButtonGroup.cc, Canvas.h, Canvas.cc, CheckBoxControl.h, CheckBoxControl.cc, Container.h, Container.cc, ContextMenu.h, ContextMenu.cc, EditControl.h, EditControl.cc, Figure.h, Figure.cc, GLCanvas.h, GLCanvas.cc, ListBoxControl.h, ListBoxControl.cc, Menu.h, Menu.cc, Panel.h, Panel.cc, PopupMenuControl.h, PopupMenuControl.cc, PushButtonControl.h, PushButtonControl.cc, PushTool.h, PushTool.cc, RadioButtonControl.h, RadioButtonControl.cc, SliderControl.h, SliderControl.cc, Table.h, Table.cc, TextControl.h, TextControl.cc, ToggleButtonControl.h, ToggleButtonControl.cc, ToggleTool.h, ToggleTool.cc, ToolBar.h, ToolBar.cc, ToolBarButton.h, ToolBarButton.cc, annotation-dialog.h, annotation-dialog.cc: Accept reference to base_qobject in create function and constructors for graphics objects. Eliminate global access to GUI resources.
author John W. Eaton <jwe@octave.org>
date Tue, 05 Nov 2019 13:28:45 -0500
parents cca325162ed7
children 2ff12b707f60
files libgui/graphics/BaseControl.cc libgui/graphics/BaseControl.h libgui/graphics/ButtonControl.cc libgui/graphics/ButtonControl.h libgui/graphics/ButtonGroup.cc libgui/graphics/ButtonGroup.h libgui/graphics/Canvas.cc libgui/graphics/Canvas.h libgui/graphics/CheckBoxControl.cc libgui/graphics/CheckBoxControl.h libgui/graphics/Container.cc libgui/graphics/Container.h libgui/graphics/ContextMenu.cc libgui/graphics/ContextMenu.h libgui/graphics/EditControl.cc libgui/graphics/EditControl.h libgui/graphics/Figure.cc libgui/graphics/Figure.h libgui/graphics/GLCanvas.cc libgui/graphics/GLCanvas.h libgui/graphics/ListBoxControl.cc libgui/graphics/ListBoxControl.h libgui/graphics/Menu.cc libgui/graphics/Menu.h libgui/graphics/Panel.cc libgui/graphics/Panel.h libgui/graphics/PopupMenuControl.cc libgui/graphics/PopupMenuControl.h libgui/graphics/PushButtonControl.cc libgui/graphics/PushButtonControl.h libgui/graphics/PushTool.cc libgui/graphics/PushTool.h libgui/graphics/RadioButtonControl.cc libgui/graphics/RadioButtonControl.h libgui/graphics/SliderControl.cc libgui/graphics/SliderControl.h libgui/graphics/Table.cc libgui/graphics/Table.h libgui/graphics/TextControl.cc libgui/graphics/TextControl.h libgui/graphics/ToggleButtonControl.cc libgui/graphics/ToggleButtonControl.h libgui/graphics/ToggleTool.cc libgui/graphics/ToggleTool.h libgui/graphics/ToolBar.cc libgui/graphics/ToolBar.h libgui/graphics/ToolBarButton.cc libgui/graphics/ToolBarButton.h libgui/graphics/__init_qt__.cc libgui/graphics/annotation-dialog.cc libgui/graphics/annotation-dialog.h libgui/graphics/qt-graphics-toolkit.cc libgui/graphics/qt-graphics-toolkit.h
diffstat 53 files changed, 450 insertions(+), 179 deletions(-) [+]
line wrap: on
line diff
--- a/libgui/graphics/BaseControl.cc	Tue Nov 05 08:31:06 2019 -0500
+++ b/libgui/graphics/BaseControl.cc	Tue Nov 05 13:28:45 2019 -0500
@@ -93,7 +93,8 @@
     w->setPalette (p);
   }
 
-  BaseControl::BaseControl (const graphics_object& go, QWidget *w)
+  BaseControl::BaseControl (octave::base_qobject&, const graphics_object& go,
+                            QWidget *w)
     : Object (go, w), m_normalizedFont (false), m_keyPressHandlerDefined (false)
   {
     qObject ()->setObjectName ("UIControl");
--- a/libgui/graphics/BaseControl.h	Tue Nov 05 08:31:06 2019 -0500
+++ b/libgui/graphics/BaseControl.h	Tue Nov 05 13:28:45 2019 -0500
@@ -28,13 +28,19 @@
 class QEvent;
 class QObject;
 
+namespace octave
+{
+  class base_qobject;
+}
+
 namespace QtHandles
 {
 
   class BaseControl : public Object
   {
   public:
-    BaseControl (const graphics_object& go, QWidget *w);
+    BaseControl (octave::base_qobject& oct_qobj, const graphics_object& go,
+                 QWidget *w);
     ~BaseControl (void);
 
     Container * innerContainer (void) { return nullptr; }
--- a/libgui/graphics/ButtonControl.cc	Tue Nov 05 08:31:06 2019 -0500
+++ b/libgui/graphics/ButtonControl.cc	Tue Nov 05 13:28:45 2019 -0500
@@ -37,8 +37,10 @@
 namespace QtHandles
 {
 
-  ButtonControl::ButtonControl (const graphics_object& go, QAbstractButton *btn)
-    : BaseControl (go, btn), m_blockCallback (false)
+  ButtonControl::ButtonControl (octave::base_qobject& oct_qobj,
+                                const graphics_object& go,
+                                QAbstractButton *btn)
+    : BaseControl (oct_qobj, go, btn), m_blockCallback (false)
   {
     uicontrol::properties& up = properties<uicontrol> ();
 
--- a/libgui/graphics/ButtonControl.h	Tue Nov 05 08:31:06 2019 -0500
+++ b/libgui/graphics/ButtonControl.h	Tue Nov 05 13:28:45 2019 -0500
@@ -27,6 +27,11 @@
 
 class QAbstractButton;
 
+namespace octave
+{
+  class base_qobject;
+}
+
 namespace QtHandles
 {
 
@@ -35,7 +40,8 @@
     Q_OBJECT
 
   public:
-    ButtonControl (const graphics_object& go, QAbstractButton *btn);
+    ButtonControl (octave::base_qobject& oct_qobj, const graphics_object& go,
+                   QAbstractButton *btn);
     ~ButtonControl (void);
 
   protected:
--- a/libgui/graphics/ButtonGroup.cc	Tue Nov 05 08:31:06 2019 -0500
+++ b/libgui/graphics/ButtonGroup.cc	Tue Nov 05 13:28:45 2019 -0500
@@ -42,6 +42,8 @@
 #include "QtHandlesUtils.h"
 #include "qt-graphics-toolkit.h"
 
+#include "octave-qobject.h"
+
 #include "interpreter-private.h"
 #include "ov-struct.h"
 
@@ -94,7 +96,8 @@
   }
 
   ButtonGroup*
-  ButtonGroup::create (const graphics_object& go)
+  ButtonGroup::create (octave::base_qobject& oct_qobj,
+                       const graphics_object& go)
   {
     Object *parent = Object::parentObject (go);
 
@@ -105,15 +108,17 @@
         if (container)
           {
             QFrame *frame = new QFrame (container);
-            return new ButtonGroup (go, new QButtonGroup (frame), frame);
+            return new ButtonGroup (oct_qobj, go, new QButtonGroup (frame),
+                                    frame);
           }
       }
 
     return nullptr;
   }
 
-  ButtonGroup::ButtonGroup (const graphics_object& go, QButtonGroup *buttongroup,
-                            QFrame *frame)
+  ButtonGroup::ButtonGroup (octave::base_qobject& oct_qobj,
+                            const graphics_object& go,
+                            QButtonGroup *buttongroup, QFrame *frame)
     : Object (go, frame), m_hiddenbutton(nullptr), m_container (nullptr),
       m_title (nullptr), m_blockUpdates (false)
   {
@@ -134,7 +139,7 @@
     m_hiddenbutton->hide ();
     m_buttongroup->addButton (m_hiddenbutton);
 
-    m_container = new Container (frame);
+    m_container = new Container (frame, oct_qobj);
     m_container->canvas (m_handle);
 
     connect (m_container, SIGNAL (interpeter_event (const fcn_callback&)),
--- a/libgui/graphics/ButtonGroup.h	Tue Nov 05 08:31:06 2019 -0500
+++ b/libgui/graphics/ButtonGroup.h	Tue Nov 05 13:28:45 2019 -0500
@@ -31,6 +31,11 @@
 class QLabel;
 class QRadioButton;
 
+namespace octave
+{
+  class base_qobject;
+}
+
 namespace QtHandles
 {
 
@@ -41,15 +46,16 @@
     Q_OBJECT
 
   public:
-    ButtonGroup (const graphics_object& go, QButtonGroup *buttongroup,
-                 QFrame *frame);
+    ButtonGroup (octave::base_qobject& oct_qobj, const graphics_object& go,
+                 QButtonGroup *buttongroup, QFrame *frame);
     ~ButtonGroup (void);
 
     Container * innerContainer (void) { return m_container; }
 
     bool eventFilter (QObject *watched, QEvent *event);
 
-    static ButtonGroup * create (const graphics_object& go);
+    static ButtonGroup * create (octave::base_qobject& oct_qobj,
+                                 const graphics_object& go);
 
     void addButton (QAbstractButton *btn);
 
--- a/libgui/graphics/Canvas.cc	Tue Nov 05 08:31:06 2019 -0500
+++ b/libgui/graphics/Canvas.cc	Tue Nov 05 13:28:45 2019 -0500
@@ -72,11 +72,10 @@
     m_redrawBlocked = block;
   }
 
-  static QCursor
-  make_cursor (const QString& name, int hot_x  = -1, int hot_y = -1)
+  QCursor
+  Canvas::make_cursor (const QString& name, int hot_x, int hot_y)
   {
-    octave::resource_manager& rmgr
-      = octave::__get_resource_manager__ ("make_cursor");
+    octave::resource_manager& rmgr = m_octave_qobj.get_resource_manager ();
 
     QIcon icon = rmgr.icon (name);
 
@@ -873,7 +872,7 @@
 
                 octave_value_list props = ovl ("textbox", bb);
 
-                annotation_dialog anno_dlg (w, props);
+                annotation_dialog anno_dlg (m_octave_qobj, w, props);
 
                 if (anno_dlg.exec () == QDialog::Accepted)
                   {
@@ -1077,11 +1076,12 @@
   }
 
   Canvas*
-  Canvas::create (const std::string& /* name */, QWidget *parent,
-                  const graphics_handle& handle)
+  Canvas::create (octave::base_qobject& oct_qobj,
+                  const graphics_handle& handle, QWidget *parent,
+                  const std::string& /* name */)
   {
     // Only OpenGL
-    return new GLCanvas (parent, handle);
+    return new GLCanvas (oct_qobj, handle, parent);
   }
 
 }
--- a/libgui/graphics/Canvas.h	Tue Nov 05 08:31:06 2019 -0500
+++ b/libgui/graphics/Canvas.h	Tue Nov 05 13:28:45 2019 -0500
@@ -38,6 +38,11 @@
 
 class octave_value_list;
 
+namespace octave
+{
+  class base_qobject;
+}
+
 namespace QtHandles
 {
 
@@ -72,8 +77,9 @@
 
     virtual QWidget * qWidget (void) = 0;
 
-    static Canvas * create (const std::string& name, QWidget *parent,
-                            const graphics_handle& handle);
+    static Canvas * create (octave::base_qobject& oct_qobj,
+                            const graphics_handle& handle, QWidget *parent,
+                            const std::string& name);
 
     virtual uint8NDArray getPixels (void) { return do_getPixels (m_handle); };
 
@@ -107,8 +113,9 @@
                            const graphics_handle& handle) = 0;
 
   protected:
-    Canvas (const graphics_handle& handle)
-      : m_handle (handle),
+    Canvas (octave::base_qobject& oct_qobj, const graphics_handle& handle)
+      : m_octave_qobj (oct_qobj),
+        m_handle (handle),
         m_redrawBlocked (false),
         m_mouseMode (NoMode),
         m_clickMode (false),
@@ -139,6 +146,10 @@
                         std::vector<std::string> omit = std::vector<std::string> ());
 
   private:
+
+    QCursor make_cursor (const QString& name, int hot_x  = -1, int hot_y = -1);
+
+    octave::base_qobject& m_octave_qobj;
     graphics_handle m_handle;
     bool m_redrawBlocked;
     MouseMode m_mouseMode;
--- a/libgui/graphics/CheckBoxControl.cc	Tue Nov 05 08:31:06 2019 -0500
+++ b/libgui/graphics/CheckBoxControl.cc	Tue Nov 05 13:28:45 2019 -0500
@@ -29,11 +29,14 @@
 #include "CheckBoxControl.h"
 #include "Container.h"
 
+#include "octave-qobject.h"
+
 namespace QtHandles
 {
 
   CheckBoxControl*
-  CheckBoxControl::create (const graphics_object& go)
+  CheckBoxControl::create (octave::base_qobject& oct_qobj,
+                           const graphics_object& go)
   {
     Object *parent = Object::parentObject (go);
 
@@ -42,14 +45,15 @@
         Container *container = parent->innerContainer ();
 
         if (container)
-          return new CheckBoxControl (go, new QCheckBox (container));
+          return new CheckBoxControl (oct_qobj, go, new QCheckBox (container));
       }
 
     return nullptr;
   }
 
-  CheckBoxControl::CheckBoxControl (const graphics_object& go, QCheckBox *box)
-    : ButtonControl (go, box)
+  CheckBoxControl::CheckBoxControl (octave::base_qobject& oct_obj,
+                                    const graphics_object& go, QCheckBox *box)
+    : ButtonControl (oct_obj, go, box)
   {
     box->setAutoFillBackground (true);
   }
--- a/libgui/graphics/CheckBoxControl.h	Tue Nov 05 08:31:06 2019 -0500
+++ b/libgui/graphics/CheckBoxControl.h	Tue Nov 05 13:28:45 2019 -0500
@@ -27,16 +27,23 @@
 
 class QCheckBox;
 
+namespace octave
+{
+  class base_qobject;
+}
+
 namespace QtHandles
 {
 
   class CheckBoxControl : public ButtonControl
   {
   public:
-    CheckBoxControl (const graphics_object& go, QCheckBox *box);
+    CheckBoxControl (octave::base_qobject& oct_qobj, const graphics_object& go,
+                     QCheckBox *box);
     ~CheckBoxControl (void);
 
-    static CheckBoxControl * create (const graphics_object& go);
+    static CheckBoxControl * create (octave::base_qobject& oct_qobj,
+                                     const graphics_object& go);
   };
 
 }
--- a/libgui/graphics/Container.cc	Tue Nov 05 08:31:06 2019 -0500
+++ b/libgui/graphics/Container.cc	Tue Nov 05 13:28:45 2019 -0500
@@ -38,8 +38,8 @@
 namespace QtHandles
 {
 
-  Container::Container (QWidget *xparent)
-    : ContainerBase (xparent), m_canvas (nullptr)
+  Container::Container (QWidget *xparent, octave::base_qobject& oct_qobj)
+    : ContainerBase (xparent), m_octave_qobj (oct_qobj), m_canvas (nullptr)
   {
     setFocusPolicy (Qt::ClickFocus);
   }
@@ -62,8 +62,8 @@
           {
             graphics_object fig = go.get_ancestor ("figure");
 
-            m_canvas = Canvas::create (fig.get ("renderer").string_value (),
-                                       this, gh);
+            m_canvas = Canvas::create (m_octave_qobj, gh, this,
+                                       fig.get ("renderer").string_value ());
 
             connect (m_canvas, SIGNAL (interpeter_event (const fcn_callback&)),
                      this, SIGNAL (interpeter_event (const fcn_callback&)));
--- a/libgui/graphics/Container.h	Tue Nov 05 08:31:06 2019 -0500
+++ b/libgui/graphics/Container.h	Tue Nov 05 13:28:45 2019 -0500
@@ -30,6 +30,11 @@
 #include "event-manager.h"
 #include "graphics.h"
 
+namespace octave
+{
+  class base_qobject;
+}
+
 namespace QtHandles
 {
 
@@ -42,7 +47,7 @@
     Q_OBJECT
 
   public:
-    Container (QWidget *parent);
+    Container (QWidget *parent, octave::base_qobject& oct_qobj);
     ~Container (void);
 
     Canvas * canvas (const graphics_handle& handle, bool create = true);
@@ -72,6 +77,7 @@
     void resizeEvent (QResizeEvent *event);
 
   private:
+    octave::base_qobject& m_octave_qobj;
     Canvas *m_canvas;
   };
 
--- a/libgui/graphics/ContextMenu.cc	Tue Nov 05 08:31:06 2019 -0500
+++ b/libgui/graphics/ContextMenu.cc	Tue Nov 05 13:28:45 2019 -0500
@@ -30,13 +30,16 @@
 #include "QtHandlesUtils.h"
 #include "qt-graphics-toolkit.h"
 
+#include "octave-qobject.h"
+
 #include "interpreter-private.h"
 
 namespace QtHandles
 {
 
   ContextMenu*
-  ContextMenu::create (const graphics_object& go)
+  ContextMenu::create (octave::base_qobject& oct_qobj,
+                       const graphics_object& go)
   {
     Object *xparent = Object::parentObject (go);
 
@@ -44,13 +47,14 @@
       {
         QWidget *w = xparent->qWidget<QWidget> ();
 
-        return new ContextMenu (go, new QMenu (w));
+        return new ContextMenu (oct_qobj, go, new QMenu (w));
       }
 
     return nullptr;
   }
 
-  ContextMenu::ContextMenu (const graphics_object& go, QMenu *xmenu)
+  ContextMenu::ContextMenu (octave::base_qobject&,
+                            const graphics_object& go, QMenu *xmenu)
     : Object (go, xmenu)
   {
     xmenu->setAutoFillBackground (true);
--- a/libgui/graphics/ContextMenu.h	Tue Nov 05 08:31:06 2019 -0500
+++ b/libgui/graphics/ContextMenu.h	Tue Nov 05 13:28:45 2019 -0500
@@ -30,6 +30,11 @@
 
 class QMenu;
 
+namespace octave
+{
+  class base_qobject;
+}
+
 namespace QtHandles
 {
 
@@ -38,10 +43,13 @@
     Q_OBJECT
 
   public:
-    ContextMenu (const graphics_object& go, QMenu *menu);
+    ContextMenu (octave::base_qobject& oct_qobj, const graphics_object& go,
+                 QMenu *menu);
     ~ContextMenu (void);
 
-    static ContextMenu * create (const graphics_object& go);
+    static ContextMenu * create (octave::base_qobject& oct_qobj,
+                                 const graphics_object& go);
+
     static void executeAt (const base_properties& props, const QPoint& pt);
 
     Container * innerContainer (void) { return nullptr; }
--- a/libgui/graphics/EditControl.cc	Tue Nov 05 08:31:06 2019 -0500
+++ b/libgui/graphics/EditControl.cc	Tue Nov 05 13:28:45 2019 -0500
@@ -31,11 +31,14 @@
 #include "TextEdit.h"
 #include "QtHandlesUtils.h"
 
+#include "octave-qobject.h"
+
 namespace QtHandles
 {
 
   EditControl*
-  EditControl::create (const graphics_object& go)
+  EditControl::create (octave::base_qobject& oct_qobj,
+                       const graphics_object& go)
   {
     Object *parent = Object::parentObject (go);
 
@@ -48,17 +51,19 @@
             uicontrol::properties& up = Utils::properties<uicontrol> (go);
 
             if ((up.get_max () - up.get_min ()) > 1)
-              return new EditControl (go, new TextEdit (container));
+              return new EditControl (oct_qobj, go, new TextEdit (container));
             else
-              return new EditControl (go, new QLineEdit (container));
+              return new EditControl (oct_qobj, go, new QLineEdit (container));
           }
       }
 
     return nullptr;
   }
 
-  EditControl::EditControl (const graphics_object& go, QLineEdit *edit)
-    : BaseControl (go, edit), m_multiLine (false), m_textChanged (false)
+  EditControl::EditControl (octave::base_qobject& oct_qobj,
+                            const graphics_object& go, QLineEdit *edit)
+    : BaseControl (oct_qobj, go, edit), m_multiLine (false),
+      m_textChanged (false)
   {
     init (edit);
   }
@@ -86,8 +91,10 @@
              SLOT (returnPressed (void)));
   }
 
-  EditControl::EditControl (const graphics_object& go, TextEdit *edit)
-    : BaseControl (go, edit), m_multiLine (true), m_textChanged (false)
+  EditControl::EditControl (octave::base_qobject& oct_qobj,
+                            const graphics_object& go, TextEdit *edit)
+    : BaseControl (oct_qobj, go, edit), m_multiLine (true),
+      m_textChanged (false)
   {
     init (edit);
   }
--- a/libgui/graphics/EditControl.h	Tue Nov 05 08:31:06 2019 -0500
+++ b/libgui/graphics/EditControl.h	Tue Nov 05 13:28:45 2019 -0500
@@ -28,6 +28,11 @@
 class QLineEdit;
 class QWidget;
 
+namespace octave
+{
+  class base_qobject;
+}
+
 namespace QtHandles
 {
 
@@ -38,11 +43,16 @@
     Q_OBJECT
 
   public:
-    EditControl (const graphics_object& go, QLineEdit *edit);
-    EditControl (const graphics_object& go, TextEdit *edit);
+    EditControl (octave::base_qobject& oct_qobj, const graphics_object& go,
+                 QLineEdit *edit);
+
+    EditControl (octave::base_qobject& oct_qobj, const graphics_object& go,
+                 TextEdit *edit);
+
     ~EditControl (void);
 
-    static EditControl * create (const graphics_object& go);
+    static EditControl * create (octave::base_qobject& oct_qobj,
+                                 const graphics_object& go);
 
   protected:
     void update (int pId);
--- a/libgui/graphics/Figure.cc	Tue Nov 05 08:31:06 2019 -0500
+++ b/libgui/graphics/Figure.cc	Tue Nov 05 13:28:45 2019 -0500
@@ -107,17 +107,18 @@
   }
 
   Figure*
-  Figure::create (const graphics_object& go)
+  Figure::create (octave::base_qobject& oct_qobj, const graphics_object& go)
   {
-    return new Figure (go, new FigureWindow ());
+    return new Figure (oct_qobj, go, new FigureWindow ());
   }
 
-  Figure::Figure (const graphics_object& go, FigureWindow *win)
+  Figure::Figure (octave::base_qobject& oct_qobj, const graphics_object& go,
+                  FigureWindow *win)
     : Object (go, win), m_blockUpdates (false), m_figureToolBar (nullptr),
       m_menuBar (nullptr), m_innerRect (), m_outerRect (),
       m_previousHeight (0), m_resizable (true)
   {
-    m_container = new Container (win);
+    m_container = new Container (win, oct_qobj);
     win->setCentralWidget (m_container);
 
     connect (m_container, SIGNAL (interpeter_event (const fcn_callback&)),
--- a/libgui/graphics/Figure.h	Tue Nov 05 08:31:06 2019 -0500
+++ b/libgui/graphics/Figure.h	Tue Nov 05 13:28:45 2019 -0500
@@ -34,6 +34,11 @@
 class QToolBar;
 class QScreen;
 
+namespace octave
+{
+  class base_qobject;
+}
+
 namespace QtHandles
 {
 
@@ -63,10 +68,12 @@
     friend class ToolBar;
 
   public:
-    Figure (const graphics_object& go, FigureWindow *win);
+    Figure (octave::base_qobject& oct_qobj, const graphics_object& go,
+            FigureWindow *win);
     ~Figure (void);
 
-    static Figure * create (const graphics_object& go);
+    static Figure * create (octave::base_qobject& oct_qobj,
+                            const graphics_object& go);
 
     QString fileName (void);
     void setFileName (const QString& name);
--- a/libgui/graphics/GLCanvas.cc	Tue Nov 05 08:31:06 2019 -0500
+++ b/libgui/graphics/GLCanvas.cc	Tue Nov 05 13:28:45 2019 -0500
@@ -47,9 +47,10 @@
 #  endif
 #endif
 
-  GLCanvas::GLCanvas (QWidget *xparent, const graphics_handle& gh)
+  GLCanvas::GLCanvas (octave::base_qobject& oct_qobj,
+                      const graphics_handle& gh, QWidget *xparent)
     : OCTAVE_QT_OPENGL_WIDGET (OCTAVE_QT_OPENGL_WIDGET_FORMAT_ARGS xparent),
-      Canvas (gh), m_glfcns (), m_renderer (m_glfcns)
+      Canvas (oct_qobj, gh), m_glfcns (), m_renderer (m_glfcns)
   {
     setFocusPolicy (Qt::ClickFocus);
     setFocus ();
--- a/libgui/graphics/GLCanvas.h	Tue Nov 05 08:31:06 2019 -0500
+++ b/libgui/graphics/GLCanvas.h	Tue Nov 05 13:28:45 2019 -0500
@@ -46,12 +46,18 @@
 #include "gl-render.h"
 #include "qopengl-functions.h"
 
+namespace octave
+{
+  class base_qobject;
+}
+
 namespace QtHandles
 {
   class GLCanvas : public OCTAVE_QT_OPENGL_WIDGET, public Canvas
   {
   public:
-    GLCanvas (QWidget *parent, const graphics_handle& handle);
+    GLCanvas (octave::base_qobject& oct_qobj, const graphics_handle& handle,
+              QWidget *parent);
     ~GLCanvas (void);
 
     void initializeGL (void);
--- a/libgui/graphics/ListBoxControl.cc	Tue Nov 05 08:31:06 2019 -0500
+++ b/libgui/graphics/ListBoxControl.cc	Tue Nov 05 13:28:45 2019 -0500
@@ -32,6 +32,8 @@
 #include "ListBoxControl.h"
 #include "QtHandlesUtils.h"
 
+#include "octave-qobject.h"
+
 namespace QtHandles
 {
 
@@ -65,7 +67,8 @@
   }
 
   ListBoxControl*
-  ListBoxControl::create (const graphics_object& go)
+  ListBoxControl::create (octave::base_qobject& oct_qobj,
+                          const graphics_object& go)
   {
     Object *parent = Object::parentObject (go);
 
@@ -74,14 +77,16 @@
         Container *container = parent->innerContainer ();
 
         if (container)
-          return new ListBoxControl (go, new QListWidget (container));
+          return new ListBoxControl (oct_qobj, go, new QListWidget (container));
       }
 
     return nullptr;
   }
 
-  ListBoxControl::ListBoxControl (const graphics_object& go, QListWidget *list)
-    : BaseControl (go, list), m_blockCallback (false), m_selectionChanged (false)
+  ListBoxControl::ListBoxControl (octave::base_qobject& oct_qobj,
+                                  const graphics_object& go, QListWidget *list)
+    : BaseControl (oct_qobj, go, list), m_blockCallback (false),
+      m_selectionChanged (false)
   {
     uicontrol::properties& up = properties<uicontrol> ();
 
--- a/libgui/graphics/ListBoxControl.h	Tue Nov 05 08:31:06 2019 -0500
+++ b/libgui/graphics/ListBoxControl.h	Tue Nov 05 13:28:45 2019 -0500
@@ -29,6 +29,11 @@
 class QListWidgetItem;
 class QModelIndex;
 
+namespace octave
+{
+  class base_qobject;
+}
+
 namespace QtHandles
 {
 
@@ -37,10 +42,12 @@
     Q_OBJECT
 
   public:
-    ListBoxControl (const graphics_object& go, QListWidget *list);
+    ListBoxControl (octave::base_qobject& oct_qobj, const graphics_object& go,
+                    QListWidget *list);
     ~ListBoxControl (void);
 
-    static ListBoxControl * create (const graphics_object& go);
+    static ListBoxControl * create (octave::base_qobject& oct_qobj,
+                                    const graphics_object& go);
 
   protected:
     void update (int pId);
--- a/libgui/graphics/Menu.cc	Tue Nov 05 08:31:06 2019 -0500
+++ b/libgui/graphics/Menu.cc	Tue Nov 05 13:28:45 2019 -0500
@@ -33,6 +33,8 @@
 #include "Menu.h"
 #include "QtHandlesUtils.h"
 
+#include "octave-qobject.h"
+
 namespace QtHandles
 {
 
@@ -58,7 +60,7 @@
   }
 
   Menu*
-  Menu::create (const graphics_object& go)
+  Menu::create (octave::base_qobject& oct_qobj, const graphics_object& go)
   {
     Object *parent_obj = Object::parentObject (go);
 
@@ -67,13 +69,14 @@
         QObject *qObj = parent_obj->qObject ();
 
         if (qObj)
-          return new Menu (go, new QAction (qObj), parent_obj);
+          return new Menu (oct_qobj, go, new QAction (qObj), parent_obj);
       }
 
     return nullptr;
   }
 
-  Menu::Menu (const graphics_object& go, QAction *action, Object *xparent)
+  Menu::Menu (octave::base_qobject&, const graphics_object& go,
+              QAction *action, Object *xparent)
     : Object (go, action), m_parent (nullptr), m_separator (nullptr)
   {
     uimenu::properties& up = properties<uimenu> ();
--- a/libgui/graphics/Menu.h	Tue Nov 05 08:31:06 2019 -0500
+++ b/libgui/graphics/Menu.h	Tue Nov 05 13:28:45 2019 -0500
@@ -30,6 +30,11 @@
 class QMenu;
 class QWidget;
 
+namespace octave
+{
+  class base_qobject;
+}
+
 namespace QtHandles
 {
 
@@ -38,10 +43,12 @@
     Q_OBJECT
 
   public:
-    Menu (const graphics_object& go, QAction *action, Object *parent);
+    Menu (octave::base_qobject& oct_qobj, const graphics_object& go,
+          QAction *action, Object *parent);
     ~Menu (void);
 
-    static Menu * create (const graphics_object& go);
+    static Menu * create (octave::base_qobject& oct_qobj,
+                          const graphics_object& go);
 
     Container * innerContainer (void) { return nullptr; }
 
--- a/libgui/graphics/Panel.cc	Tue Nov 05 08:31:06 2019 -0500
+++ b/libgui/graphics/Panel.cc	Tue Nov 05 13:28:45 2019 -0500
@@ -36,6 +36,8 @@
 #include "Panel.h"
 #include "QtHandlesUtils.h"
 
+#include "octave-qobject.h"
+
 #include "graphics.h"
 #include "interpreter-private.h"
 
@@ -88,7 +90,7 @@
   }
 
   Panel*
-  Panel::create (const graphics_object& go)
+  Panel::create (octave::base_qobject& oct_qobj, const graphics_object& go)
   {
     Object *parent = Object::parentObject (go);
 
@@ -97,13 +99,14 @@
         Container *container = parent->innerContainer ();
 
         if (container)
-          return new Panel (go, new QFrame (container));
+          return new Panel (oct_qobj, go, new QFrame (container));
       }
 
     return nullptr;
   }
 
-  Panel::Panel (const graphics_object& go, QFrame *frame)
+  Panel::Panel (octave::base_qobject& oct_qobj, const graphics_object& go,
+                QFrame *frame)
     : Object (go, frame), m_container (nullptr), m_title (nullptr),
       m_blockUpdates (false)
   {
@@ -120,7 +123,7 @@
     setupPalette (pp, pal);
     frame->setPalette (pal);
 
-    m_container = new Container (frame);
+    m_container = new Container (frame, oct_qobj);
     m_container->canvas (m_handle);
 
     connect (m_container, SIGNAL (interpeter_event (const fcn_callback&)),
--- a/libgui/graphics/Panel.h	Tue Nov 05 08:31:06 2019 -0500
+++ b/libgui/graphics/Panel.h	Tue Nov 05 13:28:45 2019 -0500
@@ -28,6 +28,11 @@
 class QFrame;
 class QLabel;
 
+namespace octave
+{
+  class base_qobject;
+}
+
 namespace QtHandles
 {
 
@@ -36,14 +41,16 @@
   class Panel : public Object
   {
   public:
-    Panel (const graphics_object& go, QFrame *frame);
+    Panel (octave::base_qobject& oct_qobj, const graphics_object& go,
+           QFrame *frame);
     ~Panel (void);
 
     Container * innerContainer (void) { return m_container; }
 
     bool eventFilter (QObject *watched, QEvent *event);
 
-    static Panel * create (const graphics_object& go);
+    static Panel * create (octave::base_qobject& oct_qobj,
+                           const graphics_object& go);
 
     void do_connections (const QObject *receiver,
                          const QObject *emitter = nullptr);
--- a/libgui/graphics/PopupMenuControl.cc	Tue Nov 05 08:31:06 2019 -0500
+++ b/libgui/graphics/PopupMenuControl.cc	Tue Nov 05 13:28:45 2019 -0500
@@ -30,11 +30,14 @@
 #include "PopupMenuControl.h"
 #include "QtHandlesUtils.h"
 
+#include "octave-qobject.h"
+
 namespace QtHandles
 {
 
   PopupMenuControl*
-  PopupMenuControl::create (const graphics_object& go)
+  PopupMenuControl::create (octave::base_qobject& oct_qobj,
+                            const graphics_object& go)
   {
     Object *parent = Object::parentObject (go);
 
@@ -43,14 +46,16 @@
         Container *container = parent->innerContainer ();
 
         if (container)
-          return new PopupMenuControl (go, new QComboBox (container));
+          return new PopupMenuControl (oct_qobj, go,
+                                       new QComboBox (container));
       }
 
     return nullptr;
   }
 
-  PopupMenuControl::PopupMenuControl (const graphics_object& go, QComboBox *box)
-    : BaseControl (go, box), m_blockUpdate (false)
+  PopupMenuControl::PopupMenuControl (octave::base_qobject& oct_qobj,
+                                      const graphics_object& go, QComboBox *box)
+    : BaseControl (oct_qobj, go, box), m_blockUpdate (false)
   {
     uicontrol::properties& up = properties<uicontrol> ();
 
--- a/libgui/graphics/PopupMenuControl.h	Tue Nov 05 08:31:06 2019 -0500
+++ b/libgui/graphics/PopupMenuControl.h	Tue Nov 05 13:28:45 2019 -0500
@@ -27,6 +27,11 @@
 
 class QComboBox;
 
+namespace octave
+{
+  class base_qobject;
+}
+
 namespace QtHandles
 {
 
@@ -35,10 +40,12 @@
     Q_OBJECT
 
   public:
-    PopupMenuControl (const graphics_object& go, QComboBox *box);
+    PopupMenuControl (octave::base_qobject& oct_qobj,
+                      const graphics_object& go, QComboBox *box);
     ~PopupMenuControl (void);
 
-    static PopupMenuControl * create (const graphics_object& go);
+    static PopupMenuControl * create (octave::base_qobject& oct_qobj,
+                                      const graphics_object& go);
 
   protected:
     void update (int pId);
--- a/libgui/graphics/PushButtonControl.cc	Tue Nov 05 08:31:06 2019 -0500
+++ b/libgui/graphics/PushButtonControl.cc	Tue Nov 05 13:28:45 2019 -0500
@@ -31,11 +31,14 @@
 #include "Container.h"
 #include "QtHandlesUtils.h"
 
+#include "octave-qobject.h"
+
 namespace QtHandles
 {
 
   PushButtonControl*
-  PushButtonControl::create (const graphics_object& go)
+  PushButtonControl::create (octave::base_qobject& oct_qobj,
+                             const graphics_object& go)
   {
     Object *parent = Object::parentObject (go);
 
@@ -44,15 +47,17 @@
         Container *container = parent->innerContainer ();
 
         if (container)
-          return new PushButtonControl (go, new QPushButton (container));
+          return new PushButtonControl (oct_qobj, go,
+                                        new QPushButton (container));
       }
 
     return nullptr;
   }
 
-  PushButtonControl::PushButtonControl (const graphics_object& go,
+  PushButtonControl::PushButtonControl (octave::base_qobject& oct_qobj,
+                                        const graphics_object& go,
                                         QPushButton *btn)
-    : ButtonControl (go, btn)
+    : ButtonControl (oct_qobj, go, btn)
   {
     uicontrol::properties& up = properties<uicontrol> ();
 
--- a/libgui/graphics/PushButtonControl.h	Tue Nov 05 08:31:06 2019 -0500
+++ b/libgui/graphics/PushButtonControl.h	Tue Nov 05 13:28:45 2019 -0500
@@ -27,16 +27,23 @@
 
 class QPushButton;
 
+namespace octave
+{
+  class base_qobject;
+}
+
 namespace QtHandles
 {
 
   class PushButtonControl : public ButtonControl
   {
   public:
-    PushButtonControl (const graphics_object& go, QPushButton *btn);
+    PushButtonControl (octave::base_qobject& oct_qobj, const graphics_object& go,
+                       QPushButton *btn);
     ~PushButtonControl (void);
 
-    static PushButtonControl * create (const graphics_object& go);
+    static PushButtonControl * create (octave::base_qobject& oct_qobj,
+                                       const graphics_object& go);
 
   protected:
     void update (int pId);
--- a/libgui/graphics/PushTool.cc	Tue Nov 05 08:31:06 2019 -0500
+++ b/libgui/graphics/PushTool.cc	Tue Nov 05 13:28:45 2019 -0500
@@ -28,11 +28,13 @@
 
 #include "ToolBarButton.cc"
 
+#include "octave-qobject.h"
+
 namespace QtHandles
 {
 
   PushTool*
-  PushTool::create (const graphics_object& go)
+  PushTool::create (octave::base_qobject& oct_qobj, const graphics_object& go)
   {
     Object *parent = Object::parentObject (go);
 
@@ -41,14 +43,15 @@
         QWidget *parentWidget = parent->qWidget<QWidget> ();
 
         if (parentWidget)
-          return new PushTool (go, new QAction (parentWidget));
+          return new PushTool (oct_qobj, go, new QAction (parentWidget));
       }
 
     return nullptr;
   }
 
-  PushTool::PushTool (const graphics_object& go, QAction *action)
-    : ToolBarButton<uipushtool> (go, action)
+  PushTool::PushTool (octave::base_qobject& oct_qobj,
+                      const graphics_object& go, QAction *action)
+    : ToolBarButton<uipushtool> (oct_qobj, go, action)
   {
     connect (action, SIGNAL (triggered (bool)), this, SLOT (clicked (void)));
   }
--- a/libgui/graphics/PushTool.h	Tue Nov 05 08:31:06 2019 -0500
+++ b/libgui/graphics/PushTool.h	Tue Nov 05 13:28:45 2019 -0500
@@ -25,6 +25,11 @@
 
 #include "ToolBarButton.h"
 
+namespace octave
+{
+  class base_qobject;
+}
+
 namespace QtHandles
 {
 
@@ -33,10 +38,12 @@
     Q_OBJECT
 
   public:
-    PushTool (const graphics_object& go, QAction *action);
+    PushTool (octave::base_qobject& oct_qobj, const graphics_object& go,
+              QAction *action);
     ~PushTool (void);
 
-    static PushTool * create (const graphics_object& go);
+    static PushTool * create (octave::base_qobject& oct_qobj,
+                              const graphics_object& go);
 
   protected:
     void update (int pId);
--- a/libgui/graphics/RadioButtonControl.cc	Tue Nov 05 08:31:06 2019 -0500
+++ b/libgui/graphics/RadioButtonControl.cc	Tue Nov 05 13:28:45 2019 -0500
@@ -31,11 +31,14 @@
 #include "Container.h"
 #include "QtHandlesUtils.h"
 
+#include "octave-qobject.h"
+
 namespace QtHandles
 {
 
   RadioButtonControl*
-  RadioButtonControl::create (const graphics_object& go)
+  RadioButtonControl::create (octave::base_qobject& oct_qobj,
+                              const graphics_object& go)
   {
     Object *parent = Object::parentObject (go);
 
@@ -44,15 +47,17 @@
         Container *container = parent->innerContainer ();
 
         if (container)
-          return new RadioButtonControl (go, new QRadioButton (container));
+          return new RadioButtonControl (oct_qobj, go,
+                                         new QRadioButton (container));
       }
 
     return nullptr;
   }
 
-  RadioButtonControl::RadioButtonControl (const graphics_object& go,
+  RadioButtonControl::RadioButtonControl (octave::base_qobject& oct_qobj,
+                                          const graphics_object& go,
                                           QRadioButton *radio)
-    : ButtonControl (go, radio)
+    : ButtonControl (oct_qobj, go, radio)
   {
     Object *parent = Object::parentObject (go);
     ButtonGroup *btnGroup = dynamic_cast<ButtonGroup *>(parent);
--- a/libgui/graphics/RadioButtonControl.h	Tue Nov 05 08:31:06 2019 -0500
+++ b/libgui/graphics/RadioButtonControl.h	Tue Nov 05 13:28:45 2019 -0500
@@ -27,16 +27,23 @@
 
 class QRadioButton;
 
+namespace octave
+{
+  class base_qobject;
+}
+
 namespace QtHandles
 {
 
   class RadioButtonControl : public ButtonControl
   {
   public:
-    RadioButtonControl (const graphics_object& go, QRadioButton *box);
+    RadioButtonControl (octave::base_qobject& oct_qobj, const graphics_object& go,
+                        QRadioButton *box);
     ~RadioButtonControl (void);
 
-    static RadioButtonControl * create (const graphics_object& go);
+    static RadioButtonControl * create (octave::base_qobject& oct_qobj,
+                                        const graphics_object& go);
   };
 
 }
--- a/libgui/graphics/SliderControl.cc	Tue Nov 05 08:31:06 2019 -0500
+++ b/libgui/graphics/SliderControl.cc	Tue Nov 05 13:28:45 2019 -0500
@@ -30,6 +30,8 @@
 #include "SliderControl.h"
 #include "QtHandlesUtils.h"
 
+#include "octave-qobject.h"
+
 #include "graphics.h"
 #include "interpreter-private.h"
 
@@ -39,7 +41,8 @@
 {
 
   SliderControl*
-  SliderControl::create (const graphics_object& go)
+  SliderControl::create (octave::base_qobject& oct_qobj,
+                         const graphics_object& go)
   {
     Object *parent = Object::parentObject (go);
 
@@ -48,15 +51,16 @@
         Container *container = parent->innerContainer ();
 
         if (container)
-          return new SliderControl (go, new QScrollBar (container));
+          return new SliderControl (oct_qobj, go, new QScrollBar (container));
       }
 
     return nullptr;
   }
 
-  SliderControl::SliderControl (const graphics_object& go,
+  SliderControl::SliderControl (octave::base_qobject& oct_qobj,
+                                const graphics_object& go,
                                 QAbstractSlider *slider)
-    : BaseControl (go, slider), m_blockUpdates (false)
+    : BaseControl (oct_qobj, go, slider), m_blockUpdates (false)
   {
     uicontrol::properties& up = properties<uicontrol> ();
 
--- a/libgui/graphics/SliderControl.h	Tue Nov 05 08:31:06 2019 -0500
+++ b/libgui/graphics/SliderControl.h	Tue Nov 05 13:28:45 2019 -0500
@@ -27,6 +27,11 @@
 
 class QAbstractSlider;
 
+namespace octave
+{
+  class base_qobject;
+}
+
 namespace QtHandles
 {
 
@@ -35,10 +40,12 @@
     Q_OBJECT
 
   public:
-    SliderControl (const graphics_object& go, QAbstractSlider *slider);
+    SliderControl (octave::base_qobject& oct_qobj, const graphics_object& go,
+                   QAbstractSlider *slider);
     ~SliderControl (void);
 
-    static SliderControl * create (const graphics_object& go);
+    static SliderControl * create (octave::base_qobject& oct_qobj,
+                                   const graphics_object& go);
 
   protected:
     void update (int pId);
--- a/libgui/graphics/Table.cc	Tue Nov 05 08:31:06 2019 -0500
+++ b/libgui/graphics/Table.cc	Tue Nov 05 13:28:45 2019 -0500
@@ -45,6 +45,8 @@
 #include "Table.h"
 #include "QtHandlesUtils.h"
 
+#include "octave-qobject.h"
+
 #include "graphics.h"
 #include "interpreter-private.h"
 #include "oct-stream.h"
@@ -424,7 +426,7 @@
   }
 
   Table*
-  Table::create (const graphics_object& go)
+  Table::create (octave::base_qobject& oct_qobj, const graphics_object& go)
   {
     Object *parent = Object::parentObject (go);
 
@@ -433,13 +435,14 @@
         Container *container = parent->innerContainer ();
 
         if (container)
-          return new Table (go, new QTableWidget (container));
+          return new Table (oct_qobj, go, new QTableWidget (container));
       }
 
     return 0;
   }
 
-  Table::Table (const graphics_object& go, QTableWidget *tableWidget)
+  Table::Table (octave::base_qobject&, const graphics_object& go,
+                QTableWidget *tableWidget)
     : Object (go, tableWidget), m_tableWidget (tableWidget), m_curData (),
       m_blockUpdates (false)
   {
--- a/libgui/graphics/Table.h	Tue Nov 05 08:31:06 2019 -0500
+++ b/libgui/graphics/Table.h	Tue Nov 05 13:28:45 2019 -0500
@@ -29,6 +29,11 @@
 class QTableWidget;
 class QTableWidgetItem;
 
+namespace octave
+{
+  class base_qobject;
+}
+
 namespace QtHandles
 {
 
@@ -39,14 +44,16 @@
     Q_OBJECT
 
   public:
-    Table (const graphics_object& go, QTableWidget* tableWidget);
+    Table (octave::base_qobject& oct_qobj, const graphics_object& go,
+           QTableWidget* tableWidget);
     ~Table (void);
 
     Container* innerContainer (void) { return m_container; }
 
     bool eventFilter (QObject* watched, QEvent* event);
 
-    static Table* create (const graphics_object& go);
+    static Table* create (octave::base_qobject& oct_qobj,
+                          const graphics_object& go);
 
   protected:
     void update (int pId);
--- a/libgui/graphics/TextControl.cc	Tue Nov 05 08:31:06 2019 -0500
+++ b/libgui/graphics/TextControl.cc	Tue Nov 05 13:28:45 2019 -0500
@@ -30,11 +30,14 @@
 #include "TextControl.h"
 #include "QtHandlesUtils.h"
 
+#include "octave-qobject.h"
+
 namespace QtHandles
 {
 
   TextControl*
-  TextControl::create (const graphics_object& go)
+  TextControl::create (octave::base_qobject& oct_qobj,
+                       const graphics_object& go)
   {
     Object *parent = Object::parentObject (go);
 
@@ -43,14 +46,15 @@
         Container *container = parent->innerContainer ();
 
         if (container)
-          return new TextControl (go, new QLabel (container));
+          return new TextControl (oct_qobj, go, new QLabel (container));
       }
 
     return nullptr;
   }
 
-  TextControl::TextControl (const graphics_object& go, QLabel *label)
-    : BaseControl (go, label)
+  TextControl::TextControl (octave::base_qobject& oct_qobj,
+                            const graphics_object& go, QLabel *label)
+    : BaseControl (oct_qobj, go, label)
   {
     uicontrol::properties& up = properties<uicontrol> ();
 
--- a/libgui/graphics/TextControl.h	Tue Nov 05 08:31:06 2019 -0500
+++ b/libgui/graphics/TextControl.h	Tue Nov 05 13:28:45 2019 -0500
@@ -27,16 +27,23 @@
 
 class QLabel;
 
+namespace octave
+{
+  class base_qobject;
+}
+
 namespace QtHandles
 {
 
   class TextControl : public BaseControl
   {
   public:
-    TextControl (const graphics_object& go, QLabel *label);
+    TextControl (octave::base_qobject& oct_qobj, const graphics_object& go,
+                 QLabel *label);
     ~TextControl (void);
 
-    static TextControl * create (const graphics_object& go);
+    static TextControl * create (octave::base_qobject& oct_qobj,
+                                 const graphics_object& go);
 
   protected:
     void update (int pId);
--- a/libgui/graphics/ToggleButtonControl.cc	Tue Nov 05 08:31:06 2019 -0500
+++ b/libgui/graphics/ToggleButtonControl.cc	Tue Nov 05 13:28:45 2019 -0500
@@ -31,11 +31,14 @@
 #include "Container.h"
 #include "QtHandlesUtils.h"
 
+#include "octave-qobject.h"
+
 namespace QtHandles
 {
 
   ToggleButtonControl*
-  ToggleButtonControl::create (const graphics_object& go)
+  ToggleButtonControl::create (octave::base_qobject& oct_qobj,
+                               const graphics_object& go)
   {
     Object *parent = Object::parentObject (go);
 
@@ -44,15 +47,17 @@
         Container *container = parent->innerContainer ();
 
         if (container)
-          return new ToggleButtonControl (go, new QPushButton (container));
+          return new ToggleButtonControl (oct_qobj, go,
+                                          new QPushButton (container));
       }
 
     return nullptr;
   }
 
-  ToggleButtonControl::ToggleButtonControl (const graphics_object& go,
+  ToggleButtonControl::ToggleButtonControl (octave::base_qobject& oct_qobj,
+                                            const graphics_object& go,
                                             QPushButton *btn)
-    : ButtonControl (go, btn)
+    : ButtonControl (oct_qobj, go, btn)
   {
     Object *parent = Object::parentObject (go);
     ButtonGroup *btnGroup = dynamic_cast<ButtonGroup *>(parent);
--- a/libgui/graphics/ToggleButtonControl.h	Tue Nov 05 08:31:06 2019 -0500
+++ b/libgui/graphics/ToggleButtonControl.h	Tue Nov 05 13:28:45 2019 -0500
@@ -27,16 +27,23 @@
 
 class QPushButton;
 
+namespace octave
+{
+  class base_qobject;
+}
+
 namespace QtHandles
 {
 
   class ToggleButtonControl : public ButtonControl
   {
   public:
-    ToggleButtonControl (const graphics_object& go, QPushButton *box);
+    ToggleButtonControl (octave::base_qobject& oct_qobj, const graphics_object& go,
+                         QPushButton *box);
     ~ToggleButtonControl (void);
 
-    static ToggleButtonControl * create (const graphics_object& go);
+    static ToggleButtonControl * create (octave::base_qobject& oct_qobj,
+                                         const graphics_object& go);
 
   protected:
     void update (int pId);
--- a/libgui/graphics/ToggleTool.cc	Tue Nov 05 08:31:06 2019 -0500
+++ b/libgui/graphics/ToggleTool.cc	Tue Nov 05 13:28:45 2019 -0500
@@ -28,11 +28,13 @@
 
 #include "ToolBarButton.cc"
 
+#include "octave-qobject.h"
+
 namespace QtHandles
 {
 
   ToggleTool*
-  ToggleTool::create (const graphics_object& go)
+  ToggleTool::create (octave::base_qobject& oct_qobj, const graphics_object& go)
   {
     Object *parent = Object::parentObject (go);
 
@@ -41,14 +43,15 @@
         QWidget *parentWidget = parent->qWidget<QWidget> ();
 
         if (parentWidget)
-          return new ToggleTool (go, new QAction (parentWidget));
+          return new ToggleTool (oct_qobj, go, new QAction (parentWidget));
       }
 
     return nullptr;
   }
 
-  ToggleTool::ToggleTool (const graphics_object& go, QAction *action)
-    : ToolBarButton<uitoggletool> (go, action)
+  ToggleTool::ToggleTool (octave::base_qobject& oct_qobj,
+                          const graphics_object& go, QAction *action)
+    : ToolBarButton<uitoggletool> (oct_qobj, go, action)
   {
     uitoggletool::properties& tp = properties<uitoggletool> ();
 
--- a/libgui/graphics/ToggleTool.h	Tue Nov 05 08:31:06 2019 -0500
+++ b/libgui/graphics/ToggleTool.h	Tue Nov 05 13:28:45 2019 -0500
@@ -25,6 +25,11 @@
 
 #include "ToolBarButton.h"
 
+namespace octave
+{
+  class base_qobject;
+}
+
 namespace QtHandles
 {
 
@@ -33,10 +38,12 @@
     Q_OBJECT
 
   public:
-    ToggleTool (const graphics_object& go, QAction *action);
+    ToggleTool (octave::base_qobject& oct_qobj, const graphics_object& go,
+                QAction *action);
     ~ToggleTool (void);
 
-    static ToggleTool * create (const graphics_object& go);
+    static ToggleTool * create (octave::base_qobject& oct_qobj,
+                                const graphics_object& go);
 
   protected:
     void update (int pId);
--- a/libgui/graphics/ToolBar.cc	Tue Nov 05 08:31:06 2019 -0500
+++ b/libgui/graphics/ToolBar.cc	Tue Nov 05 13:28:45 2019 -0500
@@ -34,12 +34,13 @@
 #include <QTimer>
 #include <QToolBar>
 
-#include "gui-preferences-global.h"
-
 #include "Figure.h"
 #include "ToolBar.h"
 #include "QtHandlesUtils.h"
 
+#include "gui-preferences-global.h"
+#include "octave-qobject.h"
+
 namespace QtHandles
 {
   static QIcon makeEmptyIcon (void)
@@ -65,7 +66,7 @@
   }
 
   ToolBar*
-  ToolBar::create (const graphics_object& go)
+  ToolBar::create (octave::base_qobject& oct_qobj, const graphics_object& go)
   {
     Object *parent = Object::parentObject (go);
 
@@ -74,13 +75,14 @@
         QWidget *parentWidget = parent->qWidget<QWidget> ();
 
         if (parentWidget)
-          return new ToolBar (go, new QToolBar (parentWidget));
+          return new ToolBar (oct_qobj, go, new QToolBar (parentWidget));
       }
 
     return nullptr;
   }
 
-  ToolBar::ToolBar (const graphics_object& go, QToolBar *bar)
+  ToolBar::ToolBar (octave::base_qobject&, const graphics_object& go,
+                    QToolBar *bar)
     : Object (go, bar), m_empty (nullptr), m_figure (nullptr)
   {
     uitoolbar::properties& tp = properties<uitoolbar> ();
--- a/libgui/graphics/ToolBar.h	Tue Nov 05 08:31:06 2019 -0500
+++ b/libgui/graphics/ToolBar.h	Tue Nov 05 13:28:45 2019 -0500
@@ -28,6 +28,11 @@
 class QAction;
 class QToolBar;
 
+namespace octave
+{
+  class base_qobject;
+}
+
 namespace QtHandles
 {
 
@@ -38,10 +43,12 @@
     Q_OBJECT
 
   public:
-    ToolBar (const graphics_object& go, QToolBar *bar);
+    ToolBar (octave::base_qobject& oct_qobj, const graphics_object& go,
+             QToolBar *bar);
     ~ToolBar (void);
 
-    static ToolBar * create (const graphics_object& go);
+    static ToolBar * create (octave::base_qobject& oct_qobj,
+                             const graphics_object& go);
 
     Container * innerContainer (void) { return nullptr; }
 
--- a/libgui/graphics/ToolBarButton.cc	Tue Nov 05 08:31:06 2019 -0500
+++ b/libgui/graphics/ToolBarButton.cc	Tue Nov 05 13:28:45 2019 -0500
@@ -25,6 +25,7 @@
 // this file.
 
 #include <QAction>
+#include <QIcon>
 #include <QWidget>
 
 #include "ToolBarButton.h"
@@ -33,17 +34,10 @@
 
 namespace QtHandles
 {
-  static QIcon get_icon (const std::string& name)
-  {
-    octave::resource_manager& rmgr
-      = octave::__get_resource_manager__ ("get_icon");
-
-    return rmgr.icon (QString::fromStdString (name));
-  }
-
   template <typename T>
-  ToolBarButton<T>::ToolBarButton (const graphics_object& go, QAction *action)
-    : Object (go, action), m_separator (nullptr)
+  ToolBarButton<T>::ToolBarButton (octave::base_qobject& oct_qobj,
+                                   const graphics_object& go, QAction *action)
+    : Object (go, action), m_octave_qobj (oct_qobj), m_separator (nullptr)
   {
     typename T::properties& tp = properties<T> ();
 
@@ -154,4 +148,12 @@
       }
   }
 
+  template <typename T>
+  QIcon ToolBarButton<T>::get_icon (const std::string& name)
+  {
+    octave::resource_manager& rmgr = m_octave_qobj.get_resource_manager ();
+
+    return rmgr.icon (QString::fromStdString (name));
+  }
+
 }
--- a/libgui/graphics/ToolBarButton.h	Tue Nov 05 08:31:06 2019 -0500
+++ b/libgui/graphics/ToolBarButton.h	Tue Nov 05 13:28:45 2019 -0500
@@ -26,6 +26,12 @@
 #include "Object.h"
 
 class QAction;
+class QIcon;
+
+namespace octave
+{
+  class base_qobject;
+}
 
 namespace QtHandles
 {
@@ -36,7 +42,8 @@
   class ToolBarButton : public Object
   {
   public:
-    ToolBarButton (const graphics_object& go, QAction *action);
+    ToolBarButton (octave::base_qobject& oct_qobj, const graphics_object& go,
+                   QAction *action);
     ~ToolBarButton (void);
 
     Container * innerContainer (void) { return nullptr; }
@@ -45,7 +52,10 @@
     void update (int pId);
 
   private:
+    octave::base_qobject& m_octave_qobj;
     QAction *m_separator;
+
+    QIcon get_icon (const std::string& name);
   };
 
 };
--- a/libgui/graphics/__init_qt__.cc	Tue Nov 05 08:31:06 2019 -0500
+++ b/libgui/graphics/__init_qt__.cc	Tue Nov 05 13:28:45 2019 -0500
@@ -32,6 +32,7 @@
 #include <QRegExp>
 #include <QThread>
 
+#include "octave-qobject.h"
 #include "qt-graphics-toolkit.h"
 #include "QtHandlesUtils.h"
 #include "__init_qt__.h"
@@ -66,9 +67,12 @@
 
             gh_mgr.enable_event_processing (true);
 
-            octave::gtk_manager& gtk_mgr = interp.get_gtk_manager ();
+            // FIXME: temporary?
+            octave::base_qobject& octave_qobj
+              = *(octave::base_qobject::the_octave_qobject ());
 
-            qt_graphics_toolkit *qt_gtk = new qt_graphics_toolkit (interp);
+            qt_graphics_toolkit *qt_gtk
+              = new qt_graphics_toolkit (interp, octave_qobj);
 
             if (QThread::currentThread ()
                 != QApplication::instance ()->thread ())
@@ -76,6 +80,8 @@
 
             graphics_toolkit tk (qt_gtk);
 
+            octave::gtk_manager& gtk_mgr = interp.get_gtk_manager ();
+
             gtk_mgr.load_toolkit (tk);
 
             octave::interpreter::add_atexit_function ("__shutdown_qt__");
--- a/libgui/graphics/annotation-dialog.cc	Tue Nov 05 08:31:06 2019 -0500
+++ b/libgui/graphics/annotation-dialog.cc	Tue Nov 05 13:28:45 2019 -0500
@@ -29,7 +29,7 @@
 #include <QPalette>
 
 #include "gui-settings.h"
-#include "resource-manager.h"
+#include "octave-qobject.h"
 
 #include "QtHandlesUtils.h"
 #include "annotation-dialog.h"
@@ -37,8 +37,9 @@
 
 using namespace QtHandles;
 
-annotation_dialog::annotation_dialog (QWidget *p, const octave_value_list& pr):
-  QDialog (p), ui (new Ui::annotation_dialog)
+annotation_dialog::annotation_dialog (octave::base_qobject& oct_qobj,
+                                      QWidget *p, const octave_value_list& pr):
+  QDialog (p), m_octave_qobj (oct_qobj), ui (new Ui::annotation_dialog)
 {
   props = pr;
 
@@ -50,8 +51,7 @@
 {
   ui->setupUi (this);
 
-  octave::resource_manager& rmgr
-      = octave::__get_resource_manager__ ("annotation_dialog::init");
+  octave::resource_manager& rmgr = m_octave_qobj.get_resource_manager ();
 
   octave::gui_settings *settings = rmgr.get_settings ();
 
@@ -97,8 +97,7 @@
   QDialogButtonBox::ButtonRole button_role
     = ui->button_box->buttonRole (button);
 
-  octave::resource_manager& rmgr
-      = octave::__get_resource_manager__ ("annotation_dialog::button_clicked");
+  octave::resource_manager& rmgr = m_octave_qobj.get_resource_manager ();
 
   octave::gui_settings *settings = rmgr.get_settings ();
 
--- a/libgui/graphics/annotation-dialog.h	Tue Nov 05 08:31:06 2019 -0500
+++ b/libgui/graphics/annotation-dialog.h	Tue Nov 05 13:28:45 2019 -0500
@@ -29,6 +29,11 @@
 
 #include "ovl.h"
 
+namespace octave
+{
+  class base_qobject;
+}
+
 namespace Ui
 {
   class annotation_dialog;
@@ -38,7 +43,8 @@
 {
   Q_OBJECT
 public:
-  explicit annotation_dialog (QWidget *parent, const octave_value_list& pr);
+  annotation_dialog (octave::base_qobject& oct_qobj, QWidget *parent,
+                     const octave_value_list& pr);
   ~annotation_dialog ();
 
   octave_value_list get_properties () const;
@@ -55,6 +61,7 @@
   void get_gui_props ();
   void set_gui_props ();
 
+  octave::base_qobject& m_octave_qobj;
   Ui::annotation_dialog *ui;
   octave_value_list props;
 };
--- a/libgui/graphics/qt-graphics-toolkit.cc	Tue Nov 05 08:31:06 2019 -0500
+++ b/libgui/graphics/qt-graphics-toolkit.cc	Tue Nov 05 13:28:45 2019 -0500
@@ -54,6 +54,8 @@
 #include "ToolBar.h"
 #include "qt-graphics-toolkit.h"
 
+#include "octave-qobject.h"
+
 #include "event-manager.h"
 #include "graphics.h"
 #include "interpreter.h"
@@ -93,8 +95,10 @@
     return "";
   }
 
-  qt_graphics_toolkit::qt_graphics_toolkit (octave::interpreter& interp)
-    : QObject (), base_graphics_toolkit ("qt"), m_interpreter (interp)
+  qt_graphics_toolkit::qt_graphics_toolkit (octave::interpreter& interp,
+                                            octave::base_qobject& oct_qobj)
+    : QObject (), base_graphics_toolkit ("qt"), m_interpreter (interp),
+      m_octave_qobj (oct_qobj)
   {
     // Implemented with a signal/slot connection in order to properly
     // cross from the interpreter thread (where requests to create
@@ -383,47 +387,47 @@
                 Object *obj = nullptr;
 
                 if (go.isa ("figure"))
-                  obj = Figure::create (go);
+                  obj = Figure::create (m_octave_qobj, go);
                 else if (go.isa ("uicontrol"))
                   {
                     uicontrol::properties& up =
                       Utils::properties<uicontrol> (go);
 
                     if (up.style_is ("pushbutton"))
-                      obj = PushButtonControl::create (go);
+                      obj = PushButtonControl::create (m_octave_qobj, go);
                     else if (up.style_is ("edit"))
-                      obj = EditControl::create (go);
+                      obj = EditControl::create (m_octave_qobj, go);
                     else if (up.style_is ("checkbox"))
-                      obj = CheckBoxControl::create (go);
+                      obj = CheckBoxControl::create (m_octave_qobj, go);
                     else if (up.style_is ("radiobutton"))
-                      obj = RadioButtonControl::create (go);
+                      obj = RadioButtonControl::create (m_octave_qobj, go);
                     else if (up.style_is ("togglebutton"))
-                      obj = ToggleButtonControl::create (go);
+                      obj = ToggleButtonControl::create (m_octave_qobj, go);
                     else if (up.style_is ("text"))
-                      obj = TextControl::create (go);
+                      obj = TextControl::create (m_octave_qobj, go);
                     else if (up.style_is ("popupmenu"))
-                      obj = PopupMenuControl::create (go);
+                      obj = PopupMenuControl::create (m_octave_qobj, go);
                     else if (up.style_is ("slider"))
-                      obj = SliderControl::create (go);
+                      obj = SliderControl::create (m_octave_qobj, go);
                     else if (up.style_is ("listbox"))
-                      obj = ListBoxControl::create (go);
+                      obj = ListBoxControl::create (m_octave_qobj, go);
                   }
                 else if (go.isa ("uibuttongroup"))
-                  obj = ButtonGroup::create (go);
+                  obj = ButtonGroup::create (m_octave_qobj, go);
                 else if (go.isa ("uipanel"))
-                  obj = Panel::create (go);
+                  obj = Panel::create (m_octave_qobj, go);
                 else if (go.isa ("uimenu"))
-                  obj = Menu::create (go);
+                  obj = Menu::create (m_octave_qobj, go);
                 else if (go.isa ("uicontextmenu"))
-                  obj = ContextMenu::create (go);
+                  obj = ContextMenu::create (m_octave_qobj, go);
                 else if (go.isa ("uitable"))
-                  obj = Table::create (go);
+                  obj = Table::create (m_octave_qobj, go);
                 else if (go.isa ("uitoolbar"))
-                  obj = ToolBar::create (go);
+                  obj = ToolBar::create (m_octave_qobj, go);
                 else if (go.isa ("uipushtool"))
-                  obj = PushTool::create (go);
+                  obj = PushTool::create (m_octave_qobj, go);
                 else if (go.isa ("uitoggletool"))
-                  obj = ToggleTool::create (go);
+                  obj = ToggleTool::create (m_octave_qobj, go);
                 else
                   qWarning ("qt_graphics_toolkit::create_object: unsupported type '%s'",
                             go.type ().c_str ());
--- a/libgui/graphics/qt-graphics-toolkit.h	Tue Nov 05 08:31:06 2019 -0500
+++ b/libgui/graphics/qt-graphics-toolkit.h	Tue Nov 05 13:28:45 2019 -0500
@@ -31,6 +31,7 @@
 namespace octave
 {
   class interpreter;
+  class base_qobject;
 }
 
 namespace QtHandles
@@ -44,7 +45,8 @@
 
   public:
 
-    qt_graphics_toolkit (octave::interpreter& interp);
+    qt_graphics_toolkit (octave::interpreter& interp,
+                         octave::base_qobject& oct_qobj);
 
     ~qt_graphics_toolkit (void) = default;
 
@@ -116,6 +118,8 @@
   private:
 
     octave::interpreter& m_interpreter;
+
+    octave::base_qobject& m_octave_qobj;
   };
 }