You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为pyqtgraph创建带选择工具的悬浮窗口以高亮区域?

PyQtGraph实现图形选择工具方案

当然可以实现!PyQtGraph自带的ROI(感兴趣区域)组件完全能满足你的需求——创建带矩形、圆形工具的悬浮窗口,并且获取选择区域的坐标范围。

实现思路

  • 用PyQt的QToolBar做悬浮工具窗口,放置切换不同选择工具的按钮
  • 利用PyQtGraph内置的RectROI、CircleROI组件在图表上绘制选择形状
  • 通过ROI的sigRegionChanged信号,实时获取其覆盖的坐标范围

完整示例代码

from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import sys
import pyqtgraph as pg
import numpy as np

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        # 创建图表组件
        self.plotWidget = pg.PlotWidget(title="图形选择工具演示")
        self.setCentralWidget(self.plotWidget)
        
        # 生成测试数据并绘制三条曲线
        x = np.arange(1000)
        y = np.random.normal(size=(3, 1000))
        self.plotWidget.plot(x, y[0], pen='r')
        self.plotWidget.plot(x, y[1], pen='g')
        self.plotWidget.plot(x, y[2], pen='b')
        
        # 创建可悬浮的工具条
        self.toolbar = QToolBar("选择工具")
        self.addToolBar(Qt.RightToolBarArea, self.toolbar)
        self.toolbar.setFloatable(True)  # 允许悬浮
        self.toolbar.setMovable(True)    # 允许拖动
        
        # 添加工具按钮
        self.rect_btn = QAction("矩形选择", self)
        self.rect_btn.triggered.connect(lambda: self.add_roi("rect"))
        self.toolbar.addAction(self.rect_btn)
        
        self.circle_btn = QAction("圆形选择", self)
        self.circle_btn.triggered.connect(lambda: self.add_roi("circle"))
        self.toolbar.addAction(self.circle_btn)
        
        self.clear_btn = QAction("清除选择", self)
        self.clear_btn.triggered.connect(self.clear_roi)
        self.toolbar.addAction(self.clear_btn)
        
        # 存储当前选中的ROI
        self.current_roi = None

    def add_roi(self, roi_type):
        # 先清除之前的选择区域
        self.clear_roi()
        
        # 根据选择类型创建对应ROI,初始位置和大小可自定义
        if roi_type == "rect":
            self.current_roi = pg.RectROI((100, -2), (200, 4), pen=(0, 9))
        elif roi_type == "circle":
            self.current_roi = pg.CircleROI((300, -2), (200, 4), pen=(2, 9))
        
        # 将ROI添加到图表,并绑定坐标更新信号
        self.plotWidget.addItem(self.current_roi)
        self.current_roi.sigRegionChanged.connect(self.get_roi_coords)

    def get_roi_coords(self):
        # 获取ROI的场景坐标系边界,再转换为图表数据坐标系
        bounds = self.current_roi.boundingRect()
        x_min, y_min = self.plotWidget.getViewBox().mapSceneToView(bounds.topLeft())
        x_max, y_max = self.plotWidget.getViewBox().mapSceneToView(bounds.bottomRight())
        
        # 打印坐标范围,实际使用时可替换为业务逻辑
        print(f"选择区域坐标范围:")
        print(f"X轴: [{x_min:.2f}, {x_max:.2f}]")
        print(f"Y轴: [{y_min:.2f}, {y_max:.2f}]")

    def clear_roi(self):
        # 清除当前ROI
        if self.current_roi is not None:
            self.plotWidget.removeItem(self.current_roi)
            self.current_roi = None

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec())

代码关键点说明

  • 悬浮工具条:QToolBar支持浮动和拖动,满足悬浮窗口需求
  • ROI组件:RectROI和CircleROI支持拖拽调整大小和位置,自带样式
  • 坐标获取:通过mapSceneToView将场景坐标系转换为图表的实际数据坐标系,确保坐标准确
  • 交互逻辑:每次选择新工具时自动清除旧ROI,避免重叠

内容的提问来源于stack exchange,提问作者CiaranWelsh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 01:46:07