Как изменить z-индекс QLineSeries?

Есть ли способ заказать z-index для некоторых из моих QAbstractSeries, добавленных в QChart? Кажется, что QChart делает это внутренне.

3 ответа

Решение

Проблема в том, что реализации серии Q* генерируют независимые QGraphicsItems. Они скрыты в частной реализации серии. Нет простого способа получить к ним доступ извне.

Вы можете теоретически найти их через объект сцены (например, QGraphicsScene::items()). Однако я не вижу хорошего способа их идентифицировать.

Для справки, вы можете найти этот класс здесь.

Zlevel установленQtCharts::ChartItem которые хранятся в QtCharts::ChartPresenterскрыты в частной части QtChart. Мы можем добраться до него, применивfindChild() метод.

ChartPresenterесть метод получения своих элементов, но вам нужно знать, как вы будете их различать (поскольку серии присваивается имя). Для этой цели я использовал свойство opacity. Имейте в виду, что при назначении нового уровня z сцены могут быть ниже (например, Легенда).

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), порядок рендеринга будет правильным.

Другие вопросы по тегам