QT使用提升的繪圖類問題,畫餅圖、直方圖
阿新 • • 發佈:2019-01-22
提升方法:
一般來說,被提升的類需要事先加入到專案中。
遇到的問題:
最近自己在寫一個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 *)