Pyside6能够滚动的折线图
import sys
import random
from PySide6.QtWidgets import QApplication, QGraphicsView, QGraphicsScene, QGraphicsItem
from PySide6.QtCore import Qt, QPointF, QRectF
from PySide6.QtGui import QPainter, QPen, QColor, QFont
class ScrollableLineGraph(QGraphicsItem):
def __init__(self, data):
super().__init__()
self.data = data
self.current_start = 0
self.bounding_rect = QRectF(0, 0, 600, 450)
def boundingRect(self):
return self.bounding_rect
def paint(self, painter, option, widget):
painter.setRenderHint(QPainter.Antialiasing)
axis_pen = QPen(QColor(128, 128, 128))
line_pen = QPen(QColor(0, 0, 255))
text_font = QFont()
text_font.setPixelSize(10)
# 绘制X轴
painter.setPen(axis_pen)
painter.drawLine(0, 450, 600, 450)
# X轴刻度和数值
for i in range(0, 50, 5):
x = (i - self.current_start) * 12
if 0 <= x < 600:
painter.drawLine(x, 450, x, 455)
painter.drawText(x - 5, 465, str(i + self.current_start))
# 绘制Y轴
painter.drawLine(0, 0, 0, 450)
# Y轴刻度和数值
for i in range(0, 11):
y = 450 - 45 * i
painter.drawLine(-5, y, 0, y)
painter.drawText(-20, y - 5, str(i * 10))
# 添加X轴和Y轴的文本标签
painter.setFont(text_font)
painter.drawText(610, 460, "Time")
painter.rotate(-90)
painter.drawText(-10, 10, "Value")
painter.rotate(90)
# 绘制折线图
painter.setPen(line_pen)
last_point = QPointF(0, 450 - 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) * 12
y = 450 - self.data[i]
painter.drawLine(last_point, QPointF(x, y))
last_point = QPointF(x, y)
def scroll_right(self):
self.current_start = min(len(self.data) - 50, self.current_start + 1)
self.update()
def scroll_left(self):
self.current_start = max(0, self.current_start - 1)
self.update()
class LineGraphView(QGraphicsView):
def __init__(self, data):
super().__init__()
self.scene = QGraphicsScene(self)
self.setScene(self.scene)
self.data_graph = ScrollableLineGraph(data)
self.scene.addItem(self.data_graph)
self.setRenderHint(QPainter.Antialiasing)
self.setFixedSize(800, 600)
self.setSceneRect(0, 0, 600, 450)
self.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded)
def wheelEvent(self, event):
if event.angleDelta().y() > 0:
self.data_graph.scroll_left()
else:
self.data_graph.scroll_right()
super().wheelEvent(event)
if __name__ == "__main__":
app = QApplication(sys.argv)
data = [random.randint(0, 400) for _ in range(300)]
graph_view = LineGraphView(data)
graph_view.show()
sys.exit(app.exec())