【问题标题】:creating a text wheel QT/PYQT创建文本轮 QT/PYQT
【发布时间】:2015-09-21 19:14:52
【问题描述】:

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

谢谢

【问题讨论】:

  • 你知道节点坐标和节点圆心坐标吗?

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


【解决方案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_())

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-06
    相关资源
    最近更新 更多