QChartView QLineSeries выберите щелчком мыши

К сожалению, я не могу найти способ поймать сигнал щелчка мышью по любому QLineSeries в QChartView. Это требуется для последующего увеличения толщины кривой на графике.


person Johny Sins    schedule 08.08.2018    source источник


Ответы (1)


Вы можете использовать сигнал щелчка QLineSeries, и, поскольку он повлияет на ту же серию, вы можете создать производный класс.

main.cpp

#include <QApplication>
#include <QChartView>
#include <QLineSeries>
#include <random>

QT_CHARTS_USE_NAMESPACE

class LineSeries: public QLineSeries{
public:
    LineSeries(QObject *parent = nullptr):
        QLineSeries(parent)
    {
        connect(this, &QXYSeries::clicked, this, &LineSeries::onClicked);
    }
private slots:
    void onClicked(){
        QPen p = pen();
        p.setWidth(p.width()+1);
        setPen(p);
    }
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QChart *chart = new QChart();
    chart->legend()->hide();

    chart->setTitle("Simple line chart example");

    std::random_device rd;     // only used once to initialise (seed) engine
    std::mt19937 rng(rd());
    std::uniform_int_distribution<int> uni(0, 10);

    for(size_t i=0; i< 5; i++){
        LineSeries *series = new LineSeries();
        for(size_t j=0; j < 10; j++){
            *series << QPointF(j, uni(rng));
        }
        chart->addSeries(series);
    }
    chart->createDefaultAxes();

    QChartView chartView(chart);
    chartView.setRenderHint(QPainter::Antialiasing);
    chartView.resize(640, 480);
    chartView.show();

    return a.exec();
}

введите здесь описание изображения

Обновлять:

вам нужно подключить серию, вы не понимаете, что это ui->vchrt, но предположите, что это QChartView, но у QChartView нет сигнала clicked, поэтому мне кажется странным, что этот код работает, с другой стороны:

QLineSeries **series;
series = new QLineSeries*[data.size()];

это плохая практика в C++, вы используете стиль C в C++, вы должны использовать container как QList , например:

QList<QLineSeries *> series;

for(size_t i=0; i< data.size(); i++){
    QLineSeries *serie = new QLineSeries();
    for(size_t j=0; j < 10; j++){
        *serie << QPointF(/*values*/);
    }
    series << serie;
    connect(serie, &QXYSeries::clicked, this, &MainWindow::on_series_Clicked);
    chart->addSeries(serie);
}

после этого вы должны изменить свой слот, только QObjects передаются указатель, QPointF должны передаваться по значению, но даже в этом случае это не обязательно, так как вы не будете использовать эти данные, и поскольку тот, который излучает сигнал, является QLineSeries этим пропускается через sender() в слоте, при кастинге получаем серию и вносим изменения.:

*.h

private slots:
    void on_series_Clicked();

*.cpp

void MainWindow::on_series_Clicked(){
    auto serie = qobject_cast<QLineSeries *>(sender());
    QPen p = serie->pen();
    p.setWidth( p.width() == 1 ? 5: 1);
    serie->setPen(p);
}
person eyllanesc    schedule 08.08.2018
comment
А теперь собственный класс LineSeries больше не нужен? Является ли слот on_series_Clicked() членом класса MainWindow? - person Johny Sins; 08.08.2018
comment
@JohnySins мой собственный класс больше не нужен, on_series_Clicked, если это слот MainWindow. - person eyllanesc; 08.08.2018
comment
Спасибо, @eyllanesc. Как я могу получить индекс серии в контейнере для более сложного поведения слота on_series_Clicked()? - person Johny Sins; 08.08.2018
comment
@JohnySins использует метод indexOf(): int index = your_containter.indexOf(your_serie), - person eyllanesc; 08.08.2018
comment
@JohnySins, если мой ответ поможет вам, не забудьте отметить его как правильный, но вы знаете, просмотрите тур, это лучший способ поблагодарить. - person eyllanesc; 08.08.2018