2

QLineSeries残念ながら、マウス クリックの信号をat でキャッチする方法が見つかりませんQChartView。これは、グラフの曲線の太さを後で増加させるために必要です。

4

1 に答える 1

3

のクリック信号を使用でき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 にはクリックされた信号がないため、このコードが機能するのは奇妙に思えます。

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

その後、スロットを変更する必要があります.sのみがQObjectポインターにQPointF渡され、値で渡される必要がありますが、そのデータを使用しないため必要ありません.信号を発するのはQLineSeriesthisが渡されるためですスロットを介し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);
}
于 2018-08-08T11:19:55.067 に答える