如何在pyqt4中添加箭头到我的行?

时间:2017-05-29 15:44:53

标签: python pyqt pyqt4

我收到了这段代码:

from PyQt4 import QtGui, QtCore

class MyFrame(QtGui.QGraphicsView):
    def __init__( self, parent = None ):
        super(MyFrame, self).__init__(parent)

        scene = QtGui.QGraphicsScene()
        self.setScene(scene)
        self.resize( 400, 240 )

        # http://pyqt.sourceforge.net/Docs/PyQt4/qpen.html
        pencil = QtGui.QPen( QtCore.Qt.black, 2)
        pencil.setStyle( QtCore.Qt.SolidLine )

        # pencil.setStyle( QtCore.Qt.UpArrow )
        scene.addLine( QtCore.QLineF( 0, 0, 100, 100 ), pencil )

if ( __name__ == '__main__' ):
    app = QtGui.QApplication([])
    f = MyFrame()
    f.show()
    app.exec_()

绘制此窗口:

enter image description here

如何将箭头添加到线的一端,因为我使用图像编辑器绘制最后一个图像:

enter image description here

我找到了这个带有这个伪代码的C ++ http://www.codeproject.com/Articles/3274/Drawing-Arrows教程:

// ARROWSTRUCT
//
// Defines the attributes of an arrow.
typedef struct tARROWSTRUCT {
    int nWidth;     // width (in pixels) of the full base of the arrowhead
    float fTheta;   // angle (in radians) at the arrow tip between the two
                    //  sides of the arrowhead
    bool bFill;     // flag indicating whether or not the arrowhead should be
                    //  filled
} ARROWSTRUCT;

// ArrowTo()
//
// Draws an arrow, using the current pen and brush, from the current position
//  to the passed point using the attributes defined in the ARROWSTRUCT.
void ArrowTo(HDC hDC, int x, int y, ARROWSTRUCT *pArrow);
void ArrowTo(HDC hDC, const POINT *lpTo, ARROWSTRUCT *pArrow);
  

只需用所需属性填充ARROWSTRUCT,确保当前DC位置正确(MoveTo()等),然后调用两个ArrowTo()函数之一。尺寸参数(nWidth和fTheta)定义如下:

     

技术

     

这可以追溯到高中代数和三角学。 ArrowTo()函数首先构建整行的向量。然后它根据您传递的nWidth和fTheta属性计算箭头边的点。 Badda-boom-badda-bing,你有箭头。

     

这里有一些伪伪代码:

lineVector = toPoint - fromPoint
lineLength = length of lineVector

// calculate point at base of arrowhead
tPointOnLine = nWidth / (2 * (tanf(fTheta) / 2) * lineLength);
pointOnLine = toPoint + -tPointOnLine * lineVector

// calculate left and right points of arrowhead
normalVector = (-lineVector.y, lineVector.x)
tNormal = nWidth / (2 * lineLength)
leftPoint = pointOnLine + tNormal * normalVector
rightPoint = pointOnLine + -tNormal * normalVector

此外,我还可以找到另一个问题Drawing a polygon in PyQt,但它适用于qt5。因此,它是在pyqt4中用多边形绘制箭头的更好方法吗?

0 个答案:

没有答案