2013-05-14 1 views
7

나는 영역의지도를 보여주는 응용 프로그램을 만들고 있는데, 정보를 나타낼 수있는 노드를 그리는 중입니다.PyQt - 위젯을 위젯으로 표시합니다.

나는 모든 것을 만들었지 만, 내가 보여준 하나의 맞춤 위젯을 만들고 매회 모든 정보를 변경하면서 모든 것을 계속해서 인쇄했다. 또한 원래 위젯의 이미지이기 때문에 노드를 리스너에 '연결할 수 없습니다'.

이렇게하면 GUI를 수정하고 모든 클래스를 맞춤 위젯으로 만들려고합니다! 하지만 문제가 있습니다. 내지도 노드가 더 이상 표시되지 않습니다.

는 I에 유래를 검색하고이 도움이 스레드 발견 (?) 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) 

EDIT - 노드를 추가하는 코드를 추가하는 것을 잊어 버렸습니다. 그들이 있기 때문에,

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 클래스는 2D 그래픽 많은 수의 항목을 관리하기위한 표면을 제공

.

클래스는 QGraphicsItems의 컨테이너 역할을합니다. QGraphicsView와 함께 사용되어 2D 표면의 선, 사각형, 텍스트 또는 사용자 지정 항목과 같은 그래픽 항목을 시각화합니다. QGraphicsScene은 Graphics View Framework의 일부입니다.

QGraphicsScene은 항목의 위치를 ​​효율적으로 결정하고 장면의 임의 영역에서 볼 수있는 항목을 결정할 수있는 기능도 제공합니다. QGraphicsView 위젯을 사용하면 전체 장면을 시각화하거나 장면의 일부만 확대하여 볼 수 있습니다.

또한 QWidget에서 파생 된 위젯을 장면에 포함 할 수 있으므로 사실상 모든 종류의 정보를 표시 할 수 있습니다. 보너스로 레이어 처리, 빠른 변환 및 마우스 상호 작용 처리를 할 수 있으며 이는 대화식지도를 실현하는 데 매우 유용합니다.

+1

위 링크는 구식입니다. –

+0

신고 해 주셔서 감사합니다. – ThePhysicist

관련 문제