首頁 > 軟體

QT利用QPainter繪製三維餅狀圖

2022-06-15 18:01:50

一、專案介紹

本文介紹利用QPainter實現三維餅狀圖的繪製,由於Qt中沒有三維餅狀圖的繪製元件,因此只能自行繪製。

二、專案基本設定

新建一個Qt案例,專案名稱為“PieTest”,基礎類別選擇“QWidget”,取消選中建立UI介面核取方塊,完成專案建立。

三、UI介面設定

無UI介面

四、主程式實現

4.1 widget.h標頭檔案

標頭檔案中只需宣告paintEvent函數:

private:
    void paintEvent( QPaintEvent* e);

4.2 widget.cpp原始檔

paintEvent函數定義如下:

void Widget::paintEvent( QPaintEvent* e)
{
    int start=240;//定義起始角度
    int ang=30;//定義角度範圍

    QPainter painter(this);
    // 去除畫筆
    painter.setPen(Qt::NoPen);
    // 設定反鋸齒
    painter.setRenderHint(QPainter::Antialiasing);
    //三維餅狀圖
    // 頂層圓面
    QRectF rect_top(10.0, 20.0, 280.0, 160.0);
    // 底層圓面(寬高相同,y在頂層圓面下方40處)
    QRectF rect_bottom(10.0, 60.0, 280.0, 160.0);
    // 中間矩形
    QRectF rect_midd(10.0, 100.0, 280.0, 40.0);
    // 扇形起始角度
    int startAngle = start * 16;      //從230度
    // 扇形覆蓋範圍
    int spanAngle = ang * 16;

    painter.setBrush(QColor(97,35,35,255));//餅狀圖高度顏色
    // 繪製底層圓面
    painter.drawEllipse(rect_bottom);
    // 繪製中間矩形
    painter.drawRect(rect_midd);

    painter.setBrush(QColor(Qt::darkYellow));//餅狀圖佔比高度顏色
    // 繪製底層扇形
    painter.drawPie(rect_bottom, startAngle, spanAngle);

    // 扇形的弦與弧的交點
    double pi = 3.1415926;
    double dx1 = rect_top.width() * 0.5 * cos(start * pi / 180);
    double dy1 = rect_top.height() * 0.5 * sin(start * pi / 180);

    double dx2 = rect_top.width() * 0.5 * cos((start+ang) * pi / 180);
    double dy2 = rect_top.height() * 0.5 * sin((start+ang) * pi / 180);

    // 求交點的座標值
    QPointF posBackCenter = QPointF(rect_top.center());
    double dX1 = posBackCenter.x() + dx1 + 0.5;
    double dY1 = posBackCenter.y() - dy1 + 0.5;

    double dX2 = posBackCenter.x() + dx2 + 0.5;
    double dY2 = posBackCenter.y() - dy2 + 0.5;

        // 記錄交點
        QPointF topLeft = QPointF(dX1, dY1);
        QPointF bottomRight = QPointF(dX2, dY2) + QPointF(0,40);
        QPointF bottomLeft = topLeft + QPointF(0,40);
        painter.setBrush(QColor(Qt::darkYellow));

        // 繪製連線扇形的區域
        QPolygonF path;
        path << topLeft << QPointF(dX2,dY2) << bottomRight << bottomLeft;
        painter.drawPolygon(path);

        // 繪製頂層圓面
        painter.setBrush(QColor(156,56,56,255));
        painter.drawEllipse(rect_top);

        // 繪製頂層扇形
        painter.setBrush(QColor(Qt::yellow));
        painter.drawPie(rect_top, startAngle, spanAngle);

    QWidget::paintEvent(e);
}

其部分示意為:

五、效果演示

完整效果如下:

到此這篇關於QT利用QPainter繪製三維餅狀圖的文章就介紹到這了,更多相關QT QPainter餅狀圖內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com