4. 关联图表说明与图表–节选
实现效果:点击图表说明时,相应的图表被显示或隐藏。
建立信号QLegendMarker::clicked-槽handleMarkerClicked关系
const auto markers = m_chart->legend()->markers();
for (QLegendMarker *marker : markers) {
// Disconnect possible existing connection to avoid multiple connections
QObject::disconnect(marker, &QLegendMarker::clicked,
this, &MainWidget::handleMarkerClicked);
QObject::connect(marker, &QLegendMarker::clicked, this, &MainWidget::handleMarkerClicked);
}
槽函数handleMarkerClicked实现
void handleMarkerClicked()
{
//通过关联机制获取当前点击的LegendMarker
QLegendMarker* marker = qobject_cast<QLegendMarker*> (sender());
Q_ASSERT(marker);//若LegendMarker为空,则退出
switch (marker->type())
{
//LegendMarkerType有以下几种情况:
//LegendMarkerTypeXY表示line,spline,scatter的LegendMarker
//LegendMarkerTypeArea表示area的LegendMarker
//LegendMarkerTypeBar表示bar柱状图的LegendMarker
//LegendMarkerTypePie表示pie饼状图的LegendMarker
//LegendMarkerTypeBoxPlot表示盒形图的LegendMarker
//LegendMarkerTypeCandlestick表示蜡烛图的LegendMarker
case QLegendMarker::LegendMarkerTypeXY:
{
marker->series()->setVisible(!marker->series()->isVisible());
// Turn legend marker back to visible, since hiding series also hides the marker
// and we don't want it to happen now.
marker->setVisible(true);
// Dim the marker, if series is not visible
qreal alpha = 1.0;
if (!marker->series()->isVisible())
alpha = 0.5;
QColor color;
QBrush 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);
QPen pen = marker->pen();
color = pen.color();
color.setAlphaF(alpha);
pen.setColor(color);
marker->setPen(pen);
break;
}
default:
{
qDebug() << "Unknown marker type";
break;
}
}
}
————————————————
版权声明:本文为CSDN博主「雪易」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_40041064/article/details/107940528
自己写的
Legend
主要实现对图表说明的编辑,添加删除Bar,图表说明的位置,以及图表说明字体的设置
LegendMarker
主要实现图表说明与图表的对应关系,点击图表说明可以显示/隐藏相应的图表,上面图中隐藏了sin曲线
和cos曲线
//markers():返回图例中的标记列表。可以通过指定返回标记的序列来筛选列表。
foreach(auto marker, ui->chartView->chart()->legend()->markers()){
connect(marker, &QLegendMarker::clicked, this, &MainWindow::on_LegendMarkerClickedA);
};
void MainWindow::on_LegendMarkerClickedA()
{
QLegendMarker *marker = (QLegendMarker *)sender();
marker->series()->setVisible(!marker->series()->isVisible());
marker->setVisible(true);
qreal alpha = 1;
//如果系列不可见,请将标记调暗
if(!marker->series()->isVisible()){
alpha = 0.5;
}
QBrush brush = marker->labelBrush();
QColor color = brush.color();
color.setAlphaF(alpha);
brush.setColor(color);
marker->setLabelBrush(brush);
}