图例标记由图标和标签组成。QChart中QLegendMarker类可用于访问图例中的标记,因此可以对图例标记进行交互和控制。
QLegendMarker类是一个抽象对象,可用于访问图例中的标记。图例标记由图标和标签组成。图标颜色对应于用于绘制系列的颜色,标签显示系列的名称(或饼图系列的切片标签或柱状系列的条形标签)。图例标记始终与一个系列,切片或柱状系列集相关。
QLegendMarker常用函数:
枚举量QLegend. LegendMarkerType控制不同图表序列的标记样式:
QLegendMarker常用信号:
在此示例中,我们创建一个使用QLegendMarker单击信号显示/隐藏图表中相应序列的应用程序。完整代码如下:
- import sys,math
- from PyQt5.QtCore import Qt, QPointF, pyqtSignal
- from PyQt5.QtGui import QPainter, QBrush, QColor, QPen
- from PyQt5.QtWidgets import (QApplication, QMainWindow)
- from PyQt5.QtChart import QChart, QChartView, QLineSeries, QLegendMarker
-
- class DemoLegendMarker(QMainWindow):
- def __init__(self, parent=None):
- super(DemoLegendMarker, self).__init__(parent)
-
- # 设置窗口标题
- self.setWindowTitle('实战 Qt for Python: QChart图例标记演示')
- # 设置窗口大小
- self.resize(720, 480)
-
- self.initUi()
-
- def initUi(self):
- #创建图表和图标视图
- self.chart = QChart()
- chartView = QChartView(self.chart)
-
- self.series = []
-
- #添加一些曲线
- self.addSeries()
- self.addSeries()
- self.addSeries()
- self.addSeries()
-
- self.connectMarkers()
-
- #设置标题和显示图例
- self.chart.setTitle('图例标记示例(点击图例)')
- self.chart.legend().setVisible(True)
- self.chart.legend().setAlignment(Qt.AlignBottom)
-
- chartView.setRenderHint(QPainter.Antialiasing)
- self.setCentralWidget(chartView)
-
- def addSeries(self):
- line = QLineSeries()
- self.series.append(line)
-
- line.setName('line' + str(len(self.series)))
-
- #构建一些正弦波数据
- data = []
- offset = len(self.chart.series())
- for i in range(360):
- x = offset * 20 + i
- data.append(QPointF(i, math.sin(x * math.pi / 180)))
-
- line.append(data)
- self.chart.addSeries(line)
-
- if len(self.series) == 1:
- self.chart.createDefaultAxes()
-
- '''
- def removeSeries(self):
- #从图表中移除最后一条曲线
- if len(self.series) > 0 :
- line = self.series[-1]
- self.chart.removeSeries(line)
- self.series.remove(line)
- del line
- '''
-
- def connectMarkers(self):
- #连接所有标记到控制句柄
- markers = self.chart.legend().markers()
- for marker in markers:
- #断开可能的现有连接,以避免多个连接????
- #marker.clicked.disconnect(self.handleMarkerClicked)
- marker.clicked.connect(self.handleMarkerClicked)
- pass
-
- def handleMarkerClicked(self):
- marker = self.sender()
- if marker.type() == QLegendMarker.LegendMarkerTypeXY:
- #切换曲线的可见属性
- marker.series().setVisible(not marker.series().isVisible())
- #把图例标记设置为可见,因为隐藏曲线时同时也会隐藏图例标记,但这里我们希望显示出来。
- marker.setVisible(True)
-
- #=== 半透明设置 ===#
- alpha = 1.0
-
- #如果曲线不可见,则需要定义标记的尺寸大小
- if not marker.series().isVisible():
- alpha = 0.5
-
- brush = marker.labelBrush()
- color = brush.color()
- color.setAlphaF(alpha)
- brush.setColor(color)
- marker.setLabelBrush(brush)
-
- brush = marker.brush()
- color = brush.color()
- color.setAlphaF(alpha)
- brush.setColor(color)
- marker.setBrush(brush)
-
- pen = marker.pen()
- color = pen.color()
- color.setAlphaF(alpha)
- pen.setColor(color)
- marker.setPen(pen)
-
-
- if __name__ == '__main__':
- app = QApplication(sys.argv)
- window = DemoLegendMarker()
- window.show()
- sys.exit(app.exec())
运行结果如下图:

QChart图例标记演示