Skip to content Skip to sidebar Skip to footer

Refreshing Qquickwidget In Qml File After Button Click

Created a MapWidget using QQuickWidget and a qml file to zoom into the given location coordinates. However, the map does not refresh whenever the coordinates changed. I am trying t

Solution 1:

Considering that you want to move only one marker you must create a QObject that has the position as q-properties, export the object and make a binding in QML.

main.py

import os
from PyQt5 import QtCore, QtGui, QtWidgets, QtQuickWidgets, QtPositioning

classMarkerObject(QtCore.QObject):
    coordinateChanged = QtCore.pyqtSignal(QtPositioning.QGeoCoordinate)
    sourceChanged = QtCore.pyqtSignal(QtCore.QUrl)

    def__init__(self, parent=None):
        super(MarkerObject, self).__init__(parent)
        self._coordinate = QtPositioning.QGeoCoordinate()
        self._source = QtCore.QUrl()

    defgetCoordinate(self):
        return self._coordinate

    defsetCoordinate(self, coordinate):
        if self._coordinate != coordinate:
            self._coordinate = coordinate
            self.coordinateChanged.emit(self._coordinate)

    defgetSource(self):
        return self._source

    defsetSource(self, source):
        if self._source != source:
            self._source = source
            self.sourceChanged.emit(self._source)

    coordinate = QtCore.pyqtProperty(QtPositioning.QGeoCoordinate, fget=getCoordinate, fset=setCoordinate, notify=coordinateChanged)
    source = QtCore.pyqtProperty(QtCore.QUrl, fget=getSource, fset=setSource, notify=sourceChanged)

classMapWidget(QtQuickWidgets.QQuickWidget):
    def__init__(self, parent=None):
        super(MapWidget, self).__init__(parent,
            resizeMode=QtQuickWidgets.QQuickWidget.SizeRootObjectToView)
        self._marker_object = MarkerObject(parent)
        self._marker_object.setSource(QtCore.QUrl("http://maps.gstatic.com/mapfiles/ridefinder-images/mm_20_red.png"))
        self.rootContext().setContextProperty("marker_object", self._marker_object)
        qml_path = os.path.join(os.path.dirname(__file__), "main.qml")
        self.setSource(QtCore.QUrl.fromLocalFile(qml_path))

    @QtCore.pyqtSlot(QtPositioning.QGeoCoordinate)defmoveMarker(self, pos):
        self._marker_object.setCoordinate(pos)

classWidget(QtWidgets.QWidget):
    def__init__(self, parent=None):
        super(Widget, self).__init__(parent)
        self._lat_spinbox = QtWidgets.QDoubleSpinBox(
            minimum=-90, 
            maximum=90, 
            decimals=6, 
            value=59.91
        )
        self._lng_spinbox = QtWidgets.QDoubleSpinBox(
            minimum=-180, 
            maximum=180, 
            decimals=6, 
            value=10.75
        )
        search_button = QtWidgets.QPushButton("Search", clicked=self.search)
        self._map_widget = MapWidget()
        flay = QtWidgets.QFormLayout(self)
        flay.addRow("Latitude:", self._lat_spinbox)
        flay.addRow("Longitude:", self._lng_spinbox)
        flay.addRow(search_button)
        flay.addRow(self._map_widget)
        self.search()

    @QtCore.pyqtSlot()defsearch(self):
        lat = self._lat_spinbox.value()
        lng = self._lng_spinbox.value()
        self._map_widget.moveMarker(QtPositioning.QGeoCoordinate(lat, lng))

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())

main.qml

importQtQuick2.9importQtLocation5.12importQtPositioning5.12Rectangle {
    id:rectanglewidth:640height:480Plugin {
        id:osmPluginname:"osm"
    }
    Map {
        id:mapanchors.fill:parentplugin:osmPlugincenter:marker_object.coordinatezoomLevel:10MapQuickItem {
        coordinate:marker_object.coordinateanchorPoint.x:image.widthanchorPoint.y:image.heightsourceItem:Image {
                id:imagesource:marker_object.source
            }
        }
    }
}

enter image description here

Post a Comment for "Refreshing Qquickwidget In Qml File After Button Click"