关于PyQt5中graphicsView里的QGraphicsLineItem的使用(setLine and setPen)

由于要在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对象,之后进行操作。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋冬晚归客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值