Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 沿直线旋转矩形_Python_Pyqt_Pyqt5 - Fatal编程技术网

Python 沿直线旋转矩形

Python 沿直线旋转矩形,python,pyqt,pyqt5,Python,Pyqt,Pyqt5,qt中的第一个项目 我无法沿直线平移/旋转矩形。基本上,我希望将rect与直线的位置对齐。当我改变圆的位置时,矩形应该沿直线平移。见下图 我现在有什么 w_len = len(str(weight)) / 3 * r + r / 3 weight_v = Vector(r if w_len <= r else w_len, r) weight_rectangle = QRectF(*(mid - weight_v), *(2 * weight_v)) painter.drawRect(

qt中的第一个项目

我无法沿直线平移/旋转矩形。基本上,我希望将rect与直线的位置对齐。当我改变圆的位置时,矩形应该沿直线平移。见下图

我现在有什么

w_len = len(str(weight)) / 3 * r + r / 3
weight_v = Vector(r if w_len <= r else w_len, r)
weight_rectangle = QRectF(*(mid - weight_v), *(2 * weight_v))
painter.drawRect(weight_rectangle)
更新:

有了下面的答案,我就可以修复旋转了。非常感谢,看起来我的文字显示不正确

我有以下代码:

painter.translate(center_of_rec_x, center_of_rec_y);
painter.rotate(- link_paint.angle());
rx = -(weight_v[0] * 0.5)
ry = -(weight_v[1] )
new_rec = QRect(rx , ry, weight_v[0], 2 * weight_v[1])
painter.drawRect(QRect(rx , ry, weight_v[0] , 2 * weight_v[1] ))
painter.drawText(new_rec, Qt.AlignCenter, str(weight))
更新2:

一切都很好,这是我代码中的一个错误。我拿错了连接角度


Thx

始终根据原点(0,0)进行旋转,因此需要平移到旋转的原点,然后应用它

此外,在对画师应用任何临时更改时,应使用
save()
restore()
:以这种方式存储画师的当前状态,然后将恢复该状态(包括同时应用的任何转换)。可以嵌套绘制器状态,并且可以保存多次以应用绘制器状态修改的多个“层”。请记住,在释放(结束)画师之前,所有状态必须恢复为基本状态

因为您没有提供MRE,所以我创建了一个小部件来展示它是如何工作的:

对于简单的转换,使用
translate
rotate
通常就足够了,但上面的内容几乎与以下内容相同:

        transform = QtGui.QTransform()
        transform.translate(contents.center().x(), contents.center().y())
        transform.rotate(-line.angle())
        qp.save()
        qp.setTransform(transform)
        # ...

对此表示感谢。MRE不见了,因为我正在编写其他人的代码并进行修改以学习基本知识,基本上只是学习;感谢您的info.quick问题,在您的示例中,您是如何处理文本的。在你的帮助下,我设法解决了旋转问题(很难让我的大脑重新设置x,y)。让我用我在课文中看到的内容更新这个问题
class AngledRect(QtWidgets.QWidget):
    def __init__(self):
        QtWidgets.QWidget.__init__(self)
        self.setMinimumSize(200, 200)

    def paintEvent(self, event):
        qp = QtGui.QPainter(self)
        qp.setRenderHints(qp.Antialiasing)

        contents = self.contentsRect()
        # draw a line from the top left to the bottom right of the widget
        line = QtCore.QLineF(contents.topLeft(), contents.bottomRight())
        qp.drawLine(line)

        # save the current state of the painter
        qp.save()
        # translate to the center of the painting rectangle
        qp.translate(contents.center())
        # apply an inverted rotation, since the line angle is counterclockwise
        qp.rotate(-line.angle())

        # create a rectangle that is centered at the origin point
        rect = QtCore.QRect(-40, -10, 80, 20)
        qp.setPen(QtCore.Qt.white)
        qp.setBrush(QtCore.Qt.black)
        qp.drawRect(rect)
        qp.drawText(rect, QtCore.Qt.AlignCenter, '{:.05f}'.format(line.angle()))
        qp.restore()

        # ... other painting...
        transform = QtGui.QTransform()
        transform.translate(contents.center().x(), contents.center().y())
        transform.rotate(-line.angle())
        qp.save()
        qp.setTransform(transform)
        # ...