由于要在PyQt5的graphView里插入的图片上加入十字准线,本来打算使用paintEvent的,结果尝试了几个小时一直未能实现,因为paintEvent是窗口刷新就会运行,使得十字准线直接出现,而另一个问题就是无法将线条显示在graphicsView中,原因我也不太清除(如果有大佬知道请赐教),花了整整一天终于在QGraphicsViewItem上解决了加十字准线的问题。
首先我们需要明白graphicsView里的三个关键名词,场景(scene),视图(view),图形项(graphics Item)。通俗的讲,视图的大小就是graphView架构里最外部的那部分;而场景则是在View里面的,它提供Item(也就是图片、线条等)的显示,它负责对图形项进行控制;而图形项则是相当于图片对象(或者线条其他),必须放入场景才能显示在graphicsView里,以上基本上就是grapicsView架构的主要部分。
需要强调的是,场景(scene)的大小一般默认为其内部最大Item(图元)的大小
那么问题来了,要在已有的图形项的中心上面加入十字准线,怎么加?
原来GraphicsView里有一个类叫 QGraphicsLineItem,它就是一个线条对象,能够直接在GraphicsView中加入线条。代码如下:
self.line1 = QGraphicsLineItem() #建立一个graphicsLineItemd对象,线条
self.line2 = QGraphicsLineItem()
self.line1.setZValue(3) #使得线条位于上层
self.line2.setZValue(3)
pen = QPen() #建立画笔
color = QColor() #建立一个色彩对象
color.setRed(255) #设立颜色为红色
pen.setColor(color) #为画笔加上颜色
pen.setWidth(4) #设置画笔宽度
self.line1.setPen(pen)
self.line2.setPen(pen)
这个由于需要修改这个线条的颜色,但是QGraphicsLineItem的基础方法只有两个,setLine和setPen。
setLine:根据QLineF或者坐标(第一个点的坐标(x,y),第二个点的坐标(x,y))来建立线条
def setLine(self, line: QtCore.QLineF) -> None: ...
def setLine(self, x1: float, y1: float, x2: float, y2: float) -> None: ...
setPen:根据画笔、颜色对象来建立线条
def setPen(self, pen: typing.Union[QtGui.QPen, QtGui.QColor, QtCore.Qt.GlobalColor, QtGui.QGradient]) -> None: ...
我们可以看出改变QGraphicsLineItem的线条必须从对象的角度从发,如建立颜色对象和画笔对象。
最后再通过通过计算坐标加入线条就可以了,代码如下:
def addLine(self): #插入十字准线
# self.vieww = self._scene.width()
# self.viewh = self._scene.height()
x1 = self._scene.width()/2
y1 = self._scene.height() - self._scene.height()*11/20
x2 = self._scene.width()/2
y2 = self._scene.height() - self._scene.height()*9/20
x3 = self._scene.width() - self._scene.width()*16/30
y3 = self._scene.height()/2
x4 = self._scene.width() - self._scene.width()*14/30
y4 = self._scene.height()/2
self.line1.setLine(x1,y1,x2,y2)
self.line2.setLine(x3,y3,x4,y4)
self._scene.addItem(self.line2)
self._scene.addItem(self.line1)
print(self._scene.height(),self._scene.width())
注意:建立在GraphicsView类建立插入函数,方便使用,然后在主类里利用GraphicsView建立graphicsView对象,之后进行操作。