Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 发出信号后QML AppWindow未更新_Python_Python 3.x_Pyqt_Qml_Pyqt5 - Fatal编程技术网

Python 发出信号后QML AppWindow未更新

Python 发出信号后QML AppWindow未更新,python,python-3.x,pyqt,qml,pyqt5,Python,Python 3.x,Pyqt,Qml,Pyqt5,我有一个小问题,让我花了一上午的大部分时间。我正试图根据pyQt使用地理编码器传入的本地坐标,在QML中绘制一个地图屏幕。我可以画地图,但一旦信号发出,地图似乎就不会更新。我对QML和信号/插槽比较陌生。任何帮助都将不胜感激 main.py from PyQt5.QtGui import QGuiApplication from PyQt5.QtQml import QQmlApplicationEngine from PyQt5.QtCore import QObject, pyqtSigna

我有一个小问题,让我花了一上午的大部分时间。我正试图根据pyQt使用地理编码器传入的本地坐标,在QML中绘制一个地图屏幕。我可以画地图,但一旦信号发出,地图似乎就不会更新。我对QML和信号/插槽比较陌生。任何帮助都将不胜感激

main.py

from PyQt5.QtGui import QGuiApplication
from PyQt5.QtQml import QQmlApplicationEngine
from PyQt5.QtCore import QObject, pyqtSignal, pyqtSlot

class Point(QObject):
    def __init__(self, lat, lng):
        QObject.__init__(self)
        self.lat = lat
        self.lng = lng


    #Signal sending point
    #Give the name of the argument through arguments=['lat', 'lng']
    #Otherwise, it will not be possible to get it in QML
    showCenter = pyqtSignal(float, float, arguments=['lat', 'lng'])

    #Slot for emitting point
    @pyqtSlot()
    def emitPoint(self):
        self.showCenter.emit(self.lat, self.lng)


if __name__ == "__main__":
    import sys
    import geocoder 

    #Create an instance of the application
    app = QGuiApplication(sys.argv)

    #Create a QML engine
    engine = QQmlApplicationEngine()

    #Create a Point object
    g = geocoder.ip('me')
    center_point = Point(g.latlng[0], g.latlng[1])

    #And register it in the context of QML
    engine.rootContext().setContextProperty("center_point", center_point)

    #Load the qml file into the engine
    engine.load("main.qml")

    engine.quit.connect(app.quit)
    sys.exit(app.exec_())
from PyQt5 import QtCore, QtGui, QtPositioning, QtQml

class PointObject(QtCore.QObject):
    coordinateChanged = QtCore.pyqtSignal(QtPositioning.QGeoCoordinate)

    def __init__(self, parent=None):
        super(PointObject, self).__init__(parent)
        self._coordinate = QtPositioning.QGeoCoordinate()

    def getCoordinate(self):
        return self._coordinate

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

    coordinate = QtCore.pyqtProperty(QtPositioning.QGeoCoordinate, fget=getCoordinate, fset=setCoordinate, notify=coordinateChanged)

if __name__ == "__main__":
    import os
    import sys
    import geocoder 

    #Create an instance of the application
    app = QtGui.QGuiApplication(sys.argv)
    #Create a QML engine
    engine = QtQml.QQmlApplicationEngine()
    #Create a Point object
    g = geocoder.ip('me')
    center_point = PointObject()
    center_point.setCoordinate(QtPositioning.QGeoCoordinate(*g.latlng))
    #And register it in the context of QML
    engine.rootContext().setContextProperty("center_point", center_point)
    #Load the qml file into the engine
    qml_path = os.path.join(os.path.dirname(__file__), "main.qml")
    engine.load(QtCore.QUrl.fromLocalFile(qml_path))
    if not engine.rootObjects():
        sys.exit(-1)
    engine.quit.connect(app.quit)
    sys.exit(app.exec_())
main.qml

import QtQuick 2.5
import QtQml 2.0
import QtQuick.Controls 1.4
import QtQuick.Layouts 1.2
import QtPositioning 5.9
import QtLocation 5.9

