【问题标题】:QGraphicsView connect a line to another QGraphicsSceneItemQGraphicsView 将一条线连接到另一个 QGraphicsSceneItem
【发布时间】:2017-01-29 11:17:25
【问题描述】:

我正在扩展 Qt 的 QGraphicsView 框架以创建交互式形状生成器。当您单击并拖动时,它会创建一个带有贝塞尔手柄的控制点以影响其曲线(与 Photoshop 中的路径相同)。

我有单独的控制点和两个贝塞尔处理点。我正在努力寻找一种显示贝塞尔手柄线段的方法,即从贝塞尔点到控制点。

顶部的贝塞尔直线示例:

显示它的最佳方法是什么?我试图覆盖paintEvent,它可以很好地绘制线条,但视图的某些部分并不清楚,而且有点时髦。

代码如下:

def paintEvent(self, event):

    painter = QtGui.QPainter(self.viewport())

    if self.points:
        painter.begin(self)
        painter.fillRect(self.viewport().rect(), QtGui.QBrush(QtGui.QColor(50, 50, 50)))
        for point in self.points:
            if point.point_type != ControlPoint.Bezier:
                continue

            painter.drawLine(point.handle_1.pos().x(), point.handle_1.pos().y(), 
                             point.handle_2.pos().x(), point.handle_2.pos().y());
        painter.end()

    QtGui.QGraphicsView.paintEvent(self, event)

或者是为生产线本身创建项目的更好方法?感谢任何见解!

【问题讨论】:

    标签: python pyqt


    【解决方案1】:

    这是我目前的解决方案。我正在对QGraphicsScene.drawForeground 进行子类化以绘制任何贝塞尔点之间的所有线。唯一不好的是我必须更新整个视口,否则它不会清除所有以前的绘图。所以这可能会在以后的性能方面让我大吃一惊。

    除此之外,它工作得很好,即使在移动点时,我也会得到一个很好的片段。

    def drawForeground(self, painter, rect):
        view = self.views()[0]
    
        # Forces whole view to update instead of partial.
        view.viewport().update()
    
        painter.begin(view)
    
        if view.points:
            pen = QtGui.QPen(QtCore.Qt.white, 1, QtCore.Qt.DashLine)
            painter.setPen(pen)
    
            for point in view.points:
                if point.point_type != ControlPoint.Bezier:
                    continue
    
                painter.drawLine(point.handle_1.pos().x(), point.handle_1.pos().y(), 
                                 point.handle_2.pos().x(), point.handle_2.pos().y());
        painter.end()
    
        return QtGui.QGraphicsScene.drawBackground(self, painter, rect)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 2021-07-19
      • 2011-12-12
      相关资源
      最近更新 更多