QmyChartView 类的说明
QChart 和 QChartView 是基于 Graphics View 结构的绘图类。要对一个 QChart 图表进行鼠
标和按键操作,需要在 QChartView 类里对鼠标和按键事件进行处理,这就需要自定义一个
从 QChartView 继承的类。
QmyChartView 类是从 QChartView 类继承的用作图表的视图组件,实现了鼠标、按键事件
的处理,能够在鼠标移动时发射信号 mouseMove(),鼠标框选中一个矩形区域时放大显示此
区域,通过按键进行图表缩放和移动操作。
class QmyChartView(QChartView): mouseMove=pyqtSignal(QPoint)##鼠标移动 def __init__(self, parent=None): super().__init__(parent) self.setDragMode(QGraphicsView.DragMode.RubberBandDrag) self.__beginPoint=QPoint() self.__endPoint=QPoint()
在类中,定义了一个信号 mouseMove(QPoint)。在 mouseMoveEvent 里发射此信号并传递
鼠标光标处的屏幕坐标,用于在主窗口里实现鼠标在图表上移动时显示当前位置的坐标。
在构造函数中,通过 setDragMode()将视图组件鼠标拖动选择方式设置为“橡皮框”形式。这
样,在图标上按下鼠标框选时,随着鼠标拖动会显示一个矩形选择框,如图所示:
(一) 鼠标的事件函数:
def mousePressEvent(self, event):##鼠标单击 if event.button()==Qt.MouseButton.LeftButton: self.__beginPoint=event.pos() super().mousePressEvent(event) def mouseMoveEvent(self, event):##鼠标移动 point=event.pos() self.mouseMove.emit(point) super().mouseMoveEvent(event) def mouseReleaseEvent(self, event):##鼠标框选放大,右键恢复 if event.button()==Qt.MouseButton.LeftButton: self.__endPoint=event.pos() rectF=QRectF() rectF.setTopLeft(self.__beginPoint.toPointF()) rectF.setBottomRight(self.__endPoint.toPointF()) self.chart().zoomIn(rectF) elif event.button()==Qt.MouseButton.RightButton: self.chart().zoomReset()#鼠标右键释放,resetZoon
(1)mousePressEvent:在鼠标左键或右键按下时触发的事件函数。self.__beginPoint 记录
左键按下时,鼠标在视图组件中的位置。
(2)mouseMoveEvent: 鼠标在图表上移动时触发的事件函数,通过 event.pos()获取鼠标
在视图组件中的坐标 point,然后发射信号 mouseMove(point)。在使用 QmyChartView 类组 件的主窗口里,可以定义槽函数与此信号关联,通过传递的参数将视图坐标变换为图表的坐
标,从而实现鼠标光标处的坐标数值实时显示。
(3)mouseReleaseEvent:在鼠标左键或右键释放时触发的事件函数。若是鼠标左键释放,
则用 self.__endPoint 记录鼠标位置坐标。self.__beginPoint 和 self.__endPoint 就定义了鼠标
框选的矩形区域,用关联的 QChart 组件的 zoomIn(QRectF)函数对这个矩形区域进行放大。
注意这里rectF的类型是QRectF,所以需要用toPointF将__beginPoint和__endPoint从QPoint
类型转换为 QPointF 类型。
(二)键盘按键事件函数
def keyPressEvent(self, event): key=event.key() if key ==Qt.Key.Key_Plus:# + self.chart().zoom(1.2) elif key ==Qt.Key.Key_Minus:# - self.chart().zoom(0.8) elif key==Qt.Key.Key_Left: #向左 self.chart().scroll(10, 0) elif key ==Qt.Key.Key_Right:#向右 self.chart().scroll(-10, 0) elif key==Qt.Key.Key_Up:#向上 self.chart().scroll(0, -10) elif key==Qt.Key.Key_Down:#向下 self.chart(0, 10) elif key==Qt.Key.Key_PageUp:#pageup self.chart().scroll(0, -50) elif key==Qt.Key.Key_PageDown:#pagedown self.chart().scroll(0, 50) elif key ==Qt.Key.Key_Home:#home self.chart().zoomReset()
keyPressEvent 是键盘按键按下时触发的事件函数,从 event.key()可以获得按下按键的名称,
判断按键然后做出缩放、移动等动作