ApplicationWindow {
    visible: true
    width: 640
    height: 480
    title: qsTr("Map Point demo")
    color: "whitesmoke"

    Plugin {
        id: mapPlugin
        name: "esri" //"mapboxgl" "osm" "esri"
    }

    Map {
        id: map
        anchors.fill: parent
        plugin: mapPlugin
        center: QtPositioning.coordinate(0.0, 0.0)
        zoomLevel: 6 

        MapCircle {
            id: dot
            center: QtPositioning.coordinate(0.0, 0.0)
            radius: 50
            color: 'red'
        }

        Connections {
            target: center_point

            onEmitPoint: {
                console.info("Point changed")
                map.center = QtPositioning.coordinate(lat, lng)
                dot.center = QtPositioning.coordinate(lat, lng)
            }
        }
    }    

    Component.onCompleted: {
        console.info("Signal Emitted")
        center_point.emitPoint()
    }
}
import QtQuick 2.5
import QtQml 2.0
import QtQuick.Controls 1.4
import QtQuick.Layouts 1.2
import QtPositioning 5.9
import QtLocation 5.9

ApplicationWindow {
    visible: true
    width: 640
    height: 480
    title: qsTr("Map Point demo")
    color: "whitesmoke"

    Plugin {
        id: mapPlugin
        name: "esri" //"mapboxgl" "osm" "esri"
    }

    Map {
        id: map
        anchors.fill: parent
        plugin: mapPlugin
        center: center_point.coordinate
        zoomLevel: 6 

        MapCircle {
            id: dot
            center: center_point.coordinate
            radius: 50
            color: 'red'
        }
    }    
}

使用连接时,如果目标信号被称为信号的名称,则必须使用信号的名称,在您的情况下,信号是showCenter,因此必须使用showCenter的名称:

Connections {
    target: center_point

    onShowCenter: { // <---
        console.info("Point changed")
        map.center = QtPositioning.coordinate(lat, lng)
        dot.center = QtPositioning.coordinate(lat, lng)
    }
}
main.qml

import QtQuick 2.5
import QtQml 2.0
import QtQuick.Controls 1.4
import QtQuick.Layouts 1.2
import QtPositioning 5.9
import QtLocation 5.9

ApplicationWindow {
    visible: true
    width: 640
    height: 480
    title: qsTr("Map Point demo")
    color: "whitesmoke"

    Plugin {
        id: mapPlugin
        name: "esri" //"mapboxgl" "osm" "esri"
    }

    Map {
        id: map
        anchors.fill: parent
        plugin: mapPlugin
        center: QtPositioning.coordinate(0.0, 0.0)
        zoomLevel: 6 

        MapCircle {
            id: dot
            center: QtPositioning.coordinate(0.0, 0.0)
            radius: 50
            color: 'red'
        }

        Connections {
            target: center_point

            onEmitPoint: {
                console.info("Point changed")
                map.center = QtPositioning.coordinate(lat, lng)
                dot.center = QtPositioning.coordinate(lat, lng)
            }
        }
    }    

    Component.onCompleted: {
        console.info("Signal Emitted")
        center_point.emitPoint()
    }
}
import QtQuick 2.5
import QtQml 2.0
import QtQuick.Controls 1.4
import QtQuick.Layouts 1.2
import QtPositioning 5.9
import QtLocation 5.9

ApplicationWindow {
    visible: true
    width: 640
    height: 480
    title: qsTr("Map Point demo")
    color: "whitesmoke"

    Plugin {
        id: mapPlugin
        name: "esri" //"mapboxgl" "osm" "esri"
    }

    Map {
        id: map
        anchors.fill: parent
        plugin: mapPlugin
        center: center_point.coordinate
        zoomLevel: 6 

        MapCircle {
            id: dot
            center: center_point.coordinate
            radius: 50
            color: 'red'
        }
    }    
}

谢谢,这两种方法都解决了这个问题。