有没有办法对添加到QChart的一些QAbstractSeries进行z-index排序?
看起来QChart在内部进行了处理。
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); }
}
}
我知道这篇文章已经很老了,但是当我查看QtCharts代码时,我找到了解决方案,具体来说是glxyseriesdata.cpp。
系列被排序成一个使用系列指针作为键的映射。然后迭代此映射以进行渲染。因此,设置z值并不是真正的问题,而是这个渲染顺序。
如果在将它们传递给图表之前对系列指针进行排序(例如通过将它们保存在向量中并在其上使用std::sort),则渲染顺序将是正确的。
QList<QtCharts::ChartItem *> items
列表中找到准确的系列? 通过不透明度吗? 看起来很丑。 - Aleksey Kontsevich