2010-01-31 7 views
10

पीईक्यूटी में, मैं दिए गए बिंदुओं पर छोटे "नोड्स" कैसे प्लॉट कर सकता हूं और उन्हें किनारों से जोड़ सकता हूं? मुझे लगता है कि सभी पीईक्यूटी ट्यूटोरियल "प्लॉट एक बटन! प्लॉट एक चेकबॉक्स!"मैं पीईक्यूटी में नोड्स और किनारों को कैसे आकर्षित कर सकता हूं?

अग्रिम

उत्तर

3

आप वस्तुओं की साजिश में दिखाया गया है के साथ बातचीत करने में सक्षम होना चाहते हैं में विशाल धन्यवाद, आप एक QGraphicsScene का उपयोग कर से बेहतर हो जाएगा। यह ज़ूमिंग और पैनिंग को संभालता है और इसमें अन्य QGraphicsItem ऑब्जेक्ट्स शामिल हो सकते हैं जो अपनी बातचीत को संभाल सकते हैं।

इसका उपयोग करना बहुत आसान है, लेकिन इसमें कुछ ओवरहेड शामिल है, खासकर यदि आप हजारों ऑब्जेक्ट्स बनाने की योजना बनाते हैं।

आप एक पीईक्यूटी ट्यूटोरियल here पा सकते हैं। यह और एपीआई दस्तावेज़ आपको शुरू करना चाहिए।

+0

ट्यूटोरियल है कि आप से जुड़ा हुआ है के बारे में पता नहीं है। जब भी मैं पीईक्यूटी एप्लीकेशन बंद करता हूं तो मुझे सेगमेंटेशन गलती मिल रही है। – rbaleksandar

+0

ट्यूटोरियल 2008 से है, इसलिए इस दौरान कुछ चीजें बदल सकती हैं। सेगफॉल्ट-ऑन-क्लोज़ आमतौर पर एक संकेत है कि आपके मूल क्यूटी कक्षाओं (क्यूएप्लिकेशन, क्यूमेन विन्डो इत्यादि) के जीवनकाल/विन्यास के साथ कुछ गलत है। यदि आप अपने पीईक्यूटी संस्करण के लिए ट्यूटोरियल चला सकते हैं, तो आपको काम करने के लिए QGraphicsScene प्राप्त करने के लिए आवश्यक वस्तुओं को शामिल करने में सक्षम होना चाहिए। – drxzcl

+0

मैंने अपने मुद्दों को ठीक कर दिया है। लेकिन हाँ, संस्करण पुराना है। – rbaleksandar

3

इस के लिए एक अच्छा स्पष्टीकरण खोजने के लिए दर्द हो रहा है (2014 के अंत तक), और चूंकि यह प्रश्न सटीक रूप से पूछता है कि मैं क्या देख रहा था, मैं एक प्रतिलेखन पोस्ट करूंगा (सी ++ से पायथन तक) जो मैंने this post में पाया था।

  1. QGrahpicsItem, QPainterPath और QPainterPath.Element कक्षाएं आप देख रहे हैं कर रहे हैं:

    कोड के नीचे है, और यहाँ तर्क है। विशेष रूप से, QPainterPath कोरलड्रा, एडोब इलस्ट्रेटर, या इंकस्केप जैसे अनुप्रयोगों में आपको अपेक्षित वेक्टर कार्यक्षमता की तरह लागू करता है।

  2. नीचे दिए गए उदाहरण पूर्व-मौजूदा QGraphicsEllipseItem (नोड्स को प्रतिपादित करने के लिए) और QGraphicsPathItem (पथ को स्वयं प्रस्तुत करने के लिए) से लाभ प्राप्त करते हैं, जो QGraphicsItem से प्राप्त होते हैं।
  3. Path कन्स्ट्रक्टर QPainterPath तत्वों पर पुनरावृत्त करता है, प्रत्येक के लिए Node आइटम बनाता है; उनमें से प्रत्येक, बदले में, पैरेंट पथ ऑब्जेक्ट को अपडेट भेजता है, जो इसके अनुसार path संपत्ति अपडेट करता है।
  4. मुझे कहीं और पाए गए कम संरचित 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_() 
+0

इस कोड ने मुझे हाल ही में मदद की है! धन्यवाद! इसके अलावा मैं कक्षा नोड में एक फंक्शन प्लॉट करने की कोशिश कर रहा हूं - माउसप्रेसएवेंट/मध्य पथ पर पथ बिंदु पर नियंत्रण बिंदु जोड़ने के लिए क्लिक करें।() ताकि बिंदु ए> बीआई बीच में बिंदु सी जोड़ सके .. तो मैं एक " एल "आकार ... अर्थ> ए/बी शीर्ष बाएं/दाएं नीचे और सी कोने होने के नाते ... लेकिन मुझे यकीन नहीं है कि अगर यह सही है तो मुझे लाल रेखा रेखा का पता नहीं चलता है जब मैं दबाता हूं .. कोई संकेत है कि मैं इसे कैसे कर सकता हूं? धन्यवाद! – Dariusz

+1

@Dariusz मुझे यकीन है कि कुछ प्रकार के अंतर्निर्मित "माउसओवर" घटना या क्यूटी में ध्वज है, लेकिन मुझे यह याद नहीं है कि यह वर्ग किस वर्ग में है। मैं इसे 'QGraphicsItem' में खोजना शुरू कर दूंगा। – heltonbiker

+1

@Dariusz, वास्तव में मैंने उन्हें पाया, वे 'होवरएन्टरवेन्ट' और 'होवरलेववेन्ट' हैं, [यहां] (http://doc.qt.io/qt-4.8/qgraphicsitem.html) पाए गए हैं। – heltonbiker

संबंधित मुद्दे