如何改变QLineSeries的z-index?

9
有没有办法对添加到QChart的一些QAbstractSeries进行z-index排序? 看起来QChart在内部进行了处理。
3个回答

2

Zlevel 是由存储在 QtCharts::ChartPresenter 中的 QtCharts::ChartItem 设置的,并且它们都被隐藏在 QtChart 的私有部分。我们可以通过应用 findChild() 方法来获取它。

ChartPresenter 有一个获取其项目的方法,但您需要知道如何区分它们(例如为系列分配名称)。我已经使用了不透明度属性来实现此目的。请记住,在分配新的 z level 时,场景可能会更低(例如 Legend)。

void AppDispatcher::setZLevel(QtCharts::QXYSeries *series)
{
    QtCharts::ChartPresenter* present = series->chart()->findChild<QtCharts::ChartPresenter*>();
    Q_ASSERT(present);

    QList<QtCharts::ChartItem *> items = present->chartItems();

    for(QtCharts::ChartItem * item : items){
        if(item->opacity() == 0.99) { item->setZValue(QtCharts::ChartPresenter::ZValues::SeriesZValue+3); item->setOpacity(1); }
        if(item->opacity() == 0.98) { item->setZValue(QtCharts::ChartPresenter::ZValues::SeriesZValue+2); item->setOpacity(1); }
        if(item->opacity() == 0.97) { item->setZValue(QtCharts::ChartPresenter::ZValues::SeriesZValue+1); item->setOpacity(1); }
    }
}

但是如果图表中有很多系列:如何在QList<QtCharts::ChartItem *> items列表中找到准确的系列? 通过不透明度吗? 看起来很丑。 - Aleksey Kontsevich

0
问题在于Q*系列的实现会生成独立的QGraphicsItem。这些项被隐藏在系列的私有实现中。从外部访问它们没有简单的方法。
理论上,您可以通过场景对象(例如QGraphicsScene::items())找到它们。但是我不知道如何很好地识别它们。
供参考,您可以在此处找到相关类。

0

我知道这篇文章已经很老了,但是当我查看QtCharts代码时,我找到了解决方案,具体来说是glxyseriesdata.cpp。

系列被排序成一个使用系列指针作为键的映射。然后迭代此映射以进行渲染。因此,设置z值并不是真正的问题,而是这个渲染顺序。

如果在将它们传递给图表之前对系列指针进行排序(例如通过将它们保存在向量中并在其上使用std::sort),则渲染顺序将是正确的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接