PyQT - 画网络拓扑图(QGraphicsScene/QGraphicsView)

5 篇文章 8 订阅

通过QGraphicsScene/QGraphicsView画网络拓扑图,代码如下:

    def create_network_topology(self):
        """
        :description
            - 设置办物理路径区域的网络拓扑图
        :parameters
            - None
        :versions
            - Added by gkk in 20201117: 添加该函数,并添加基本功能
        """
        self.graph_scene = QGraphicsScene()    //先创建场景 (scene)
        self.graph_view = QgraphicsView()      //再创建视图(view)

        # 半物理路径区域拓扑图初始化显示
        item1_x = 0
        item1_y = 70
        item2_x = 500
        item2_y = 70
        item3_x = 250
        item3_y = 0
        item4_x = 250
        item4_y = 140
        radius = 12

        # 添加交换机
        item1 = self.graph_scene.addEllipse(item1_x, item1_y, radius, radius, QPen(Qt.black), QBrush(QColor(Qt.blue)))
        item2 = self.graph_scene.addEllipse(item2_x, item2_y, radius, radius, QPen(Qt.black), QBrush(QColor(Qt.blue)))
        item3 = self.graph_scene.addEllipse(item3_x, item3_y, radius, radius, QPen(Qt.black), QBrush(QColor(Qt.blue)))
        item4 = self.graph_scene.addEllipse(item4_x, item4_y, radius, radius, QPen(Qt.black), QBrush(QColor(Qt.blue)))

        # 添加线
        line_pen = QPen(Qt.blue)
        line_pen.setWidth(3)
        l1 = self.graph_scene.addLine(item1_x + radius/2, item1_y + radius/2, item3_x + radius/2, item3_y + radius/2, line_pen)
        l2 = self.graph_scene.addLine(item3_x + radius/2, item3_y + radius/2, item2_x + radius/2, item2_y + radius/2, line_pen)
        l3 = self.graph_scene.addLine(item1_x + radius/2, item1_y + radius/2, item4_x + radius/2, item4_y + radius/2, line_pen)
        l4 = self.graph_scene.addLine(item4_x + radius/2, item4_y + radius/2, item2_x + radius/2, item2_y + radius/2, line_pen)

        self.switch_item['sw1'] = item1
        self.switch_item['sw2'] = item2
        self.switch_item['sw3'] = item3
        self.switch_item['sw4'] = item4
        # {('sw1', 'sw3'): None, ('sw3', 'sw2'): None, ('sw1', 'sw4'): None, ('sw4', 'sw2'): None}
        self.line_item[('sw1', 'sw3')] = l1
        self.line_item[('sw3', 'sw2')] = l2
        self.line_item[('sw1', 'sw4')] = l3
        self.line_item[('sw4', 'sw2')] = l4

        # 添加交换机名称
        text1 = self.graph_scene.addSimpleText('sw1')
        text2 = self.graph_scene.addSimpleText('sw2')
        text3 = self.graph_scene.addSimpleText('sw3')
        text4 = self.graph_scene.addSimpleText('sw4')

        text1_pos = QPointF(item1_x, item1_y+radius)
        text1.setPos(text1_pos)

        text2_pos = QPointF(item2_x, item2_y+radius)
        text2.setPos(text2_pos)

        text3_pos = QPointF(item3_x, item3_y+radius)
        text3.setPos(text3_pos)

        text4_pos = QPointF(item4_x, item4_y-radius)
        text4.setPos(text4_pos)

        # 添加图示标注
        text5 = self.graph_scene.addSimpleText('绿色线 表示当前路由')
        text5.setPen(QPen(Qt.black))
        text5_pos = QPointF(400, 0)
        text5.setPos(text5_pos)

画出的网络拓扑图如下所示:

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
QGraphicsScene、QGraphicsItem和QGraphicsView可以用来绘制标尺。下面是一个示例代码,演示了如何使用这些类来实现标尺的绘制[^1]: ```python from PyQt5.QtWidgets import QGraphicsScene, QGraphicsView, QGraphicsLineItem, QApplication from PyQt5.QtCore import Qt, QPointF class RulerScene(QGraphicsScene): def __init__(self, parent=None): super().__init__(parent) self.setSceneRect(0, 0, 500, 100) # 绘制水平标尺 for i in range(0, 501, 50): line = QGraphicsLineItem(i, 0, i, 10) self.addItem(line) text = self.addText(str(i)) text.setPos(i - text.boundingRect().width() / 2, 15) # 绘制垂直标尺 for i in range(0, 101, 10): line = QGraphicsLineItem(0, i, 10, i) self.addItem(line) text = self.addText(str(i)) text.setPos(15, i - text.boundingRect().height() / 2) class RulerView(QGraphicsView): def __init__(self, parent=None): super().__init__(parent) self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.setRenderHint(QPainter.Antialiasing) self.setDragMode(QGraphicsView.ScrollHandDrag) self.setTransformationAnchor(QGraphicsView.AnchorUnderMouse) self.setResizeAnchor(QGraphicsView.AnchorUnderMouse) self.setInteractive(True) if __name__ == '__main__': import sys app = QApplication(sys.argv) scene = RulerScene() view = RulerView(scene) view.show() sys.exit(app.exec_()) ``` 这段代码创建了一个自定义的QGraphicsScene子类RulerScene,用于绘制标尺。在RulerScene的构造函数中,我们设置了场景的大小,并使用QGraphicsLineItem和QGraphicsTextItem来绘制水平和垂直的标尺线和标签。然后,我们创建了一个自定义的QGraphicsView子类RulerView,用于显示场景。在RulerView的构造函数中,我们设置了一些视图的属性,例如滚动条策略、渲染提示、拖动模式等。最后,我们创建了一个QApplication实例,将RulerScene和RulerView关联起来,并显示出来。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值