इस के लिए एक अच्छा स्पष्टीकरण खोजने के लिए दर्द हो रहा है (2014 के अंत तक), और चूंकि यह प्रश्न सटीक रूप से पूछता है कि मैं क्या देख रहा था, मैं एक प्रतिलेखन पोस्ट करूंगा (सी ++ से पायथन तक) जो मैंने this post में पाया था।
QGrahpicsItem
, QPainterPath
और QPainterPath.Element
कक्षाएं आप देख रहे हैं कर रहे हैं: कोड के नीचे है, और यहाँ तर्क है। विशेष रूप से, QPainterPath कोरलड्रा, एडोब इलस्ट्रेटर, या इंकस्केप जैसे अनुप्रयोगों में आपको अपेक्षित वेक्टर कार्यक्षमता की तरह लागू करता है।
- नीचे दिए गए उदाहरण पूर्व-मौजूदा
QGraphicsEllipseItem
(नोड्स को प्रतिपादित करने के लिए) और QGraphicsPathItem
(पथ को स्वयं प्रस्तुत करने के लिए) से लाभ प्राप्त करते हैं, जो QGraphicsItem
से प्राप्त होते हैं।
Path
कन्स्ट्रक्टर QPainterPath
तत्वों पर पुनरावृत्त करता है, प्रत्येक के लिए Node
आइटम बनाता है; उनमें से प्रत्येक, बदले में, पैरेंट पथ ऑब्जेक्ट को अपडेट भेजता है, जो इसके अनुसार path
संपत्ति अपडेट करता है।
- मुझे कहीं और पाए गए कम संरचित PyQt दस्तावेज़ों की तुलना में सी ++ क्यूटी 4 डॉक्स का अध्ययन करना बहुत आसान था। एक बार जब आप सी ++ और पायथन के बीच मानसिक रूप से अनुवाद करने के लिए उपयोग करते हैं, तो दस्तावेज़ प्रत्येक कक्षा का उपयोग करने के तरीके सीखने के लिए एक शक्तिशाली तरीका हैं।
#!/usr/bin/env python
# coding: utf-8
from PyQt4.QtGui import *
from PyQt4.QtCore import *
rad = 5
class Node(QGraphicsEllipseItem):
def __init__(self, path, index):
super(Node, self).__init__(-rad, -rad, 2*rad, 2*rad)
self.rad = rad
self.path = path
self.index = index
self.setZValue(1)
self.setFlag(QGraphicsItem.ItemIsMovable)
self.setFlag(QGraphicsItem.ItemSendsGeometryChanges)
self.setBrush(Qt.green)
def itemChange(self, change, value):
if change == QGraphicsItem.ItemPositionChange:
self.path.updateElement(self.index, value.toPointF())
return QGraphicsEllipseItem.itemChange(self, change, value)
class Path(QGraphicsPathItem):
def __init__(self, path, scene):
super(Path, self).__init__(path)
for i in xrange(path.elementCount()):
node = Node(self, i)
node.setPos(QPointF(path.elementAt(i)))
scene.addItem(node)
self.setPen(QPen(Qt.red, 1.75))
def updateElement(self, index, pos):
path.setElementPositionAt(index, pos.x(), pos.y())
self.setPath(path)
if __name__ == "__main__":
app = QApplication([])
path = QPainterPath()
path.moveTo(0,0)
path.cubicTo(-30, 70, 35, 115, 100, 100);
path.lineTo(200, 100);
path.cubicTo(200, 30, 150, -35, 60, -30);
scene = QGraphicsScene()
scene.addItem(Path(path, scene))
view = QGraphicsView(scene)
view.setRenderHint(QPainter.Antialiasing)
view.resize(600, 400)
view.show()
app.exec_()
ट्यूटोरियल है कि आप से जुड़ा हुआ है के बारे में पता नहीं है। जब भी मैं पीईक्यूटी एप्लीकेशन बंद करता हूं तो मुझे सेगमेंटेशन गलती मिल रही है। – rbaleksandar
ट्यूटोरियल 2008 से है, इसलिए इस दौरान कुछ चीजें बदल सकती हैं। सेगफॉल्ट-ऑन-क्लोज़ आमतौर पर एक संकेत है कि आपके मूल क्यूटी कक्षाओं (क्यूएप्लिकेशन, क्यूमेन विन्डो इत्यादि) के जीवनकाल/विन्यास के साथ कुछ गलत है। यदि आप अपने पीईक्यूटी संस्करण के लिए ट्यूटोरियल चला सकते हैं, तो आपको काम करने के लिए QGraphicsScene प्राप्त करने के लिए आवश्यक वस्तुओं को शामिल करने में सक्षम होना चाहिए। – drxzcl
मैंने अपने मुद्दों को ठीक कर दिया है। लेकिन हाँ, संस्करण पुराना है। – rbaleksandar