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