1. 程式人生 > >QT使用提升的繪圖類問題,畫餅圖、直方圖

QT使用提升的繪圖類問題,畫餅圖、直方圖

提升方法:

  • 在UI介面拖入一個widget,如圖
    這裡寫圖片描述
  • UI介面右鍵widget,點選提升為,選擇全域性包含,如圖
    這裡寫圖片描述

  • 一般來說,被提升的類需要事先加入到專案中。

    遇到的問題:

    最近自己在寫一個QT程式,需要用到繪圖,我自己寫了兩個繪圖類一個畫餅圖,一個畫直方圖,把他們以提升的方式加入到主程式,結果只有一個圖畫出來了。
    程式碼如下:

    pie.h

    #ifndef PIE_H
    #define PIE_H
    
    #include <QWidget>
    
    class pie : public QWidget
    {
        Q_OBJECT
    public:
        explicit
    pie(QWidget *parent = 0); void paintEvent(QPaintEvent *); ~pie(); signals: public slots: }; #endif // PIE_H

    pie.cpp

    #include "pie.h"
    #include <QPainter>
    #include <QLabel>
    #include <QFont>
    #include <QDebug>
    #include "histogram.h"
    #define sum 10
    #define first 2
    #define second 3 #define third 4 #define fourth 1 pie::pie(QWidget *parent) : QWidget(parent) { // 第一個屬性是字型(微軟雅黑),第二個是大小,第三個是加粗(權重是75) // QFont::Light - 25 高亮 // QFont::Normal - 50 正常 // QFont::DemiBold - 63 半粗體 // QFont::Bold - 75 粗體 // QFont::Black - 87 黑體
    QFont font( "Microsoft YaHei", 11, 75); QLabel *mai = new QLabel(this); mai->setText("售出"); mai->setFont(font); mai->move(300,0); QLabel *sheng = new QLabel(this); sheng->setText("剩餘"); sheng->setFont(font); sheng->move(300,20); } pie::~pie() { } void pie::paintEvent( QPaintEvent *) { qDebug() <<"畫餅圖"; // QRectF rectangle(10.0, 20.0, 80.0, 60.0); // int startAngle = 30 * 16; // int spanAngle = 120 * 16; // QPainter painter(this); // painter.drawPie(rectangle, startAngle, spanAngle); //設定餅圖所在位置 QRectF rectangle(30.0, 80.0, 300.0, 300.0); QPainter painter(this); //畫售出示意塊 painter.fillRect(332,5,11,11,Qt::red); //畫剩餘示意塊 painter.fillRect(332,25,11,11,Qt::blue); // painter.fillRect(510,460,10,10,Qt::yellow); // painter.fillRect(510,480,10,10,Qt::green); QPainter painter2(this); //設定畫筆風格為抗鋸齒(繪圖光滑) painter2.setRenderHint(QPainter::Antialiasing); painter2.setBrush(Qt::red); painter2.setPen(Qt::NoPen); painter2.drawPie(rectangle,0 ,360*16*first/sum); painter2.setBrush(Qt::blue); painter2.drawPie(rectangle,360*16*first/sum,360*16*second/sum); painter2.setBrush(Qt::yellow); painter2.drawPie(rectangle,360*16-360*16*third/sum-360*16*fourth/sum,360*16*third/sum); painter2.setBrush(Qt::green); painter2.drawPie(rectangle,360*16-360*16*fourth/sum,360*16*fourth/sum); }

    直方圖的程式碼結構和餅圖類似,只不過paintEvent函式有所不同,但怎麼都畫不出來。網上說paintEvent函式是系統回撥的,只能呼叫一次?pie這個畫圖類提升之後我並沒有顯示呼叫,卻自己繪製了。用qDebug測試,發現餅圖在每次點開那個頁面就自動繪製,而直方圖的繪圖函式並沒有被呼叫,將

    paintEvent( QPaintEvent *)
    改成
    paintEvent( )

    然後在主視窗呼叫paintEvent( ),測試發現,paintEvent( ) 被呼叫了,畫圖部分前後的qDebug都有輸出,但影象就是出不來。

    問題已經解決,問題原因是我更改了paintevent函式的名稱,導致系統無法識別
    之前是這樣的:
    void Histogram::paintEvent1(QPaintEvent *)
    自做聰明的改了paintevent的函式名稱,呵呵
    正確的:
    void Histogram::paintEvent(QPaintEvent *)