Pyqt结合matplotlib实现图表的基本交互在左右移动时图形完整,上下移动时图形会发生形变
时间: 2024-12-16 07:20:20 浏览: 12
在PyQt和Matplotlib结合时,要实现在窗口大小调整时保持图形完整不发生变形,你可以使用`QGraphicsView`和`QGraphicsScene`。`QGraphicsView`负责显示图形,而`QGraphicsScene`则是图形的容器,它可以管理图形的位置和大小。
首先,你需要确保你的图表(在这里假设是`Axes`对象)被添加到`QGraphicsScene`中,而不是直接画在`matplotlib.figure.Figure`上。然后,当窗口大小改变时,通过重写`QGraphicsView`的`resizeEvent`方法,更新`QGraphicsScene`的大小,从而保持图形的比例不变。
以下是一个简单的示例:
```python
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget
from PyQt5.QtGui import QPainter, QResizeEvent
from PyQt5.QtCore import Qt
import matplotlib.pyplot as plt
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
class MplWindow(QWidget):
def __init__(self):
super().__init__()
self.figure = plt.figure()
self.canvas = FigureCanvas(self.figure)
self.view = QGraphicsView(self.canvas)
layout = QVBoxLayout()
layout.addWidget(self.view)
self.setLayout(layout)
# 将图形添加到QGraphicsScene中
scene = QGraphicsScene()
scene.addItem(self.canvas)
self.view.setScene(scene)
self.view.resizeEvent = self.resize_event
def resize_event(self, event: QResizeEvent) -> None:
# 更新图形场景的大小,使图像比例不变
new_width = event.size().width()
new_height = event.size().height()
width_ratio = new_width / self.view.width()
height_ratio = new_height / self.view.height()
if width_ratio != height_ratio: # 如果宽高比不同,则等比例缩放
scale_factor = min(width_ratio, height_ratio)
else:
scale_factor = 1
scene_size = self.figure.get_size_inches() * self.figure.dpi
scene_size = (scene_size[0] * scale_factor, scene_size[1] * scale_factor)
self.canvas.setSceneRect(0, 0, *scene_size)
if __name__ == "__main__":
app = QApplication(sys.argv)
main_win = MplWindow()
main_win.show()
sys.exit(app.exec_())
```
在这个例子中,窗口大小改变时,`resize_event`会被调用,计算合适的缩放因子并更新`QGraphicsScene`的大小。这将使得图表始终保持其原始的比例,不会在垂直方向上发生变形。
阅读全文