当前位置: 代码网 > it编程>编程语言>C/C++ > PyQt6+pyqtgraph折线图绘制显示功能

PyQt6+pyqtgraph折线图绘制显示功能

2024年11月28日 C/C++ 我要评论
1、实现效果2、环境:确认已经安装pyqtgraph的模块,如果没有安装,使用命令安装:pip install pyqtgraph3、代码实现:绘制折线函数:import sysimport rand

1、实现效果

2、环境:

确认已经安装pyqtgraph的模块,如果没有安装,使用命令安装:

pip install pyqtgraph

3、代码实现:

绘制折线函数:

import sys
import random
from pyside6.qtwidgets import qapplication, qgraphicsview, qgraphicsscene, qgraphicsitem
from pyside6.qtcore import qt, qpointf, qrectf, qtimer
from pyside6.qtgui import qpainter, qpen, qcolor, qfont
class scrollablelinegraph(qgraphicsitem):
    def __init__(self, data):
        """
        初始化线图项,设置初始显示范围和数据
        :param data: 要显示的数据列表
        """
        super().__init__()
        self.data = data
        self.current_start = 0  # 当前显示的起始索引
        self.bounding_rect = qrectf(0, 0, 900, 200)  # 线图的边界矩形
    def boundingrect(self):
        """
        返回线图的边界矩形,用于确定绘制区域
        :return: 矩形边界
        """
        return self.bounding_rect
    def paint(self, painter, option, widget):
        """
        绘制线图,包括坐标轴、刻度和数据线
        :param painter: 绘制工具
        :param option: 绘制选项
        :param widget: 关联的窗口部件
        """
        painter.setrenderhint(qpainter.antialiasing)  # 开启抗锯齿
        axis_pen = qpen(qcolor(255, 255, 255))  # 坐标轴线颜色
        line_pen = qpen(qcolor(255, 0, 0))  # 数据线颜色
        text_font = qfont()  # 字体设置
        # 绘制x轴
        painter.setpen(axis_pen)
        painter.drawline(0, 200, 900, 200)
        # 绘制x轴刻度和标签
        for i in range(0, 20, 1):
            x = (i - self.current_start) * 45
            if 0 <= x < 900:
                painter.drawline(x, 200, x, 210)
                painter.drawtext(x - 5, 220, str(i + self.current_start))
        # 绘制y轴
        painter.drawline(0, 0, 0, 200)
        # 绘制y轴刻度和标签
        for i in range(0, 5):
            y = 200 - 45 * i
            painter.drawline(-5, y, 0, y)
            painter.drawtext(-20, y - 5, str(i * 20))  #10:表示y坐标值间隔大小
        # 绘制y轴刻度和标签,给每个标签添加上横向网格,网格为点状虚线
        for i in range(0, 5):
            y = 200 - 45 * i
            # 网格为点状虚线
            painter.setpen(qpen(qcolor(128, 128, 128), 0.5, qt.dashline))
            # painter.drawline(-5, y, 0, y)
            # painter.drawtext(-20, y - 5, str(i * 10))
            painter.drawline(0, y, 900, y)
        # 假设已经初始化了painter对象等必要的准备工作
        # 定义一些常量,提高代码的可读性
        canvas_height = 200
        scale_factor = 45
        label_offset = -20
        grid_line_width = 0.5
        grid_line_color = qcolor(128, 128, 128)
        grid_line_style = qt.dashline
        max_labels = 10
        # 新增:封装绘制网格线和刻度标签的函数
        def draw_scale_and_grid(painter, y_position, label):
            """
            绘制y轴刻度和标签以及对应的横向网格线
            :param painter: qpainter对象,用于绘制
            :param y_position: y轴位置
            :param label: 刻度标签的文本
            """
            try:
                # 绘制网格线
                painter.setpen(qpen(grid_line_color, grid_line_width, grid_line_style))
                painter.drawline(-5, y_position, 0, y_position)
                # 绘制刻度标签
                painter.drawtext(-label_offset, y_position - 5, label)
                # 绘制右侧网格线
                painter.drawline(0, y_position, 900, y_position)
            except exception as e:
                print(f"error during drawing scale and grid: {e}")
        # 主绘制逻辑
        try:
            for i in range(max_labels + 1):  # 由于范围是从0到10,因此循环次数应为max_labels + 1
                y = canvas_height - scale_factor * i
                # 检查y位置是否在画布内,若不在则跳过
                if y < 0:
                    break
                label = str(i * 10)
                # draw_scale_and_grid(painter, y, label)
        except exception as e:
            print(f"unexpected error occurred: {e}")
        # 假设在这段代码的末尾,有适当的资源释放逻辑,例如painter对象的销毁等
        # 设置字体
        painter.setfont(text_font)
        # 绘制x轴和y轴标签
        painter.drawtext(900, 205, "time")
        painter.rotate(-90)
        painter.drawtext(-30,10, "value")
        painter.rotate(90)
        # 绘制数据线
        painter.setpen(line_pen)
        painter.setrenderhint(qpainter.smoothpixmaptransform)
        last_point = qpointf(0, 200 - self.data[self.current_start])
        for i in range(self.current_start, min(self.current_start + 50, len(self.data))):
            x = (i - self.current_start) * 45
            y = 200 - self.data[i]
            painter.drawline(last_point, qpointf(x, y))
            last_point = qpointf(x, y)

在qt designer的widget页面添加graphics view,命名为graphicsview

在页面类中定义图表初始化和数据更新方法:

  def graphwidget_uiinit(self):
    data = []
    scene = qgraphicsscene(self.graphicsview)
    self.graphicsview.setscene(scene)
    self.data_graph = scrollablelinegraph(data)
    scene.additem(self.data_graph)
    scene.setbackgroundbrush
    self.graphicsview.setrenderhint(qpainter.antialiasing)
    self.graphicsview.setfixedsize(960, 240)
    self.graphicsview.setscenerect(0, 0, 900, 220)
    self.graphicsview.sethorizontalscrollbarpolicy(qt.scrollbarasneeded)
    # # 设置定时器,用于动态更新数据
    # self.timer = qtimer(self)
    # self.timer.timeout.connect(self.update_data)
    # self.timer.start(60)  # 每500毫秒触发一次
  def update_data(self):
    #随机数据
    # new_data = random.randint(0, 100)
    # self.data_graph.data.append(new_data)
    #将字符串数据转换成int类型的列表数据
    datastr8 = "100 30 178 100 69 60 98 98 79 50 30 20 29 58 69 39 98 29 32"
    list_from_string8 = datastr8.split()
    number_list8 = list(map(int, list_from_string8))
    self.data_graph.data = number_list8
    self.data_graph.current_start = max(0, len(self.data_graph.data) - 50)
    self.data_graph.update()

参考资料:

https://blog.csdn.net/hyd_csdn/article/details/140644014

到此这篇关于pyqt6+pyqtgraph折线图绘制显示的文章就介绍到这了,更多相关pyqt6 pyqtgraph折线图绘制内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com