Ejemplo n.º 1
0
    def __init__(self, qml):
        super().__init__(sys.argv)
        '''
    Register our Python models (classes/types to be registered with QML.)
    '''
        model = QmlModel()
        model.register()

        self.qmlMaster = QmlMaster()

        engine = QQmlApplicationEngine()
        '''
    Need this if no stdio, i.e. Android, OSX, iOS.
    OW, qWarnings to stdio.
    engine.warnings.connect(self.errors)
    '''
        engine.load(resourceMgr.urlToQMLResource(resourceSubpath=qml))
        engine.quit.connect(self.quit)

        " Keep reference to engine, used by root() "
        self.engine = engine
        '''
    Window is shown by default.
    window = self.getWindow()
    window.show()
    '''
        '''
    Suggested architecture is for model layer (Python) not to know of UI layer,
    and thus not make connections.
    The model layer can emit signals to UI layer and vice versa,
    but only the UI layer knows what connections to make
    '''
        self.makeConnections()
Ejemplo n.º 2
0
    def __init__(self, pickerView):
        scene = QGraphicsScene()
        scene.addText(
            "QGraphicsItem in QGraphicsView.  Press mouse to mock pick, key to open dialog."
        )
        QGraphicsView.__init__(self, scene)

        # Accept touch on both this widget and viewport (abstract scroll area)
        # Touch engenders LMB mouse press event since app attribute for that is set.
        self.setAttribute(Qt.WA_AcceptTouchEvents)
        self.viewport().setAttribute(Qt.WA_AcceptTouchEvents)

        self.qmlMaster = QmlMaster()
        '''
    See the QML, created there?
    
    " A Person model which is mock-picked"
    self.model = Person()
    '''
        if pickerView is not None:
            self.pickerView = pickerView

            self.pickDelegate = self.qmlMaster.findComponent(
                self.pickerView,
                className=model.person.Person,
                objectName="person")

            self.dialogDelegate = self.qmlMaster.findComponent(
                self.pickerView,
                className=model.qmlDelegate.QmlDelegate,
                objectName="dialogDelegate")
        else:
            self.pickDelegate = None
            self.dialogDelegate = None
Ejemplo n.º 3
0
class MyGraphicsView(QGraphicsView):
    '''
  GV with GS having an item.
  When mouse pressed, emit signal to open QML context menu (mocking a pick of an item.)
  '''
    def __init__(self, pickerView):
        scene = QGraphicsScene()
        scene.addText(
            "QGraphicsItem in QGraphicsView.  Press mouse to mock pick, key to open dialog."
        )
        QGraphicsView.__init__(self, scene)

        # Accept touch on both this widget and viewport (abstract scroll area)
        # Touch engenders LMB mouse press event since app attribute for that is set.
        self.setAttribute(Qt.WA_AcceptTouchEvents)
        self.viewport().setAttribute(Qt.WA_AcceptTouchEvents)

        self.qmlMaster = QmlMaster()
        '''
    See the QML, created there?
    
    " A Person model which is mock-picked"
    self.model = Person()
    '''
        if pickerView is not None:
            self.pickerView = pickerView

            self.pickDelegate = self.qmlMaster.findComponent(
                self.pickerView,
                className=model.person.Person,
                objectName="person")

            self.dialogDelegate = self.qmlMaster.findComponent(
                self.pickerView,
                className=model.qmlDelegate.QmlDelegate,
                objectName="dialogDelegate")
        else:
            self.pickDelegate = None
            self.dialogDelegate = None
        #self.findQMLControl()

    def touchEvent(self, event):
        print("Touch event")

    def mousePressEvent(self, event):
        '''
    Treat any mousePressEvent as a mock pick of the QGraphicsItem.
    '''
        if self.pickDelegate is not None:
            self.pickDelegate.activate()  # cause signal to be emitted to QML
        print("Mouse pressed")

    def keyPressEvent(self, event):
        '''
    Any key opens dialog.
    '''
        print("Key pressed")
        if self.dialogDelegate is not None:
            self.dialogDelegate.activate()
