1

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

完整的代码可在此处获得。

4

1 回答 1

0

您必须跟踪 的大小变化viewport并更改 的大小QChart,因为我们使用的eventFilter是 ,但由于它是另一种方法,因此您需要该图表是该类的属性。

除此之外,不建议在一个槽中创建场景,而是在构造函数中,与 QChart 相同,然后只添加系列。

*。H

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; // +++
};

*.cpp

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);
}
于 2018-04-27T17:14:15.303 回答