Как изменить один цвет панели / элемента QBarSet в qt? - PullRequest
0 голосов
/ 29 мая 2018

Я подключился к сигналу hovered QBarSet к слоту, который изменит цвет QBarSet, когда мышь зависнет на полосе, и сбросит цвет, когда мышь уйдет.
Фрагмент кода выглядит следующим образомэто:

void BarChart::hoverTest(bool status, int index)
{
    if(status == true) {
        set->setColor(Qt::red); //changes to bar set color to red mouse when hovers on bar set
    }
    else {
        set->setColor(QColor(52, 152, 219)); //reset the color when mouse leaves
    }
}

А вот фотографии перед зависанием и при зависании: enter image description here

enter image description here

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

Есть ли способ достичь этого?

Ответы [ 2 ]

0 голосов
/ 17 июля 2019

Я немного искал и пытался заставить его работать, и его можно изменить, приведя QGraphicsItem к QGraphicsRectItem.

Это аналогично предыдущему ответу:

QObject::connect(set0, &QBarSet::hovered, [&w](bool status, int /*index*/){
    QPoint p = w.mapFromGlobal(QCursor::pos());

    if(status){
        QGraphicsRectItem *rect = qgraphicsitem_cast<QGraphicsRectItem *>(w.itemAt(p));
        rect->brush().setColor(Qt::red);
        rect->update();     
    }
    else{
        rect->brush().setColor(Qt::blue);     //or change it to default colour
        rect->update();
    }
});

Кроме того, возможно использование индекса QBarSet::hovered, но это требует много работы, а это невозможно сделать напрямую.В моем случае я создал метод, чтобы найти все гистограммы на графике и отсортировать их по позиции x , чтобы индексы в QObject::connect соответствовали отсортированному списку.

Итак, сначала нам нужно найти все бары на графике и привести их к QGraphicsRectItem и отсортировать их.

void sortGraphicItems( std::vector<std::pair<float,QGraphicsRectItem*> > &item_list){

    for(int i = 0; i<this->items().size();i++){
        if(w->items().at(i)->flags().testFlag(QGraphicsItem::ItemIsSelectable)){    //This selects all selectable items
            QGraphicsRectItem *it = qgraphicsitem_cast<QGraphicsRectItem *>(this->items().at(i));
            if (!it)    //if the graphic object is not type of QGraphicsRectItem
                continue;
            item_list.push_back( std::make_pair(it->rect().x(), it) );
        }
    }
    std::sort(item_list.begin(),item_list.end());
}

, а затем просто сделать то же самое, но использовать индекс QBarset.

QObject::connect(set0, &QBarSet::hovered, [&w](bool status, int ind){
if(status){
    std::vector<std::pair<float,QGraphicsRectItem*> > item_list;
    sortGraphicItems(item_list);

    QGraphicsRectItem *rect = item_list.at(ind).second;

    //change colour of rect
}
else{
    //change rect colour back
}
0 голосов
/ 29 мая 2018

В настоящее время невозможно изменить цвет столбца по отдельности, поэтому я покажу обходной путь.Это состоит из размещения нового предмета над объектом поиска, как показано ниже:

#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);
    w.show();

    QGraphicsRectItem hoverItem;
    hoverItem.setBrush(QBrush(Qt::red));
    hoverItem.setPen(Qt::NoPen);

    QObject::connect(set0, &QBarSet::hovered, [&w, &hoverItem](bool status, int /*index*/){
        QPoint p = w.mapFromGlobal(QCursor::pos());
        if(status){
            QGraphicsItem *it = w.itemAt(p);
            hoverItem.setParentItem(it);
            hoverItem.setRect(it->boundingRect());
            hoverItem.show();
        }
        else{
            hoverItem.setParentItem(nullptr);
            hoverItem.hide();
        }
    });
    return a.exec();
}

enter image description here

...