本文记录如何使用qpainter在子部件上绘图。
1.需要在子部件上安装事件过滤器
frame->installEventFilter(this); //安装事件过滤器到窗口
2.头文件中声明如下
bool eventFilter(QObject *watched, QEvent *event);
bool m_flag=false;//绘图标志
3.声明画图函数
void graphChart(QWidget *w);
4.如果使用按钮来控制画图
m_flag = true;
update();
代码展示如下:
头文件:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include<QPaintEvent>
#include<QPainter>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
// void paintEvent(QPaintEvent *p);
QPainter *painter;
private slots:
void on_pushButton_clicked();
private:
Ui::MainWindow *ui;
bool m_flag = false;//绘图标志
bool eventFilter(QObject *watched, QEvent *event);
void graphChart(QWidget *w);
};
#endif // MAINWINDOW_H
Cpp文件 :
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->widget->installEventFilter(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
m_flag = true;
update();
}
bool MainWindow::eventFilter(QObject *watched, QEvent *event)
{
if(watched ==ui->widget&&event->type()==QEvent::Paint)
{
graphChart(ui->widget);
}
return QWidget::eventFilter(watched,event);
}
void MainWindow::graphChart(QWidget *w)
{
if(m_flag)
{
painter = new QPainter();
painter->begin(w);
QPen pen;
pen.setColor(Qt::red);
painter->setPen(pen);
painter->drawText(100,100,"Paintevent");
painter->end();
}
}
补充:
画了个等边三角形
void MainWindow::drawTriangle(QPainter *painter)
{
painter->save();
double radius =100;
painter->setPen(Qt::NoPen);
static const QPointF points[3]={QPointF(radius,0),QPointF(0,0),QPointF(radius/2,sqrt(pow(radius,2)-pow(radius/2,2)))};
painter->setBrush(Qt::red);
painter->drawConvexPolygon(points,3);
painter->restore();
}
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0TPR9UMRpWT0cGVNBDOsJGcohVYsR2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL2UDO4AjMwETM5EjMxkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
5.源码下载
https://download.csdn.net/download/weixin_41882459/12034948