提升方法:
- 在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 *)