Home > Enterprise >  How to display a QChartView inside a QStackedWidget?
How to display a QChartView inside a QStackedWidget?

Time:09-17

I want my form to have a QStackedWidget with 2 (at least) pages and each of them has a QChartView. In the form editor, through the 'promote' menu, I made a QChartView from QGraphicView. (screenshoot (so far there is only 1 QChartView on it - so that i can see which page is open)).

From the main window, when one of the buttons is pressed, I want to open the above windows in a loop:

void Widget::ShowStudioCharts() noexcept
{
    for(auto & e : this->userInfoVector){
        Form *pForm = new Form();
        pForm->provideStudioData(&e.studiosStats, e.nickname);
        pForm->processStudioStats();
        pForm->show();
    }
}

I tried to do it like this:

Form.h

#ifndef FORM_H
#define FORM_H
 
#include <QWidget>
#include <QPieSeries>
#include <QChart>
#include <QChartView>
#include <QGridLayout>
#include <vector>
#include <map>
#include <QStackedWidget>
#include <QtGlobal>
#include <QRectF>
#include <QRect>
#include <QPushButton>
 
namespace Ui {
class Form;
}
 
class Form : public QWidget
{
    Q_OBJECT
 
public:
    explicit Form(QWidget *parent = nullptr);
    ~Form();
    void provideStudioData(std::map<std::string, std::size_t> *studiosStats, const std::string &nickname) noexcept;
    void processStudioStats() noexcept;
private slots:
    void on_pushButton_2_clicked();
 
private:
    std::vector<std::map<std::string, size_t>*>  stats;
    std::vector<std::string>  nicknames;
    Ui::Form *ui;
};
 
#endif // FORM_H

Form.cpp

#include "form.h"
#include "ui_form.h"
#include <QPieSeries>
#include <QPieSlice>
#include <QChart>
using namespace QtCharts;
 
Form::Form(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Form)
{
    ui->setupUi(this);
}
 
Form::~Form()
{
    delete ui;
}
 
void Form::provideStudioData(std::map<std::string, size_t> *studiosStats, const std::string &nickname) noexcept
{
    this->stats.push_back(studiosStats);
    this->nicknames.push_back(nickname);
}
 
void Form::processStudioStats() noexcept
{
    srand(time(0));
    QPieSeries *series = new QPieSeries();
 
//    for (const auto & e : this->stats ){
//        //QBarSet *set0 = new QBarSet("1");
//        for ( const auto & a : *e){
//            //*set0 << a.second;
//            qDebug( (a.first   " "   std::to_string(a.second)).c_str());
//            }
//    }
    for ( const auto & a : *this->stats[0]){
        QPieSlice * slice = new QPieSlice();
        slice->setColor(QColor(rand()%255, rand()%255, rand()%255));
        slice->setValue(a.second);
        slice->setLabel(a.first.c_str());
        series->append(slice);
       }
 
    QChart *chart = new QChart();
    chart->setAnimationOptions(QChart::AnimationOption::AllAnimations);
    chart->addSeries(series);
 
    //chart->setPlotArea(QRectF(200,0,1400,1100));
    //chart->legend()->detachFromChart();
    chart->legend()->setBackgroundVisible(true);
    chart->legend()->setBrush(QBrush(QColor(128, 128, 128, 128)));
    chart->legend()->setPen(QPen(QColor(192, 192, 192, 192)));
    //chart->legend()->setGeometry(QRectF(20,20,200,1000));
    chart->setTitle(QString::fromStdString(this->nicknames[0]));
    this->setWindowTitle(QString::fromStdString(this->nicknames[0]));
    chart->legend()->setAlignment(Qt::AlignLeft);
    ui->graphicsView  = new QChartView(chart);
    ui->graphicsView->show();     
        //ui->stackedWidget->show();
}
void Form::on_pushButton_2_clicked()
{
    if(0 == this->ui->stackedWidget->currentIndex())
        this->ui->stackedWidget->setCurrentIndex(1);
    else if(1 == this->ui->stackedWidget->currentIndex())
        this->ui->stackedWidget->setCurrentIndex(0);
 
}

The code is compiled, windows are opened. But the problem is that my chart is displayed in another window above the opened one. This is obviously the result of

ui->graphicsView->show();

But if i remove this line, then the graph is not visible at all. Help please, thanks in advance. enter image description here enter image description here

CodePudding user response:

Doing ui->graphicsView = new QChartView(chart); does not replace the QChartView, you are just assigning the pointer. The solution is to reuse the existing QChartView so it changes to: ui->graphicsView->setChart(chart);.

  • Related