当窗口大小改变时,如何在 Qt 中自动缩放图表?

Posted

技术标签:

【中文标题】当窗口大小改变时,如何在 Qt 中自动缩放图表?【英文标题】:How do I auto zoom a chart in Qt when window size change? 【发布时间】:2018-04-27 14:37:04 【问题描述】:

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

完整代码可在here获取。

【问题讨论】:

【参考方案1】:

您必须跟踪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);

【讨论】:

感谢您的热情回复。我什至不知道过滤得很好。我决定保持旧的方式。我正在考虑也许我可以创建 QGraphicsView 对象来显示图像,然后创建 QChartView 来显示图表。

以上是关于当窗口大小改变时,如何在 Qt 中自动缩放图表?的主要内容,如果未能解决你的问题,请参考以下文章

win10qt软件控件大小

QT中控件如何随着窗口大小的改变而使它充满整个窗口空间

VC:如何实现窗口和窗口内容在鼠标拖动下改变大小

如何在 QGraphicsScene 中缩放图像? (Qt 5.11)

Qt学习四 - 布局管理器

在QT中QGroupBox 能随着窗口变化而自动变化么?