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

62 篇文章 105 订阅

提升方法:

  • 在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都有输出,但图像就是出不来。

    实在是有些困惑,解决了再来分享我的答案吧
    顺便分享个QT绘图比较直观的介绍
    http://blog.163.com/modingfa_002/blog/static/1109254662012264278194/

    问题已经解决,问题原因是我更改了paintevent函数的名称,导致系统无法识别
    之前是这样的:
    void Histogram::paintEvent1(QPaintEvent *)
    自做聪明的改了paintevent的函数名称,呵呵
    正确的:
    void Histogram::paintEvent(QPaintEvent *)

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值