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

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

0

Решение

Вы можете использовать нажатый сигнал 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 ++, вы должны использовать контейнер как 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() в слоте, с кастинга мы получаем серию и вносятся изменения.

*.час

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);
}
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]