创建文本轮QT / PYQT

时间:2015-07-03 23:44:03

标签: c++ qt python-2.7 pyqt visualization

您好我正在使用networkX的圆形布局创建节点的网络诊断图。 它很好地在一个圆圈中布置节点但是我想向每个节点添加文本(描述)但文本不能重叠,所以它仍然可读 像这样textwheel。注意所有文本如何从每个节点向外伸出。 我怎么能这样做。我使用pyqt / qt并且我知道painter.rotate方法,但我不能进行固定旋转,这是锻炼每个节点正确旋转的最佳方法。描述。 我在Qgraphicsscene上绘制节点,因此我可以获得场景的boundingRect,并获得场景的中心。我还可以通过NetworkX的环形布局获取每个节点的位置作为输出。获得2分是一个开始。我不确定那之后最好的前进方向是什么。 如果有几篇论文展示了一个很好的解决方案,请告诉我。 另外一个问题是节点本身可以​​由用户移动。但我想,一旦我弄清楚如何绘制文本,我可以在用户移动节点本身的情况下应用相同的公式/方法。 只需要一种通用的方法来计算节点中心相对于图形中心的角度。 如果有代码示例可以指向正确的方向,请分享。

由于

1 个答案:

答案 0 :(得分:1)

通常,文本的旋转与用于在文本的矩形上定位参考点的半径的旋转相同。

下面的代码演示了如何使用painter转换轻松实现所需的结果。文本对齐技巧的灵感来自this answer

screenshot of the example

import sys
from PyQt5.QtCore import QRect, QRectF, QSizeF, QPointF, Qt
from PyQt5.QtGui import QPainter, QPicture, QFont, QColor
from PyQt5.QtWidgets import QApplication, QLabel

def drawNode(painter, angle, radius, text):
    size = 32767.0;
    painter.save();
    painter.rotate(-angle);
    painter.translate(radius, 0);
    painter.drawText(QRectF(0, -size/2.0, size, size), Qt.AlignVCenter, text);
    painter.restore();

if __name__ == "__main__":
    app = QApplication(sys.argv)

    pic = QPicture()
    pic.setBoundingRect(QRect(-100, -100, 200, 200))
    p = QPainter(pic)

    p.drawEllipse(0, 0, 3, 3)
    p.setFont(QFont("Helvetica", 25))
    for angle in range(0, 359, 30):
        drawNode(p, angle, 50, str(angle))
    p.end()

    l = QLabel()
    l.setPicture(pic);
    l.show();

    sys.exit(app.exec_())