我创建了一个需要交互的地图(火车)的 SVG 图像,当单击地图的一部分时,颜色会改变,并且会执行控制事物的方法(通过树莓派)。
将按钮连接到插槽很简单,我猜测我尝试过:
self.path.clicked.connect(self.some_func)
是否可以单击 SVG 元素并让它根据给定的方法执行方法,id
就像单击按钮时一样?
这是一个MVCE:
测试.svg
<svg height="100" width="100">
<circle id="elem1" cx="50" cy="50" r="40"/>
</svg>
svg_widget.py
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtXml import *
from PyQt5.QtSvg import *
import sys
class svgWidget(QSvgWidget):
def __init__(self, parent=None):
super(QSvgWidget, self).__init__(parent)
self.display = QTextEdit()
self.doc = QDomDocument("doc")
fName = QFile("test.svg")
if not fName.open(QIODevice.ReadOnly):
print("Cannot open the File")
exit(-1)
if not self.doc.setContent(fName):
print("Cannot parse the content")
fName.close()
exit(-1)
fName.close()
roots = self.doc.elementsByTagName("svg")
if roots.size() < 1:
print("Cannot find root")
exit(-1)
self.root = roots.at(0).toElement()
self.path = self.root.firstChild().toElement()
self.load(self.doc.toByteArray())
# self.path.clicked.connect(self.some_func)
self.layout = QVBoxLayout()
self.setLayout(self.layout)
QTimer.singleShot(2000, lambda: self.some_func())
def some_func(self):
print('setting fill')
self.path.setAttribute("fill", "#44dd75")
print('setting stroke')
self.path.setAttribute("stroke", "#FF0000")
print('setting stroke-width')
self.path.setAttribute("stroke-width", "3")
self.load(self.doc.toByteArray())
self.execute_method()
def execute_method(self):
print('method executed')
if __name__ == "__main__":
app = QApplication(sys.argv)
svgWidget = svgWidget()
svgWidget.show()
sys.exit(app.exec_())