2013-05-14 5 views
7

मैं एक ऐसा एप्लिकेशन बना रहा हूं जो किसी क्षेत्र का नक्शा दिखाता है और मैं इसके शीर्ष पर नोड्स खींचने की कोशिश कर रहा हूं जो जानकारी का प्रतिनिधित्व कर सकता है।पीईक्यूटी - विजेट के शीर्ष पर विजेट प्रदर्शित करना

मैंने इसे सभी काम किया, लेकिन मैंने एक कस्टम विजेट बनाकर ऐसा किया जो मैंने दिखाया और सब कुछ बार-बार सूचनाओं को बदल दिया। इसके अलावा मैं श्रोताओं को नोड्स को 'कनेक्ट' नहीं कर सका, क्योंकि वे मूल विजेट में सिर्फ छवियां थीं।

इससे मुझे अपने जीयूआई में सुधार करना है और अब मैं हर वर्ग को एक कस्टम विजेट बनाने की कोशिश कर रहा हूं! लेकिन एक समस्या है, मेरे MapNodes अब और नहीं दिख रहे हैं।

मैं stackoverflow खोज की है और यह सहायक धागा मिला: (?) How to set absolute position of the widgets in qt

तो मैं अपने mapnodes एक माता पिता, और माता पिता = विजेट है कि दिखाया जा रहा है

वैसे भी देना है, यहाँ है मेरी यहां प्रासंगिक कोड चिपकाकर, इसे फेंक दें। जहां सामान भयानक गलत हो सकता है पर सुझाव: सभी inits

app = QtGui.QApplication(list()) 
mutexbranch = Lock() 
mutexnode = Lock() 

def exec(): 
    return app.exec_() 

#Singleton Pattern: wanneer en object aan iets moet kunnen 
#     waar het inherent door de structuur niet aankon 
#     wordt dit via dit singleton opgelost 
class GuiInternalCommunication: 
    realmap = 0 


class MapView(QtGui.QWidget, listener.Listener): 
    def __init__(self, mapimagepath): 
     QtGui.QMainWindow.__init__(self) 
     listener.Listener.__init__(self) 

     self.map = Map(self, mapimagepath) 
     #self.setCentralWidget(self.map) 

     self.initUI() 


    def initUI(self): 
     self.setWindowTitle('Population mapping') 

     hbox = QtGui.QHBoxLayout() 
     hbox.addWidget(self.map) 

     self.setLayout(hbox) 

     resolution = QtGui.QDesktopWidget().screenGeometry() 
     self.setGeometry(20,20,550,800) 
     self.show() 



###################################################################### 

class Map(QtGui.QWidget): 
    def __init__(self, parent, mapimagepath): 
     QtGui.QWidget.__init__(self, parent) 

     #self.timer = QtCore.QBasicTimer() 

     #coordinaten hoeken NE en SW voor kaart in map graphics van SKO 
     self.realmap = RealMap( 
      mapimagepath, 
      (51.0442, 3.7268), 
      (51.0405, 3.7242), 
      550, 
      800) 
     GuiInternalCommunication.realmap = self.realmap 

     self.needsupdate = True 
     self.timelabel = 0 

     parent.setGeometry(0,0,self.realmap.width, self.realmap.height) 

     self.mapNodes = {} 
     self.mapBranches = {} 

    def paintEvent(self, event): 
     painter = QtGui.QPainter() 
     painter.begin(self) 
     rect = self.contentsRect() 

     #teken achtergrond 
     self.realmap.drawRealMap(painter) 

     #teken branches 
     mutexbranch.acquire() 
     try: 
      for branch, mapBranch in self.mapBranches.items(): 
       mapBranch.drawMapBranch(painter) 
     finally: 
      mutexbranch.release()   



###################################################################### 

class RealMap(QtGui.QWidget): 
    def __init__(self, path, coordRightTop, coordLeftBot, width, height, pixpermet = 2.6): 
     super(RealMap, self).__init__() 
     self.path = path 
     self.mapimage = QtGui.QImage(self.path) 
     self.coordLeftBot = coordLeftBot 
     self.coordRightTop = coordRightTop 

     self.width = width 
     self.height = height 

     self.realdim = self.calcRealDim() 

     self.pixpermet = pixpermet 

    def paintEvent(self, e): 
     painter = QtGui.QPainter() 
     painter.begin(self) 
     self.drawRealMap(self, painter) 
     painter.end() 

    def drawRealMap(self, painter): 
     painter.drawImage(0,0,self.mapimage) 


###################################################################### 