Ejemplo n.º 4
0
class MyGraphicsView(QGraphicsView):
    """
  GV with GS having an item.
  When mouse pressed, emit signal to open QML context menu (mocking a pick of an item.)
  """

    def __init__(self, pickerView):
        scene = QGraphicsScene()
        scene.addText("QGraphicsItem in QGraphicsView.  Press mouse to mock pick, key to open dialog.")
        QGraphicsView.__init__(self, scene)

        # Accept touch on both this widget and viewport (abstract scroll area)
        # Touch engenders LMB mouse press event since app attribute for that is set.
        self.setAttribute(Qt.WA_AcceptTouchEvents)
        self.viewport().setAttribute(Qt.WA_AcceptTouchEvents)

        self.qmlMaster = QmlMaster()

        """
    See the QML, created there?
    
    " A Person model which is mock-picked"
    self.model = Person()
    """
        if pickerView is not None:
            self.pickerView = pickerView

            self.pickDelegate = self.qmlMaster.findComponent(
                self.pickerView, className=model.person.Person, objectName="person"
            )

            self.dialogDelegate = self.qmlMaster.findComponent(
                self.pickerView, className=model.qmlDelegate.QmlDelegate, objectName="dialogDelegate"
            )
        else:
            self.pickDelegate = None
            self.dialogDelegate = None
        # self.findQMLControl()

    def touchEvent(self, event):
        print("Touch event")

    def mousePressEvent(self, event):
        """
    Treat any mousePressEvent as a mock pick of the QGraphicsItem.
    """
        if self.pickDelegate is not None:
            self.pickDelegate.activate()  # cause signal to be emitted to QML
        print("Mouse pressed")

    def keyPressEvent(self, event):
        """
    Any key opens dialog.
    """
        print("Key pressed")
        if self.dialogDelegate is not None:
            self.dialogDelegate.activate()
Ejemplo n.º 5
0
    def __init__(self, pickerView):
        scene = QGraphicsScene()
        scene.addText("QGraphicsItem in QGraphicsView.  Press mouse to mock pick, key to open dialog.")
        QGraphicsView.__init__(self, scene)

        # Accept touch on both this widget and viewport (abstract scroll area)
        # Touch engenders LMB mouse press event since app attribute for that is set.
        self.setAttribute(Qt.WA_AcceptTouchEvents)
        self.viewport().setAttribute(Qt.WA_AcceptTouchEvents)

        self.qmlMaster = QmlMaster()

        """
    See the QML, created there?
    
    " A Person model which is mock-picked"
    self.model = Person()
    """
        if pickerView is not None:
            self.pickerView = pickerView

            self.pickDelegate = self.qmlMaster.findComponent(
                self.pickerView, className=model.person.Person, objectName="person"
            )

            self.dialogDelegate = self.qmlMaster.findComponent(
                self.pickerView, className=model.qmlDelegate.QmlDelegate, objectName="dialogDelegate"
            )
        else:
            self.pickDelegate = None
            self.dialogDelegate = None
Ejemplo n.º 6
0
 def __init__(self, qml):
   super().__init__(sys.argv)
   
   '''
   Register our Python models (classes/types to be registered with QML.)
   '''
   model = QmlModel()
   model.register()
   
   self.qmlMaster = QmlMaster()
   
   engine = QQmlApplicationEngine()
   '''
   Need this if no stdio, i.e. Android, OSX, iOS.
   OW, qWarnings to stdio.
   engine.warnings.connect(self.errors)
   '''
   engine.load(resourceMgr.urlToQMLResource(resourceSubpath=qml))
   engine.quit.connect(self.quit)
   
   " Keep reference to engine, used by root() "
   self.engine = engine
   
   '''
   Window is shown by default.
   window = self.getWindow()
   window.show()
   '''
   
   '''
   Suggested architecture is for model layer (Python) not to know of UI layer,
   and thus not make connections.
   The model layer can emit signals to UI layer and vice versa,
   but only the UI layer knows what connections to make
   '''
   self.makeConnections()
