QGraphicsView中选中QGraphicsPathItem使之不出现虚线框

绘制一条贝赛尔曲线,当选中该曲线时,显示其控制点并把控制点和起始点连结起来,从而可以清晰的显示曲线的参数。

 

# -*- coding: utf-8 -*-
from PyQt4 import QtGui, QtCore

class PathItem(QtGui.QGraphicsPathItem):
    def __init__(self, parent=None, scene=None):
        QtGui.QGraphicsPathItem.__init__(self, parent=parent, scene=scene)
        self.setFlag(QtGui.QGraphicsItem.ItemIsSelectable)
        self.setFlag(QtGui.QGraphicsItem.ItemIsMovable)
        path = QtGui.QPainterPath()
        self.start_x, self.start_y = 20, 30
        self.end_x, self.end_y = 80, 80
        self.ctrl1_x, self.ctrl1_y = 80, 0
        self.ctrl2_x, self.ctrl2_y = 50, 50
        path.moveTo(self.start_x, self.start_y)
        path.cubicTo(self.ctrl1_x, self.ctrl1_y, self.ctrl2_x, self.ctrl2_y, self.end_x, self.end_y)
        self.setPath(path)
        
    def paint(self, painter, options, widget):
        if self.isSelected():
            painter.drawEllipse(self.ctrl1_x - 3, self.ctrl1_y - 3, 6, 6)
            painter.drawLine(self.start_x, self.start_y, self.ctrl1_x, self.ctrl1_y)
            
            painter.drawEllipse(self.ctrl2_x - 3, self.ctrl2_y - 3, 6, 6)
            painter.drawLine(self.end_x, self.end_y, self.ctrl2_x, self.ctrl2_y)

            # 1

        QtGui.QGraphicsPathItem.paint(self, painter, options, widget)
        

if __name__ == '__main__':
    import sys
    app = QtGui.QApplication(sys.argv)
    
    view = QtGui.QGraphicsView()
    scene = QtGui.QGraphicsScene(view)
    view.setRenderHint(QtGui.QPainter.Antialiasing)
    view.setScene(scene)
    pathItem = PathItem(scene=scene)
    view.show()
    
    sys.exit(app.exec_())

 效果如下所示:


 

现在的问题就是当选中状态时,会自动出现一个虚线框,而显示控制点和连接线就已经表示了选中状态,翻看了文档并没有发现有任何说明可以取消该虚线框,通过翻看Qt源代码,发现绘制虚线框是通过paint方法中options参数来控制的,因此只需改变options参数即可,在# 1处增加一行代码:

 

options.state = QtGui.QStyle.State_None

 
 这是就能达到要求了。

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值