c++ - 如何在 qt 中更改一种 QBarSet 条/元素颜色?
问题描述
我连接到一个插槽的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
}
}
如您所见,如果我将鼠标悬停在栏集上,所有这些栏集栏(元素)的颜色都变为红色。但是我想将鼠标悬停在栏集的特定栏(元素)上,并且该栏(元素)改变了它的颜色,其余的保持不变。
有没有办法做到这一点?
解决方案
我有点搜索并试图让它工作,它可以通过转换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();
}
});
此外,可以使用 index ofQBarSet::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
}
推荐阅读
- r - 写函数来绘制数据,需要传递 data.frame 列名
- flutter - 如何在颤动的滑块小部件上隐藏拇指?
- rx-java2 - LiveData 不断输出对最后给定可观察对象的更改
- c++ - 我们如何在模板类中使用静态映射,模板类的每个实例都应该使用相同的映射
- java - 如何从资产文件夹中读取 Android Studio 中的 Excel 文件
- testing - 如何模拟 ApolloMutation 组件?
- excel - 用小数在 TextBox 中求和
- java - 如何从以下代码结束/取消注册
- sql - 如何基于组为列中的所有 NULL 值分配非 Null 值?
- azure - 使用 ARM 模板有条件地部署带有子网的路由表