Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在qt中更改一个QBarSet条/元素颜色?_C++_Qt_Qt5_Qchart - Fatal编程技术网

C++ 如何在qt中更改一个QBarSet条/元素颜色?

C++ 如何在qt中更改一个QBarSet条/元素颜色?,c++,qt,qt5,qchart,C++,Qt,Qt5,Qchart,我将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

我将
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
    }
}
这些是悬停前和悬停时的图片:

如您所见,如果我将鼠标悬停在条集上,所有这些条集条(元素)的颜色都会变为红色。但我想将鼠标悬停在条形图集合的某个特定条形图(元素)上,该条形图(元素)会改变其颜色,其余的颜色保持不变。


有没有办法做到这一点?

目前无法单独更改列的颜色,因此我将介绍一种解决方法。这包括将新项目放置在悬停项目的顶部,如下所示:

#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();
}
#包括
#包括
QT\u图表\u使用\u命名空间
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
QChartwiew;
QBarSet*set0=新的QBarSet(“bar1”);

*set0我进行了一点搜索并试图使其工作,可以通过将
QGraphicsItem
转换为
qgraphicsrecitem
来更改它

这与前面的回答类似:

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
的索引即可

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
}
QObject::connect(set0,&QBarSet::悬停,[&w](bool状态,int-ind){
如果(状态){
std::向量项列表;
分类项目(项目列表);
qgraphicsrecitem*rect=项目列表位于(ind).second;
//改变直肠的颜色
}
否则{
//将矩形颜色改回
}
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
}