gpt4 book ai didi

python - PyQt - 在小部件之上显示小部件

转载 作者:太空狗 更新时间:2023-10-29 21:55:24 25 4
gpt4 key购买 nike

我正在制作一个显示区域 map 的应用程序,我正在尝试在它上面绘制可以表示信息的节点。

我让这一切都成功了,但只需制作一个我展示的自定义小部件,并在每次信息更改时一次又一次地打印所有内容。此外,我无法将节点“连接”到监听器,因为它们只是原始小部件中的图像。

这让我想改革我的 GUI,现在我正试图让每个类都成为自定义小部件!但是有一个问题,我的 MapNodes 不再显示了。

我搜索了 stackoverflow 并找到了这个有用的线程: How to set absolute position of the widgets in qt

所以我必须给我的 map 节点一个父节点,父节点 = 正在显示的小部件(?)

无论如何,这是我的想法,在这里粘贴相关代码。提示可能会出现严重错误的地方:所有初始化

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

最佳答案

我建议您为您的 map 使用 QGraphicsScene 和 QGraphicsItem 类而不是普通的 QWidget 类,因为它们是专门为显示大量图形项目而设计的:

来自文档:

The QGraphicsScene class provides a surface for managing a large number of 2D graphical items.

The class serves as a container for QGraphicsItems. It is used together with QGraphicsView for visualizing graphical items, such as lines, rectangles, text, or even custom items, on a 2D surface. QGraphicsScene is part of the Graphics View Framework.

QGraphicsScene also provides functionality that lets you efficiently determine both the location of items, and for determining what items are visible within an arbitrary area on the scene. With the QGraphicsView widget, you can either visualize the whole scene, or zoom in and view only parts of the scene.

您还可以在场景中嵌入从 QWidget 派生的小部件,这应该允许您显示几乎任何类型的信息。作为奖励,您将获得分层、快速转换和随时可用的鼠标交互处理,这对于实现交互式 map 应该非常有用。

关于python - PyQt - 在小部件之上显示小部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16545076/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com