如何为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
相关产品推荐
相关产品推荐

