如何在 matplotlib 画布上动态设置轮廓边框?

时间:2021-07-15 15:35:53

标签: python matplotlib pyqt pyqt5

我在 PyQt5 GUI 上有 9 个由 matplotlib 绘制的画布,可以在这里看到:

GUI

画布是动态生成的:

class Canvas(FigureCanvas):
    def __init__(self, parent=None):
        super().__init__(Figure(figsize=(5, 3)))
        self.setParent(parent)
        self.mpl_connect("button_press_event", self.on_press)

    def on_press(self, event):
        print(self, event)

canvas = Canvas()
ax = canvas.figure.subplots()
ax.plot(x, y_leak, '--rs', label='Y_leak')
ax.plot(x, y_lin, '-g*', label='Y_lin')
ax.plot(x, y_sat, ':bo', label='Y_sat')
ax.legend()

我的问题是如何在调用 on_press 事件时为每个画布设置画布的轮廓边框,如下所示。:
like this.

1 个答案:

答案 0 :(得分:2)

Qt 实现的一个解决方案是使用一个标志来指示画布是否被按下,然后使用该信息绘制边框并覆盖paintEvent 方法。

class Canvas(FigureCanvas):
    def __init__(self, parent=None):
        super().__init__(Figure(figsize=(5, 3)))
        self.setParent(parent)
        self.mpl_connect("button_press_event", self.on_press)
        self._draw_border = False

    def on_press(self, event):
        self._draw_border = True
        self.update()

    def paintEvent(self, event):
        super().paintEvent(event)
        if self._draw_border:
            painter = QPainter(self)
            pen_width = 5
            painter.setPen(QPen(QColor("#00ff00"), 2 * pen_width))
            painter.drawRect(self.rect())