Как мне автоматически увеличить масштаб диаграммы в Qt при изменении размера окна? - PullRequest
0 голосов
/ 27 апреля 2018

Я создаю диаграмму с помощью QChart & QGraphicsScene & QGraphicsView, но диаграмма не автоматически увеличивает или уменьшает изображение при изменении окна. Как я мог это сделать? У меня нет сигнала или слота в классе QChart, QGraphicsScene или QGraphicsView. Я знаю, что мог бы использовать QChart & QChartView, но для некоторых целей мне нужен QChart & QGraphicsScene & QGraphicsView. Вот мой код для рисования графика:

void MainWindow::on_actionDraw_Sine_Chart_triggered()
{
    QSplineSeries *spline = new QSplineSeries;

    for (double x = -M_PI; x < M_PI; x += 0.01) {
        spline->append(x, sin(x));
    }

    spline->setName(tr("Sine Curve"));    
    QChart *chart = new QChart;
    chart->addSeries(spline);
    chart->createDefaultAxes();
    chart->axisX()->setRange(-4, 4);
    chart->axisY()->setRange(-1.2, 1.2);
    chart->setGeometry(ui->graphicsView->rect());

    QGraphicsScene *scene = new QGraphicsScene;
    scene->addItem(chart);
    ui->graphicsView->setScene(scene);
}

Полный код доступен здесь .

1 Ответ

0 голосов
/ 27 апреля 2018

Вы должны отследить изменение размера viewport и изменить размер QChart, для этого мы используем eventFilter, но, поскольку это еще один метод, вам нужен график, который является атрибутом класса.

В дополнение к этому не рекомендуется создавать сцену в одном слоте, но в конструкторе, то же самое с QChart, а затем только добавлять серии.

*. Ч

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    ...
    bool eventFilter(QObject *watched, QEvent *event); // +++
private:
    Ui::MainWindow *ui;
    QChart *chart; // +++
    QGraphicsScene *scene; // +++
};

*. Каст

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    scene = new QGraphicsScene;
    chart = new QChart;
    scene->addItem(chart);
    ui->graphicsView->setScene(scene);
    ui->graphicsView->viewport()->installEventFilter(this);

}

void MainWindow::on_actionDraw_Sine_Chart_triggered(){
    QSplineSeries *spline = new QSplineSeries;

    for (double x = -M_PI; x < M_PI; x += 0.01) {
        spline->append(x, sin(x));
    }
    spline->setName(tr("Sine Curve"));
    chart->addSeries(spline);
}


bool MainWindow::eventFilter(QObject *watched, QEvent *event)
{
    if(watched == ui->graphicsView->viewport() && event->type() == QEvent::Resize){
        if(chart)
            chart->resize(ui->graphicsView->viewport()->size());
    }
    return QMainWindow::eventFilter(watched, event);
}
...