Я немного искал и пытался заставить его работать, и его можно изменить, приведя 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
}