如何在 QStackedWidget 中显示 QChartView?

How to display a QChartView inside a QStackedWidget?

我希望我的表单有一个包含 2 个(至少)页面的 QStackedWidget,并且每个页面都有一个 QChartView。 在窗体编辑器中,通过 'promote' 菜单,我从 QGraphicView 制作了一个 QChartView。 (屏幕截图(到目前为止只有 1 个 QChartView - 这样我就可以看到打开了哪个页面))。

来自主window,当按下其中一个按钮时,我想循环打开上面的windows:

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

我试过这样做:

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);
 
}

代码已编译,windows已打开。但问题是我的图表显示在打开的图表上方的另一个 window 中。 这显然是

的结果
ui->graphicsView->show();

但是如果我删除这条线,那么图表就完全不可见了。 请帮助,在此先感谢。

ui->graphicsView = new QChartView(chart);并没有取代QChartView,你只是在分配指针。解决方法是重用已有的QChartView,所以改成:ui->graphicsView->setChart(chart);.