2013-05-14 32 views
7

Tôi đang tạo một ứng dụng hiển thị bản đồ khu vực và tôi đang cố gắng vẽ các nút trên đầu trang có thể đại diện cho thông tin.PyQt - hiển thị tiện ích ở đầu tiện ích

Tôi đã làm tất cả công việc, nhưng chỉ đơn giản bằng cách tạo một tiện ích con tùy chỉnh mà tôi đã hiển thị và in mọi thứ một lần nữa và một lần nữa mọi thông tin đã thay đổi. Ngoài ra tôi không thể 'kết nối' các nút với người nghe, bởi vì chúng chỉ là hình ảnh trong tiện ích ban đầu.

Điều này khiến tôi muốn cải tiến GUI của mình và giờ tôi đang cố gắng biến mọi lớp thành một tiện ích tùy chỉnh! Nhưng có một vấn đề, MapNodes của tôi không hiển thị nữa.

Tôi đã tìm kiếm stackoverflow và tìm thấy chủ đề hữu ích này: (?) How to set absolute position of the widgets in qt

Vì vậy, tôi phải từ bỏ mapnodes tôi là cha mẹ, và mẹ = widget mà đang được hiển thị

Dù sao, đây là của tôi ném vào nó, dán mã có liên quan ở đây. Gợi ý ở những nơi có thể sai lầm khủng khiếp: tất cả các lối vào

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 - Tôi quên thêm mã thêm nút. Vì vậy, sau một sự kiện đi kèm trong các nút cần phải được tạo ra, phương pháp này cháy tạo nút:

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() 

Trả lời

3

tôi sẽ khuyên bạn nên sử dụng các lớp QGraphicsScene và QGraphicsItem cho bản đồ của bạn thay vì lớp QWidget bình thường, vì chúng là thực hiện chính xác với mục đích trưng bày một số lượng lớn các mặt hàng đồ họa:

Từ tài liệu:

Lớp QGraphicsScene cung cấp bề mặt để quản lý một số lượng lớn các mục đồ họa 2D.

Lớp này đóng vai trò là vùng chứa cho QGraphicsItems. Nó được sử dụng cùng với QGraphicsView để hiển thị các mục đồ họa, chẳng hạn như các dòng, hình chữ nhật, văn bản hoặc thậm chí các mục tùy chỉnh, trên bề mặt 2D. QGraphicsScene là một phần của khung nhìn đồ họa.

QGraphicsScene cũng cung cấp chức năng cho phép bạn xác định hiệu quả cả vị trí của các mục và để xác định những mục nào có thể nhìn thấy trong khu vực tùy ý trên hiện trường. Với tiện ích QGraphicsView, bạn có thể trực quan hóa toàn cảnh hoặc phóng to và chỉ xem các phần của cảnh.

Bạn cũng có thể nhúng tiện ích con có nguồn gốc từ QWidget trong cảnh, cho phép bạn hiển thị thực tế mọi loại thông tin. Như một phần thưởng, bạn sẽ nhận được phân lớp, chuyển đổi nhanh và xử lý sẵn sàng sử dụng các tương tác chuột, điều này sẽ khá hữu ích để thực hiện một bản đồ tương tác.

+1

Các liên kết ở trên đã lỗi thời –

+0

Cảm ơn bạn đã báo cáo điều này, tôi đã sửa chúng! – ThePhysicist