docs: def qteRunMacro(self, macroName: str, widgetObj: QtGui.QWidget=None,
                      keysequence: QtmacsKeysequence=None):
          """
          Queue a previously registered macro for execution once the
          event loop is idle.
  
          The reason for queuing macros in the first place, instead of
          running them straight away, is to ensure that the event loop
          updates all the widgets in between any two macros. This will
          avoid many spurious and hard to find bugs due to macros
          assuming that all user interface elements have been updated
          when in fact they were not.
  
          |Args|
  
          * ``macroName`` (**str**): name of macro.
          * ``widgetObj`` (**QWidget**): widget (if any) on which the
            macro should operate.
          * ``keysequence`` (**QtmacsKeysequence**): key sequence that
            triggered the macro.
  
          |Returns|
  
          * **None**
  
          |Raises|
  
          * **QtmacsArgumentError** if at least one argument has an invalid type.
          """
          # Add the new macro to the queue and call qteUpdate to ensure
          # that the macro is processed once the event loop is idle again.
          self._qteMacroQueue.append((macroName, widgetObj, keysequence))
          self.qteUpdate()