本文記錄如何使用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();
}
5.源碼下載下傳
https://download.csdn.net/download/weixin_41882459/12034948