How to make the widget to take the whole window with using scene() -> addWidget
Unsolved
General and Desktop
-
I'm currently working with two sample project in qt : zoomline chart and callouts . I've combined these two projects and instead of using
scene() -> addItem(m_chart)
, I usedscene() -> addWidget(chartView)
in order to use the whole chartview and it's gesture handlers. But I got this:
I don't know really what to do , when I use
addItem()
It all works well but I need to use chartView so I need theaddWidget()
method.Here is my
View.cpp
code , if it helps :#include "view.h" #include <QtGui/QResizeEvent> #include <QtWidgets/QGraphicsScene> #include <QtCharts/QChart> #include <QtCharts/QLineSeries> #include <QtCharts/QSplineSeries> #include <QtWidgets/QGraphicsTextItem> #include "callout.h" #include "chart.h" #include "chartview.h" #include <QtGui/QMouseEvent> #include <QtCore/QtMath> #include <QtCore/QRandomGenerator> View::View(QWidget *parent) : QGraphicsView(new QGraphicsScene, parent), m_coordX(0), m_coordY(0), m_chart(0), m_tooltip(0) { setDragMode(QGraphicsView::NoDrag); setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); //QLineSeries scope code QLineSeries *series = new QLineSeries(); for (int i = 0; i < 500; i++) { QPointF p((qreal) i, qSin(M_PI / 50 * i) * 100); p.ry() += QRandomGenerator::global()->bounded(20); *series << p; } m_chart = new Chart(); m_chart->addSeries(series); m_chart->setTitle("Zoom in/out example"); m_chart->setAnimationOptions(QChart::SeriesAnimations); m_chart->legend()->hide(); m_chart->createDefaultAxes(); ChartView *chartView = new ChartView(m_chart); chartView->setRenderHint(QPainter::Antialiasing); scene() -> addWidget(chartView); m_coordX = new QGraphicsSimpleTextItem(m_chart); m_coordX->setPos(m_chart->size().width()/2 - 50, m_chart->size().height()); m_coordX->setText("X: "); m_coordY = new QGraphicsSimpleTextItem(m_chart); m_coordY->setPos(m_chart->size().width()/2 + 50, m_chart->size().height()); m_coordY->setText("Y: "); connect(series, &QLineSeries::clicked, this, &View::keepCallout); connect(series, &QLineSeries::hovered, this, &View::tooltip); this->setMouseTracking(true); } void View::resizeEvent(QResizeEvent *event) { if (scene()) { scene()->setSceneRect(QRect(QPoint(0, 0), event->size())); m_chart->resize(event->size()); m_coordX->setPos(m_chart->size().width()/2 - 50, m_chart->size().height() - 20); m_coordY->setPos(m_chart->size().width()/2 + 50, m_chart->size().height() - 20); const auto callouts = m_callouts; for (Callout *callout : callouts) callout->updateGeometry(); } QGraphicsView::resizeEvent(event); } void View::mouseMoveEvent(QMouseEvent *event) { m_coordX->setText(QString("X: %1").arg(m_chart->mapToValue(event->pos()).x())); m_coordY->setText(QString("Y: %1").arg(m_chart->mapToValue(event->pos()).y())); QGraphicsView::mouseMoveEvent(event); } void View::keepCallout() { m_callouts.append(m_tooltip); m_tooltip = new Callout(m_chart); } void View::tooltip(QPointF point, bool state) { if (m_tooltip == 0) m_tooltip = new Callout(m_chart); if (state) { m_tooltip->setText(QString("X: %1 \nY: %2 ").arg(point.x()).arg(point.y())); m_tooltip->setAnchor(point); m_tooltip->setZValue(11); m_tooltip->updateGeometry(); m_tooltip->show(); } else { m_tooltip->hide(); } }
-
Hi,
Based on a quick look at the QChartView documentation, you should directly set your QChart object on the scene and not use QChartView.