1. 程式人生 > >Qt第二十一天

Qt第二十一天

續接昨天
繪畫餅圖和堆疊柱狀圖

void MainWindow::on_btnBuildBarChart_clicked()//重新整理柱狀圖
{
    buildBarChart();
}
void MainWindow::iniPieChart()//初始化PieChart
{
    QChart *chart=new QChart();
    chart->setTitle("PieChart");
    chart->setAnimationOptions(QChart::AllAnimations);
    ui->chartViewPie->setChart(chart);
    ui->chartViewPie->setRenderHint(QPainter::Antialiasing);
}
void MainWindow::buildPieChart()//建立餅狀圖
{
    QChart *chart=ui->chartViewPie->chart();//獲取chart
    chart->removeAllSeries();
    int colNo=1+ui->cBoxCourse->currentIndex();
    QPieSeries *series=new QPieSeries();//建立序列
    series->setHoleSize(ui->spinHoleSize->value());//設定空心大小
    for(int i=0;i<4;i++)
    {
        QTreeWidgetItem *item=ui->treeWidget->topLevelItem(i);
        series->append(item->text(0),item->text(colNo).toFloat());
    }
    QPieSlice *slice;
    for(int i=0;i<4;i++)//設定每個分塊的標籤文字
    {
        slice=series->slices().at(i);
        slice->setLabel(slice->label()+QString::asprintf("%.0f人,%.1f%",slice->value(),slice->percentage()*100));
        //connect(slice,SIGNAL(hovered(bool)),this,SLOT())
    }
    slice->setExploded(true);//切片分離
    series->setLabelsVisible(true);
    chart->addSeries(series);
    chart->setTitle(ui->cBoxCourse->currentText());
    chart->legend()->setVisible(true);
    chart->legend()->setAlignment(Qt::AlignRight);
}


void MainWindow::on_btnDrawPieChart_clicked()//重新整理PieChart
{
    buildPieChart();
}
void MainWindow::iniStackedBar()//初始化StackedBar
{
    QChart *chart=ui->chartViewStackedBar->chart();
    chart->setTitle("StackBar");
    chart->setAnimationOptions(QChart::AllAnimations);
    ui->chartViewStackedBar->setChart(chart);
    ui->chartViewStackedBar->setRenderHint(QPainter::Antialiasing);
}
void MainWindow::buildStackedBar()//建立StackedBar
{
    QChart *chart=ui->chartViewStackedBar->chart();//獲取QChart物件
    chart->removeAllSeries();
    chart->removeAxis(chart->axisX());
    chart->removeAxis(chart->axisY());
    //建立三門課程的資料集
    QBarSet *setMath=new QBarSet(theModel->horizontalHeaderItem(colNoMath)->text());
    QBarSet *setChinese=new QBarSet(theModel->horizontalHeaderItem(colNoChinese)->text());
    QBarSet *setEnglish=new QBarSet(theModel->horizontalHeaderItem(colNoEnglish)->text());
    for(int i=0;i<theModel->rowCount();i++)
    {
        setMath->append(theModel->item(i,colNoMath)->text().toInt());
        setChinese->append(theModel->item(i,colNoChinese)->text().toInt());
        setEnglish->append(theModel->item(i,colNoEnglish)->text().toInt());
    }
    //建立QStackedBarSeries物件,並新增資料集
    QStackedBarSeries *series=new QStackedBarSeries();
    series->append(setMath);
    series->append(setChinese);
    series->append(setEnglish);
    series->setLabelsVisible(true);//顯示每段的標籤
    chart->addSeries(series);//新增序列到圖表
    //建立橫軸
    QStringList categories;
    for(int i=0;i<theModel->rowCount();i++)
    {
        categories<<theModel->item(i,colNoName)->text();
    }
    QBarCategoryAxis *axisX=new QBarCategoryAxis();//類別座標軸作為橫軸
    axisX->append(categories);
    chart->setAxisX(axisX);
    axisX->setRange(categories.at(0),categories.at(categories.count()-1));
    //數值座標軸作為縱軸
    QValueAxis *axisY=new QValueAxis();
    axisY->setRange(0,300);
    axisY->setTitleText("總分");
    axisY->setTickCount(6);
    axisY->setLabelFormat("%.0f");
    chart->setAxisY(axisY);
    //設定圖例
    chart->legend()->setVisible(true);
    chart->legend()->setAlignment(Qt::AlignRight);
}




void MainWindow::on_btnBuildStackedBar_clicked()//重新整理碓疊柱狀圖
{
    buildStackedBar();
}


執行結果
在這裡插入圖片描述

在這裡插入圖片描述