Ejemplo n.º 7
0
class QmlApp(QGuiApplication):
    '''
  Contains QApp without reference to a QWidget.
  I.E. all windows defined in qml file.
  Contrast with WidgetApp.
  
  Has event loop (never returns)
  '''
    def __init__(self, qml):
        super().__init__(sys.argv)
        '''
    Register our Python models (classes/types to be registered with QML.)
    '''
        model = QmlModel()
        model.register()

        self.qmlMaster = QmlMaster()

        engine = QQmlApplicationEngine()
        '''
    Need this if no stdio, i.e. Android, OSX, iOS.
    OW, qWarnings to stdio.
    engine.warnings.connect(self.errors)
    '''
        engine.load(resourceMgr.urlToQMLResource(resourceSubpath=qml))
        engine.quit.connect(self.quit)

        " Keep reference to engine, used by root() "
        self.engine = engine
        '''
    Window is shown by default.
    window = self.getWindow()
    window.show()
    '''
        '''
    Suggested architecture is for model layer (Python) not to know of UI layer,
    and thus not make connections.
    The model layer can emit signals to UI layer and vice versa,
    but only the UI layer knows what connections to make
    '''
        self.makeConnections()

    def makeConnections(self):
        '''
    Connections
    Here, make connection on the Python side
    
    Of dubious value
    '''
        # Connect button signal to person handler
        button = self.qmlMaster.findComponentFromRoot(root=self.root(),
                                                      className=QQuickItem,
                                                      objectName="button")
        foo = self.qmlMaster.findComponentFromRoot(root=self.root(),
                                                   className=Person,
                                                   objectName="foo")
        if button is not None and foo is not None:
            button.activated.connect(foo.activate)
        else:
            print("Can't connect nonexistent button or non-existent model.")

    def root(self):
        " QmlApp's root comes from engine."
        try:
            qmlRoot = self.engine.rootObjects()[0]
        except:
            qWarning("Failed to read or parse qml.")
            raise

        print(qmlRoot)
        assert isinstance(qmlRoot, QQuickWindow)
        return qmlRoot

    def getWindow(self):
        " QQuickWindow containing QML app's GUI"
        return self.root()

    def errors(self, warningList):
        for item in warningList:
            # syslog on Android and OSX and iOS
            print(item)
Ejemplo n.º 8
0
class QmlApp(QGuiApplication):
  '''
  Contains QApp without reference to a QWidget.
  I.E. all windows defined in qml file.
  Contrast with WidgetApp.
  
  Has event loop (never returns)
  '''
  def __init__(self, qml):
    super().__init__(sys.argv)
    
    '''
    Register our Python models (classes/types to be registered with QML.)
    '''
    model = QmlModel()
    model.register()
    
    self.qmlMaster = QmlMaster()
    
    engine = QQmlApplicationEngine()
    '''
    Need this if no stdio, i.e. Android, OSX, iOS.
    OW, qWarnings to stdio.
    engine.warnings.connect(self.errors)
    '''
    engine.load(resourceMgr.urlToQMLResource(resourceSubpath=qml))
    engine.quit.connect(self.quit)
    
    " Keep reference to engine, used by root() "
    self.engine = engine
    
    '''
    Window is shown by default.
    window = self.getWindow()
    window.show()
    '''
    
    '''
    Suggested architecture is for model layer (Python) not to know of UI layer,
    and thus not make connections.
    The model layer can emit signals to UI layer and vice versa,
    but only the UI layer knows what connections to make
    '''
    self.makeConnections()

    
    
  def makeConnections(self):
    '''
    Connections
    Here, make connection on the Python side
    
    Of dubious value
    '''
    # Connect button signal to person handler
    button = self.qmlMaster.findComponentFromRoot(root=self.root(), className=QQuickItem, objectName="button")
    foo = self.qmlMaster.findComponentFromRoot(root=self.root(), className=Person, objectName="foo")
    if button is not None and foo is not None:
      button.activated.connect(foo.activate)
    else:
      print("Can't connect nonexistent button or non-existent model.")

    
  def root(self):
    " QmlApp's root comes from engine."
    try:
      qmlRoot = self.engine.rootObjects()[0]
    except:
      qWarning("Failed to read or parse qml.")
      raise
    
    print(qmlRoot)
    assert isinstance(qmlRoot, QQuickWindow)
    return qmlRoot
    
    
  def getWindow(self):
    " QQuickWindow containing QML app's GUI"
    return self.root()
    
  
    
  def errors(self, warningList):
    for item in warningList:
      # syslog on Android and OSX and iOS
      print(item)
