Как установить цвет бара в QBarSet? - PullRequest
1 голос
/ 07 ноября 2019

У меня есть горизонтальная гистограмма с одним QBarSet, которая выглядит следующим образом: enter image description here

Я хочу индивидуально установить цвет каждого бара QBarSet. Можно ли это как-нибудь сделать?

Я знаю, что мог бы использовать 3 отдельных QBarSet вместо одного и установить цвет каждого QBarSet индивидуально, чтобы достичь того, чего я хочу. Однако я не хочу использовать эту стратегию, потому что метка столбцов будет отображаться в легенде в верхней части графика (я хочу, чтобы ярлык каждого столбца отображался слева от столбца, как на снимке, которыйЯ предоставил).

Я видел решение здесь , которое объясняет, как это сделать при событиях при наведении, но я могу найти способ изменить это решение, чтобы столбцы всегда были цветными.

Спасибо!

1 Ответ

1 голос
/ 07 ноября 2019

Следующий метод может потерпеть неудачу в другой конфигурации, поскольку он сильно зависит от того, что размещено на диаграмме, поэтому, если вы хотите получить ответ на реальную проблему, вы должны предоставить MRE.

Учитывая вышеизложенное,логика состоит в том, чтобы получить элементы (прямоугольники) через фильтр и установить цвет:

#include <random>

#include <QApplication>
#include <QtCharts>
QT_CHARTS_USE_NAMESPACE

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QChartView w;

    QBarSet *set0 = new QBarSet("bar1");

    *set0 << 1 << 4 << 3 << 7 << 2 << 5 << 1 << 3 << 3 << 2 << 1 << 6 << 7 << 5;

    QBarSeries *series = new QBarSeries;
    series->append(set0);

    QChart *chart= new QChart;
    w.setChart(chart);
    chart->addSeries(series);

    // filter items
    QList<QGraphicsRectItem *> rect_items;
    for(QGraphicsItem * it : w.items()){
        if(QGraphicsRectItem *rect = qgraphicsitem_cast<QGraphicsRectItem *>(it)){
            if(rect->parentItem() != chart && rect->parentItem()->parentItem() == chart){
                rect_items << rect;
            }
        }
    }

    // change color
    std::random_device dev;
    std::mt19937 rng(dev());
    std::uniform_int_distribution<std::mt19937::result_type> dist255(0, 255);

    for(QGraphicsRectItem * rect : rect_items){
        QColor color(dist255(rng), dist255(rng), dist255(rng));
        rect->setBrush(color);
    }

    w.show();

    return a.exec();
}

enter image description here

...