首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >鼠标单击QChartView QLineSeries选择

鼠标单击QChartView QLineSeries选择
EN

Stack Overflow用户
提问于 2018-08-08 10:48:57
回答 1查看 4.3K关注 0票数 2

不幸的是,我找不到任何方法来捕捉鼠标点击任何QLineSeriesQChartView的信号。这是需要的,随后增加的曲线厚度的图形。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-08 11:19:55

您可以使用QLineSeries的单击信号,因为它将影响同一系列,因此可以创建一个派生类。

main.cpp

代码语言:javascript
复制
#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没有点击信号,所以在我看来,这段代码的工作原理很奇怪,另一方面:

代码语言:javascript
复制
QLineSeries **series;
series = new QLineSeries*[data.size()];

在C ++中是一个不好的实践,在C ++中使用C样式,应该使用容器作为QList,例如:

代码语言:javascript
复制
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

代码语言:javascript
复制
private slots:
    void on_series_Clicked();

*.cpp

代码语言:javascript
复制
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);
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51744802

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档