class MapNode(QtGui.QWidget): 
    dangertocolor = {"normal":"graphics//gradients//green.png", 
        "elevated":"graphics//gradients//orange.png", 
        "danger":"graphics//gradients//red.png"} 

    gradimage = {"normal":QtGui.QImage(dangertocolor["normal"]), 
        "elevated":QtGui.QImage(dangertocolor["elevated"]), 
        "danger":QtGui.QImage(dangertocolor["danger"])} 
    btimage = QtGui.QImage("graphics//BT-icon.png") 

    def __init__(self, scanner, x, y, danger = 0, parent = None): 
     # MapNode erft over van QWidget 
     super(MapNode, self).__init__() 
     QtGui.QWidget.__init__(self, parent) 

     self.scanner = scanner 
     self.x = x 
     self.y = y 
     self.danger = 'normal' 
     self.calcDanger(danger) 

     self.grads = {} 
     self.grad = QtGui.QImage(MapNode.dangertocolor[self.danger]) 


    def paintEvent(self, e): 
     painter = QtGui.QPainter() 
     painter.begin(self) 
     self.drawMapNode(painter) 
     painter.end() 

    def drawMapNode(self, painter): 
     realmap = GuiInternalCommunication.realmap 
     radiusm = self.scanner.range 
     radiusp = radiusm*realmap.pixpermet 
     factor = radiusp/200  # basis grootte gradiënten is 200 pixels. 

     grad = MapNode.gradimage[self.danger] 
     grad = grad.scaled(grad.size().width()*factor, grad.size().height()*factor) 

     painter.drawImage(self.x-100*factor,self.y-100*factor, grad) 
     painter.drawImage(self.x-10, self.y-10,MapNode.btimage) 
     painter.drawText(self.x-15, self.y+20, str(self.scanner.sensorid) + '-' + str(self.scanner.name)) 


###################################################################### 

class MapBranch: 
    branchpens = {"normal": QtGui.QPen(QtCore.Qt.green, 3, QtCore.Qt.DashLine), 
       "elevated": QtGui.QPen(QtGui.QColor(255, 51, 0), 3, QtCore.Qt.DashLine), #mandarine orange hex is 255-165-0 
       "danger": QtGui.QPen(QtCore.Qt.red, 3, QtCore.Qt.DashLine)} 

    def __init__(self, branch, mapnode1, mapnode2, danger = 0): 
     self.mapnode1 = mapnode1 
     self.mapnode2 = mapnode2 
     self.branch = branch 
     self.danger = danger 

     self.calcDanger(danger) 

    def drawMapBranch(self, painter): 
     painter.setPen(MapBranch.branchpens[self.danger]) 
     painter.drawLine(self.mapnode1.x, 
         self.mapnode1.y, 
         self.mapnode2.x, 
         self.mapnode2.y) 

संपादित करें - मैं कोड है कि नोड्स कहते हैं जोड़ने के लिए भूल गया था। ,

def addNode(self, scanner): 
    mutexnode.acquire() 
    try: 
     coord = self.realmap.convertLatLon2Pix((scanner.latitude, scanner.longitude)) 
     self.mapNodes[scanner.sensorid] = MapNode(scanner, coord[0], coord[1], parent = self) 
     self.mapNodes[scanner.sensorid].move(coord[0],coord[1]) 
     #self.mapNodes[scanner.sensorid].show() 
    finally: 
     mutexnode.release() 

उत्तर

3

मैं सामान्य QWidget वर्गों के बजाय अपने नक्शे के लिए QGraphicsScene और QGraphicsItem वर्गों का उपयोग करने की सलाह देंगे, क्योंकि वे कर रहे हैं: तो बाद एक घटना नोड में आता है बनाने की आवश्यकता है, इस विधि आग नोड बनाने

चित्रमय आइटम की एक बड़ी संख्या को प्रदर्शित करने के उद्देश्य के लिए वास्तव में बनाया

प्रलेखन से:

QGraphicsScene वर्ग 2 डी चित्रमय आइटम की एक बड़ी संख्या के प्रबंधन के लिए एक सतह प्रदान करता है।

कक्षा QGraphicsItems के लिए एक कंटेनर के रूप में कार्य करती है। यह 2 डी सतह पर ग्राफिकल वस्तुओं, जैसे लाइनों, आयत, पाठ, या यहां तक ​​कि कस्टम आइटम, को देखने के लिए QGraphicsView के साथ एक साथ उपयोग किया जाता है। QGraphicsScene ग्राफिक्स व्यू फ्रेमवर्क का हिस्सा है।

क्यूग्राफिक्ससेन भी कार्यक्षमता प्रदान करता है जो आपको वस्तुओं के स्थान दोनों को कुशलतापूर्वक निर्धारित करने और दृश्य के मनमाने ढंग से क्षेत्र में कौन से आइटम दिखाई दे रहा है, यह निर्धारित करने के लिए करता है। QGraphicsView विजेट के साथ, आप या तो पूरे दृश्य को विज़ुअलाइज़ कर सकते हैं, या ज़ूम इन कर सकते हैं और दृश्य के केवल हिस्सों को देख सकते हैं।

आप दृश्य में QWidget से व्युत्पन्न विजेट भी एम्बेड कर सकते हैं, जो आपको व्यावहारिक रूप से किसी भी प्रकार की जानकारी प्रदर्शित करने की अनुमति देनी चाहिए। बोनस के रूप में, आपको लेयरिंग, फास्ट ट्रांसफॉर्मेशन और माउस इंटरैक्शन के लिए उपयोग में आने वाली हैंडलिंग मिल जाएगी, जो एक इंटरेक्टिव मानचित्र को साकार करने के लिए काफी उपयोगी होनी चाहिए।

+1

उपर्युक्त लिंक पुराने हैं –

+0

इस रिपोर्ट के लिए धन्यवाद, मैंने उन्हें ठीक किया! – ThePhysicist

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