我正在使用 PyQt5 通过 UI 文件中的 QQuickWidget 访问 QML 代码。我的 QML 文件创建地图并绘制点。我想从我的 python 代码中添加/修改这些点。我可以在 python 中访问 QML 中的 Map 对象,但 PyQt 将它和 MapQuickItem 视为 QQuickItems。我不确定如何在 python 中实际创建一个新的 MapQuickItem 并将其添加到 Map 对象中。我尝试使用必要的属性创建 QQuickItem,然后使用 addMapItem 方法,但收到此错误:
TypeError: 无法将 QQuickItem.addMapItem 的参数 0 从 'QQuickItem' 转换为 'QDeclarativeGeoMapItemBase*'"
我不知道如何QDeclarativeGeoMapItemBase
在 PyQt 中创建一个对象,或者我是否应该以另一种方式进行。
如您所见,我在正确引用 QML 文件中的对象时也遇到了一些问题。self.map
或者self.map.rootObject()
在 UI 中为我获取 QQuickWidget,在self.map.rootObject().children()[1]
QML 中获取 Map 对象。我更喜欢使用 findChild() 通过它们的 ID 来定位这些项目,但一直没能做到。有没有更好的方法?是否应该创建一个复制我的 QML 文件结构的 Python 对象?
这是 QML 代码的示例。我在 UI 文件中将此 QML 文件作为 QQuickWidget 引用。
Rectangle {
id:rectangle
Plugin {
id: osmPlugin
name: "osm"
}
property variant locationTC: QtPositioning.coordinate(44.951, -93.192)
Map {
id: map
anchors.fill: parent
plugin: osmPlugin
center: locationTC
zoomLevel: 10
MapQuickItem {
coordinate: QtPositioning.coordinate(44.97104,-93.46055)
anchorPoint.x: image.width * 0.5
anchorPoint.y: image.height
sourceItem:
Image { id: image; source: "marker.png" }
}
}
}
下面是我尝试创建 MapQuickItem 并将其添加到地图的 PyQt 代码示例。
from PyQt5 import QtCore, uic, QtWidgets, QtPositioning, QtLocation, QtQml, QtQuick
form_class = uic.loadUiType("TTRMS.ui")[0]
class MainWindow(QtWidgets.QMainWindow, form_class):
'''
classdocs
'''
def __init__(self, parent=None):
QtWidgets.QMainWindow.__init__(self, parent)
self.setupUi(self)
tmc = QQuickItem()
new_coordinate = QtPositioning.QGeoCoordinate()
new_coordinate.setLatitude(44.951)
new_coordinate.setLongitude(-93.192)
tmc.setProperty("coordinate",new_coordinate)
tmc.setProperty("anchorPoint",QtCore.QPointF(12.5, 32.0))
image = QQuickItem()
image.setProperty("source", QtCore.QUrl.fromLocalFile(("marker.png")))
tmc.setProperty("sourceItem", image)
image.setParent(tmc)
self.map.rootObject().children()[1].addMapItem(tmc)
我在 Windows 7 上运行一切。PyQt5 开发是在 Eclipse 中使用 PyDev 和 Python 3.4(32 位)、Qt Creator 5.5 中的 QML 编码和 Qt Designer 5.5 中的 UI 完成的。