Как мне автоматически масштабировать диаграмму в Qt при изменении размера окна?
Я создаю диаграмму с помощью 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 ответ
Вы должны отслеживать изменение размера 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; // +++
};
*.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);
}