您的位置:首页 > 编程语言 > Qt开发

QT使用提升的绘图类问题,画饼图、直方图

2018-01-08 14:27 435 查看
最近自己在写一个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都有输出,但图像就是出不来。

实在是有些困惑,解决了再来分享我的答案吧

顺便分享个QT绘图比较直观的介绍

http://blog.163.com/modingfa_002/blog/static/1109254662012264278194/

问题已经解决,问题原因是我更改了paintevent函数的名称,导致系统无法识别

之前是这样的:

void Histogram::paintEvent1(QPaintEvent *)

自做聪明的改了paintevent的函数名称,呵呵

正确的:

void Histogram::paintEvent(QPaintEvent *)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: