我正在研究如何将地图图像设置为QGraphicsRectItem对象中的QGraphicsScene对象,并且在PyQT5中得到了一个干净的崩溃。
守则是:
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
import smopy
from PIL.ImageQt import ImageQt
class MapWidget(QGraphicsRectItem):
def __init__(self, parent=None):
super(MapWidget, self).__init__(parent)
self.setRect(0.0, 0.0, 800, 600)
self.setFlags(self.ItemIsSelectable | self.ItemIsMovable)
self.image = None
# get map
map = smopy.Map((42., -1., 53., 3.), z=11, tilesize=48)
img = ImageQt(map.img)
self.image = QPixmap.fromImage(img)
def paint(self, painter, option, widget=None):
painter.drawPixmap(QPoint(0, 0), self.image)
class Window(QDialog):
def __init__(self):
super(Window, self).__init__()
self.layout = QVBoxLayout(self)
self.view = QGraphicsView()
self.scene = QGraphicsScene()
self.view.setScene(self.scene)
self.layout.addWidget(self.view)
self.map = MapWidget()
self.scene.addItem(self.map)
self.resize(1200, 800)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())输出消息是:
进程已完成,出口代码139 (被信号11: SIGSEGV中断)
发布于 2018-03-30 21:54:17
与其将其转换为PIL,还可以将其转换为numpy并加载到QImage。另一方面,最好使用QGraphicsPixmapItem,因为它可以正确地重新绘制。
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
import smopy
class MapWidget(QGraphicsPixmapItem):
def __init__(self, parent=None):
super(MapWidget, self).__init__(parent)
self.setFlags(self.ItemIsSelectable | self.ItemIsMovable)
# get map
map = smopy.Map((42., -1., 53., 3.), z=11, tilesize=48)
numpy_image= map.to_numpy()
img = QImage(numpy_image.data, *numpy_image.shape[1::-1], QImage.Format_RGB888)
self.setPixmap(QPixmap.fromImage(img))
class Window(QDialog):
def __init__(self):
super(Window, self).__init__()
self.layout = QVBoxLayout(self)
self.view = QGraphicsView()
self.scene = QGraphicsScene()
self.view.setScene(self.scene)
self.layout.addWidget(self.view)
self.map = MapWidget()
self.scene.addItem(self.map)
self.resize(1200, 800)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())

https://stackoverflow.com/questions/49576715
复制相似问题