QChartView QLineSeries select 通过鼠标点击
QChartView QLineSeries select by mouse click
不幸的是,我找不到任何方法来捕捉鼠标点击 QChartView
上的任何 QLineSeries
的信号。这是后续增加图形上曲线厚度所必需的。
您可以使用 QLineSeries
的点击信号,因为它会影响同一系列,所以您可以创建派生的 class
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 没有点击信号所以我觉得很奇怪另一方面,此代码有效:
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);
}
之后你必须修改你的插槽,只有 QObject
传递指针,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);
}
不幸的是,我找不到任何方法来捕捉鼠标点击 QChartView
上的任何 QLineSeries
的信号。这是后续增加图形上曲线厚度所必需的。
您可以使用 QLineSeries
的点击信号,因为它会影响同一系列,所以您可以创建派生的 class
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 没有点击信号所以我觉得很奇怪另一方面,此代码有效:
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);
}
之后你必须修改你的插槽,只有 QObject
传递指针,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);
}