Ejemplo n.º 9
0
    def __init__(self, embeddedQml, secondEmbeddedQml=None):
        super().__init__(sys.argv)

        print("On mobile platform, synthesizing LMB mouse events from touch.")
        self.setAttribute(Qt.AA_SynthesizeMouseForUnhandledTouchEvents,
                          on=True)
        '''
    Register our Python model (classes/types to be registered with QML.)
    '''
        model = QmlModel()
        model.register()

        qmlMaster = QmlMaster()

        " simple widget, not QMainWindow"
        mainWindow = QWidget()
        self.mainWindow = mainWindow  # keep referenceid: toolbarLayout
        mainWindow.setGeometry(100, 100, 500, 400)
        mainWindow.show()

        mainQWindow = qmlMaster.appQWindow()

        " mainWindow has layout has widget has quickview"
        layout = QVBoxLayout()
        '''
    Embed QML to main window.
    Typically a toolbar or dialog
    '''
        ##widget = qmlMaster.widgetForQML(qmlFilename=embeddedQml, parentWindow=mainWindow)
        ##widget, quickthing = qmlMaster.widgetAndQuickViewForQML(qmlFilename=embeddedQml, parentWindow=mainWindow)
        widget, quickthing = qmlMaster.widgetForQMLUsingQQuickWidget(
            qmlFilename=embeddedQml, parentWindow=mainWindow)

        "No need to show() the quickview or the container QWidget?  Has strange effects."
        widget.show()
        print("Height of widget embedding QML:", widget.height())
        print("Widget embedding QML isVisible:", widget.isVisible())

        layout.addWidget(widget)

        " first embeddedQml might have a delegate"
        firstDelegate = qmlMaster.findComponent(quickthing,
                                                className=QmlDelegate,
                                                objectName="dialogDelegate")
        print("Delegate in first qml:", firstDelegate)

        if secondEmbeddedQml is not None:
            myView = self._createSecondQuickView(qmlMaster,
                                                 qmlFilename=secondEmbeddedQml,
                                                 transientParent=mainQWindow)
        else:
            myView = None

        " Create QGV that on mouse down (a pick) opens another top level window embedding QML (pickerView) "
        gv = MyGraphicsView(pickerView=myView)
        layout.addWidget(gv)
        mainWindow.setLayout(layout)

        " Some connections are defined inside the QML"
        '''
    Connect optional delegate of first qml to delegate of second.
    
    Example: ToolButton in first qml onTriggered calls firstDelegate.activate() which emits signal
    which we here connect to secondDelegate.activate() which is connected in second qml to dialog.open().
    Thus, user push ToolButton opens a dialog.
    '''
        if firstDelegate is not None and gv.dialogDelegate is not None:
            firstDelegate.activated.connect(gv.dialogDelegate.activate)
Ejemplo n.º 10
0
    def __init__(self, embeddedQml, secondEmbeddedQml=None):
        super().__init__(sys.argv)

        print("On mobile platform, synthesizing LMB mouse events from touch.")
        self.setAttribute(Qt.AA_SynthesizeMouseForUnhandledTouchEvents, on=True)

        """
    Register our Python model (classes/types to be registered with QML.)
    """
        model = QmlModel()
        model.register()

        qmlMaster = QmlMaster()

        " simple widget, not QMainWindow"
        mainWindow = QWidget()
        self.mainWindow = mainWindow  # keep referenceid: toolbarLayout
        mainWindow.setGeometry(100, 100, 500, 400)
        mainWindow.show()

        mainQWindow = qmlMaster.appQWindow()

        " mainWindow has layout has widget has quickview"
        layout = QVBoxLayout()

        """
    Embed QML to main window.
    Typically a toolbar or dialog
    """
        ##widget = qmlMaster.widgetForQML(qmlFilename=embeddedQml, parentWindow=mainWindow)
        ##widget, quickthing = qmlMaster.widgetAndQuickViewForQML(qmlFilename=embeddedQml, parentWindow=mainWindow)
        widget, quickthing = qmlMaster.widgetForQMLUsingQQuickWidget(qmlFilename=embeddedQml, parentWindow=mainWindow)

        "No need to show() the quickview or the container QWidget?  Has strange effects."
        widget.show()
        print("Height of widget embedding QML:", widget.height())
        print("Widget embedding QML isVisible:", widget.isVisible())

        layout.addWidget(widget)

        " first embeddedQml might have a delegate"
        firstDelegate = qmlMaster.findComponent(quickthing, className=QmlDelegate, objectName="dialogDelegate")
        print("Delegate in first qml:", firstDelegate)

        if secondEmbeddedQml is not None:
            myView = self._createSecondQuickView(qmlMaster, qmlFilename=secondEmbeddedQml, transientParent=mainQWindow)
        else:
            myView = None

        " Create QGV that on mouse down (a pick) opens another top level window embedding QML (pickerView) "
        gv = MyGraphicsView(pickerView=myView)
        layout.addWidget(gv)
        mainWindow.setLayout(layout)

        " Some connections are defined inside the QML"

        """
    Connect optional delegate of first qml to delegate of second.
    
    Example: ToolButton in first qml onTriggered calls firstDelegate.activate() which emits signal
    which we here connect to secondDelegate.activate() which is connected in second qml to dialog.open().
    Thus, user push ToolButton opens a dialog.
    """
        if firstDelegate is not None and gv.dialogDelegate is not None:
            firstDelegate.activated.connect(gv.dialogDelegate.activate)