当窗口大小改变时,如何在 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 中自动缩放图表?的主要内容,如果未能解决你的问题,请参考以下文章