1.鼠标和按键操作
要对一个QChart图表进行鼠标和按键操作,需要在QChartView类里对鼠标和按键事件进行处理,这就需要自定义一个从QChartView继承的类,对需要处理的鼠标和按键事件进行处理。
QChartView.setDragMode()函数将视图组件鼠标拖动选择放手设置为“橡皮框”形式,即
self.setDragMode(QGraphicsView.RubberBandDrag)
这样在图表上按下鼠标左键框选时,随着鼠标拖动会显示一个矩形选择框。
1. keyPressEvent(event)是键盘按键按下时触发的事件函数,从event.key()获得按下按键的名称,判断按键然后做出缩放、移动等操作。
QChart有以下几个用于缩放和移动的函数:
zoom(factor)函数:对图表整个县市区的内容进行缩放,float型参数factor大于1表示放大,小于1表示缩小,缩放后坐标轴范围会自动变化。
zoomIn()函数:放大图表,放大因子为2。
zoomOut()函数:缩小图表,缩小因子为2。
zoomIn(rect)函数:参数rect是QRectF类型对象,表示一个矩形框,次函数的功能是放大显示rect表示的矩形区域。
zoomReset()函数:取消所有缩放变化,恢复图表原始的大小。
scroll(dx, dy)函数:参数dx和dy都是float型,表示评议的像素值。
2. QChart序列
1. QScatterSeries序列
QScatterSeries是显示散点的序列,它的接口函数可以设置散点的形状、大小、填充颜色和边框颜色。QScatterSeries.setMarkerShape(shape)用于设置散点形状,参数shape是枚举类型,QScatterSeries.MarkerShape只有以下两种取值:
QScatterSeries.MarkerShapeCircle(圆形散点)
QScatterSeries.MarkerShapeRectangle(方形散点)
虽然只有两种散点形状,但是可以通过填充颜色、边框颜色等构成多种不同的散点,也可以通过Graphic View结果的绘图功能自定义散点形状。
2. QSplineSeries序列
QSplineSeries的父类是QLineSeries,其接口函数与QLineSeries完全相同,只是绘制曲线的方式不同。QLineSeries是将相邻数据点用直线连接,而QSplineSeries根据数据点做了插值,使曲线变得光滑。
3. hovered()信号和clicked()信号
QSplineSeries、QLineSeries和QScatterSeries这三个类都是从QXYSeries继承来的,在QXYSeries类中定义了以下两个比较有用的信号。
信号hovered(point, state)在鼠标移动到序列上或离开序列时发射。QPointF类型的参数point就是序列上的点的数据坐标,bool性参数state表示进入(True)或是离开(False)。
信号clicked(point)在单击序列上的点时发射,QPointF类型的参数point就是序列上的点的数据坐标。
4. 创建默认坐标轴
QChart.createDefaultAxes()函数用于创建默认的坐标轴,创建的默认坐标轴会自动与已经添加的序列关联,这与前面两个示例创建坐标轴的方式不同。创建的默认坐标轴可以通过QChart的axisX()和axisY()访问,仍然可以设置坐标轴的范围、标题等属性。
因为序列时基于数据点的,所以创建的默认坐标轴是QValueAxis,这里还调用了QValueAxis.applyNiceNumbers()函数自动调整坐标轴范围和分度个数,以使得坐标轴看起来更美观。
5. QLegendMarker的使用
函数__createChart中的代码:
for marker in chart.legend().markers():
marker.clicked.connect(self.do_LegendMarkerClicked)
图表添加序列后会自动创建图例,QLegend.markers()函数返回的是一个列表,列表元素是QLegendMarker类型的对象。QLegendMarker对象就是图例上与每个序列关联的小色块和文字,QLegendMarker的接口函数可以控制图例上的显示效果。QLegendMarker类的主要接口函数如下:
setVisible() 设置图例标记的可见性
setLabel() 设置标签,即图例中的序列的名称
setFont() 设置标签的字体
series() 返回关联的序列
type() 返回图例标记的类型,返回值类型是枚举类型QLegendMarker.LegendMarkerType
QLegendMarker.type()函数返回图例标记的类型,其返回值是枚举类型QLegendMarker.LegendMarkerType,此枚举类型的取值与序列类型的关系如下所示(表中表示枚举类型及其取值时省略了前缀“QLegendMarker.”):
LegendMarkerType枚举类型取值 | 对应的序列类 |
LegendMarkerTypeArea | QAreaSeries |
LegendMarkerTypeBar |
QBarSeries和QHorizontalBarSeries QStackedBarSeries和QHorizontalStackedBarSeries QPercentBarSeries和QHorizontalPercentBarSeries |
LegendMarkerTypePie | QPieSeries |
LegendMarkerTypeXY | QSplineSeries、QLineSeries和QScatterSeries |
LegendMarkerTypeBoxPlot | QBoxPlotSeries |
LegendMarkerTypeCandlestick | QCandlestickSeries |