由于无法直接在QLabel
上进行绘图,所以需要通过几种其它的方式来进行处理绘图情况
QLabel
进行提升为自定义控件类。eventFilter
来捕获绘图事件,然后进行绘图。1、通过自定义控件触发信号,然后在主程序的槽函数中实现绘图
paintEvent()
函数。paintEvent()
函数中来触发绘图的信号 emit StartPaint();
QLabel
上进行绘图操作。UI
所对应的label
上进行提升,将其提升为自定义控件MyLabel2、对应文件及代码如下
(1)、自定义控件类MyLabel,继承自QLabel
/******* MyLabel.h *******/
#pragma once
#include
#include
class MyLabel : public QLabel
{
Q_OBJECT
public:
MyLabel(QWidget *parent=nullptr);
~MyLabel();
protected:
void paintEvent(QPaintEvent *event);
signals:
void StartPaint();
};
/******* MyLabel.cpp *******/
#include "MyLabel.h"
MyLabel::MyLabel(QWidget *parent) : QLabel(parent)
{}
MyLabel::~MyLabel()
{}
void MyLabel::paintEvent(QPaintEvent *event)
{
// 在自定义的类中来触发绘图信号
emit StartPaint();
}
(2)、主程序 Pr04_PaintOnQLabel
/******* Pr04_PaintOnQLabel.h *******/
#pragma once
#include
#include
#include "ui_Pr04_PaintOnQLabel.h"
#include "MyLabel.h"
class Pr04_PaintOnQLabel : public QWidget
{
Q_OBJECT
public:
Pr04_PaintOnQLabel(QWidget *parent = Q_NULLPTR);
protected slots:
void PaintOnQLabel(); //自定义用于在QLabel上绘图的槽函数
private:
Ui::Pr04_PaintOnQLabelClass ui;
};
/******* Pr04_PaintOnQLabel.cpp *******/
#include "Pr04_PaintOnQLabel.h"
#include
#include
Pr04_PaintOnQLabel::Pr04_PaintOnQLabel(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
connect(ui.label_01, &MyLabel::StartPaint, this, &Pr04_PaintOnQLabel::PaintOnQLabel);
}
void Pr04_PaintOnQLabel::PaintOnQLabel()
{
QPainter painter(ui.label_01);
painter.setBrush(Qt::blue);
painter.drawPie(QRect(0, 0, ui.label_01->width(), ui.label_01->height()), 0, 280 * 16);
}
4、注意事项:函数的执行顺序
paintEvent
函数执行paintEvent
中绘图1、过程分析
QLabel
提升为对应的自定义控件paintEvent
之前已经将所有的UI
初始化了,各控件的尺寸得到了修正。所以可以直接在painEvent
函数中直接进行绘图2、对应代码如下,主程序为默认,不进行绘图操作
/******* MyLabel.h *******/
#pragma once
#include
#include
class MyLabel : public QLabel
{
Q_OBJECT
public:
MyLabel(QWidget *parent=nullptr);
~MyLabel();
protected:
void paintEvent(QPaintEvent *event);
private:
int w0; //自定义控件类构造函数中QLabel宽度,为默认值
int h0; //自定义控件类构造函数中QLabel高度,为默认值
};
/******* MyLabel.cpp *******/
#include "MyLabel.h"
#include
#include
MyLabel::MyLabel(QWidget *parent) : QLabel(parent)
{
//此处值为默认初始值
w0 = this->width();
h0 = this->height();
}
MyLabel::~MyLabel()
{}
//直接在paintEvent函数中进行绘图,无需再触发信号来进行绘图。
void MyLabel::paintEvent(QPaintEvent *event)
{
//此处值为执行主程序中后修正过的值
int w = this->width();
int h = this->height();
QPainter painter(this);
painter.setPen(QPen(Qt::red, 8));
painter.drawLine(0, 0, w, h);
painter.drawPie(QRect(10, 10, w - 10, h - 10), 0, 315 * 16);
}
1、过程分析
paintEvent
事件函数中去进行处理,因为绘图操作被event
分发到paintEvent
中去进行处理了。QLabel
等控件的绘图事件会被Qt
默认过滤掉,因此一般不能直接在QLabel
等控件上进行绘图。QLabel
上进行绘图操作,就可以通过事件过滤器eventFilter
或者事件函数event
来对QLabel控件的绘图事件进行捕获,并在捕获到绘图事件QEvent::Paint
后进行绘图操作。paintEvent
事件函数中进行处理了,可以自定义绘图函数来进行处理。2、在QLabel
上通过捕获绘图事件来进行绘图操作
(1)、Pr04_PaintOnQLabel文件对应代码如下
/******* Pr04_PaintOnQLabel.h *******/
#pragma once
#include
#include "ui_Pr04_PaintOnQLabel.h"
class Pr04_PaintOnQLabel : public QWidget
{
Q_OBJECT
public:
Pr04_PaintOnQLabel(QWidget *parent = Q_NULLPTR);
protected:
bool eventFilter(QObject *watched, QEvent *event);//事件过滤器
void StartDraw(); //捕获到绘图事件后,就开始绘图操作。
private:
Ui::Pr04_PaintOnQLabelClass ui;
};
/******* Pr04_PaintOnQLabel.cpp *******/
#include "Pr04_PaintOnQLabel.h"
#include
Pr04_PaintOnQLabel::Pr04_PaintOnQLabel(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
//在需要过滤操作的控件上安装事件过滤器
ui.label_02->installEventFilter(this);
}
bool Pr04_PaintOnQLabel::eventFilter(QObject *watched, QEvent *event)
{
if (watched == ui.label_02 && event->type()==QEvent::Paint)
{
StartDraw();
return true;
}
else
{
return QWidget::eventFilter(watched, event);
}
}
void Pr04_PaintOnQLabel::StartDraw()
{
QPainter painter(ui.label_02);
painter.setPen(QPen(Qt::red, 6));
painter.setBrush(QColor(0, 200, 200, 200));
painter.drawPie(QRect(20, 20, ui.label_02->width() - 20, ui.label_02->height() - 20), 0, 300 * 16);
}