创建文本轮 QT/PYQT

creating a text wheel QT/PYQT

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

谢谢

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

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

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_())