【发布时间】:2020-05-04 16:35:12
【问题描述】:
我对 pyqt5 有疑问。我创建了一个带有背景图像的场景的窗口,重新实现了drawBackground。我还有一个按钮,允许我在场景中的某个位置添加一条线。问题是,如果我单击按钮来绘制线条,那么这条线将在具有自己背景的单独场景中绘制,而不是在我拥有的场景中绘制。似乎它创建了一个新场景来画线。这是我的代码:
import sys
from PyQt5 import QtGui
from PyQt5.QtGui import QImage
from PyQt5.QtWidgets import (QMainWindow, QGraphicsView, QPushButton,
QHBoxLayout, QVBoxLayout, QWidget, QApplication, QGraphicsScene)
class GraphicsScene(QGraphicsScene):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self._image = QImage()
@property
def image(self):
return self._image
@image.setter
def image(self, img):
self._image = img
self.update()
def drawBackground(self, painter, rect):
if self.image.isNull():
super().drawBackground(painter, rect)
else:
painter.drawImage(rect, self._image)
class MainWindow(QWidget):
def __init__(self):
super().__init__()
self.title = "parcelDeliveryIta";
self.top = 100
self.left = 100
self.width = 1500
self.height = 900
self.initUI()
def initUI(self):
self.scene = GraphicsScene(self)
self.scene._image = QImage('Italy.png')
view = QGraphicsView(self.scene, self)
self.scene.setSceneRect(0, 0, view.width(), view.height())
addLine = QPushButton('AddLine')
addLine.clicked.connect(self.addLine)
hbox = QHBoxLayout(self)
hbox.addWidget(view)
vbox = QVBoxLayout(self)
vbox.addWidget(addLine)
hbox.addLayout(vbox)
self.setWindowTitle(self.title)
self.setGeometry(self.top, self.left, self.width, self.height)
self.setFixedSize(self.width, self.height)
self.setLayout(hbox)
self.show()
def addLine(self):
self.scene.addLine(0, 0, 100, 100)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
sys.exit(app.exec_())
这是点击按钮时的结果:
可以看到,线条是用自己的背景绘制的,即我设置为场景背景的图像(上面的图像被裁剪以更好地显示线条) 感谢您的帮助。
【问题讨论】:
-
你为什么说这条线是在一个单独的场景中绘制的,有它自己的背景,而不是在场景中?,除了显示该行为的图像之外,你能否展示该行为的图像?提供minimal reproducible example
-
我已经修改了帖子,现在代码可以执行了,我还添加了一张显示问题的图片。感谢您的帮助!
标签: python qt pyqt5 qgraphicsview qgraphicsscene