Можно ли иметь индивидуальный размер маркера для каждой точки в QScatterSeries? - PullRequest
0 голосов
/ 12 июня 2018

Я хочу построить серию точек (расстояние r, угол a, сила s) в QPolarChart

QPolarChart *chart = new QPolarChart();
ScatterSeries *series1 = new QScatterSeries();
series1->setMarkerSize(s);

for(int i = 0; i < count; i++)
{  
    series1->setMarkerSize(s); // ->  of course changes the marker size for the complete series
    series1->append(r, a);
}

chart->addSeries(series1);

Теперь я хочу сделать размер маркера индивидуальным для каждой точки, в основном размер долженпредставляют «силу» каждой точки.

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

1 Ответ

0 голосов
/ 12 июня 2018

Нет прямого способа изменить размер маркера, маркеры - это пользовательские элементы, которые мы не можем установить размер, но можем масштабировать.Чтобы получить предметы, используйте itemAt() метод QChartView, который наследуется от QGraphicsView, как показано ниже:

#include <QApplication>
#include <QtCharts>

QT_CHARTS_USE_NAMESPACE

struct Data{
    qreal r;
    qreal a;
    qreal s;
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QChartView view;
    QPolarChart *chart = new QPolarChart;

    std::vector<Data> data;

    for(int i=0; i <= 360; i+=30){
        data.push_back(Data{i*1.0, i*1.0, 2*qAbs(sin(i*3.14159265358979323846/360))});
    }

    view.setChart(chart);
    QScatterSeries *series = new QScatterSeries;
    for(const Data & d: data){
        *series << QPointF(d.a, d.r);
    }

    chart->addSeries(series);
    chart->createDefaultAxes();
    view.show();

    for(int index= 0; index < series->count(); index++){
        QPointF p =  chart->mapToPosition(series->at(index) , series);
        QGraphicsItem *it = view.itemAt(view.mapFromScene(p));
        it->setTransformOriginPoint(it->boundingRect().center());
        it->setScale(data[index].s);
    }

    return a.exec();
}

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...