Pyside6绘制折线图并计算面积
import sys
import random
from PySide6.QtWidgets import QApplication, QWidget, QVBoxLayout, QMainWindow
from PySide6.QtCore import Qt, QRectF, QPointF, Signal
from PySide6.QtGui import QPainter, QPen, QColor, QMouseEventclass PlotArea(QWidget):area_calculated = Signal(float) # 定义一个信号,用于传递计算的面积def __init__(self, parent=None):super().__init__(parent)self.data = [random.random() * 100 for _ in range(100)] # 生成随机数据self.start_index = Noneself.end_index = Nonedef paintEvent(self, event):painter = QPainter(self)painter.setRenderHint(QPainter.Antialiasing)painter.fillRect(event.rect(), Qt.white)# 绘制折线图pen = QPen(QColor(0, 0, 255))painter.setPen(pen)last_point = Nonefor i, value in enumerate(self.data):x = i * (self.width() / len(self.data))y = self.height() - (value * (self.height() / 100))point = QPointF(x, y)if last_point:painter.drawLine(last_point, point)last_point = point# 绘制选中区域if self.start_index is not None and self.end_index is not None:start_x = self.start_index * (self.width() / len(self.data))end_x = self.end_index * (self.width() / len(self.data))rect = QRectF(start_x, 0, end_x - start_x, self.height())painter.fillRect(rect, QColor(255, 0, 0, 50))def mousePressEvent(self, event: QMouseEvent):if event.button() == Qt.LeftButton:x = int(event.x() / (self.width() / len(self.data)))self.start_index = xself.end_index = xself.update()def mouseMoveEvent(self, event: QMouseEvent):if event.buttons() & Qt.LeftButton:x = int(event.x() / (self.width() / len(self.data)))self.end_index = xself.update()def mouseReleaseEvent(self, event: QMouseEvent):if event.button() == Qt.LeftButton:if self.start_index is not None and self.end_index is not None:if self.start_index > self.end_index:self.start_index, self.end_index = self.end_index, self.start_indexarea = self.calculate_area(self.start_index, self.end_index)self.area_calculated.emit(area)self.start_index = Noneself.end_index = Nonedef calculate_area(self, start, end):total_area = 0for i in range(start, end + 1):height = self.data[i]width = self.width() / len(self.data)total_area += height * width / 100return total_areaclass MainWindow(QMainWindow):def __init__(self):super().__init__()self.plot_area = PlotArea(self)self.setCentralWidget(self.plot_area)self.plot_area.area_calculated.connect(self.show_area)# 主窗口大小为300x200self.setGeometry(600, 400, 500, 200)def show_area(self, area):print(f"Selected area under the curve: {area}")if __name__ == "__main__":app = QApplication(sys.argv)window = MainWindow()window.show()sys.exit(app.exec())