绘图事件

绘图事件

  • 基础

同其他事件一样,我们想要实现绘图事件,只需要重写绘图事件的虚函数即可。

 void paintEvent(QPaintEvent*p); 

1.涉及到的类(同步包含头文件)

  • QPainter-画家类
    绘制一切东西(几何图形,文字,图片,图像),基本上都是经由画家之手,即调用画家类的成员方法来完成,这是必须的。
    别忘了设置绘画设备。
  • QPen-画笔类
    通过调用画笔类的成员方法,我们可以改变线条的一些属性,比如颜色,粗细,风格等。
    别忘了将pen递给画家后再画。
  • QBrush-画刷类
    改变填充颜色等。同样要将实例化的类对象递给画刷。
    画刷的默认风格是nobrush,所以要更改设置,使用setStyle()
    2.案例
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    void paintEvent(QPaintEvent*e);  //绘制事件

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QPainter>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}


void MainWindow::paintEvent(QPaintEvent *e)
{
    //创建画家类并设定绘画设备
    QPainter p1(this);
    //创建画笔
    QPen pen;
    pen.setColor(QColor(255,0,0));
    pen.setWidth(5);
    //画家拿画笔
    p1.setPen(pen);
    //创建笔刷
    QBrush brush;
    brush.setColor(QColor(0,255,255));
    brush.setStyle(Qt::SolidPattern);
    p1.setBrush(brush);
    /*
     QPainter类中包含很多绘制方法,随便调用一个
     */
    p1.drawLine(QPoint(100,100),QPoint(200,100));
    p1.drawRect(QRect(100,200,100,50));
}

  • 高级设置

1.抗锯齿

    //设置,抗锯齿能力,效率较低
    p1.setRenderHint(QPainter::Antialiasing);//加了这个就圆滑得多了
    p1.drawEllipse(QPoint(500,200),100,100);

2.平移画家,存储画家状态等,这里可以把画家视为坐标原点

    p1.translate(100,0);
    p1.drawRect(QRect(100,200,100,50));
//存储状态
p1.save();
//恢复状态
p1.restore();
//.......一些绘制操作

  • 手动调用绘图事件
//绘制图片
QPainter p(this);
p.drawPixmap(x,y,QPixmap("绝对路径"));
update();//重绘操作,即手动调用绘制事件

案例
头文件

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include<QPaintEvent>
#include<QDebug>
QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
    void paintEvent(QPaintEvent*event);
    void keyPressEvent(QKeyEvent*event);
    int x;
    int y;

private:
    Ui::Widget *ui;
};

源文件

#include "widget.h"
#include "ui_widget.h"
#include<QImage>
#include<QPicture>
#include<QPainter>
#include<QTimer>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    this->setFixedSize(600,600);
    x=0;
    y=0;
    QTimer* t1=new QTimer(this);
    t1->start(100);
    connect(t1,&QTimer::timeout,this,[=](){
        this->update();
        this->x+=10;
        if(x==600)
            x=0;
    });    
}
void Widget::paintEvent(QPaintEvent*event)
{
    QImage image("://image/delisa.jpg");
    QPainter painter(this);
    QImage scaledImage=image.scaled(600,337,Qt::KeepAspectRatio,Qt::SmoothTransformation);
    painter.drawImage(x,y,scaledImage);
}

void Widget::keyPressEvent(QKeyEvent *event)
{
    if(event->key()==Qt::Key_W)
    {
        qDebug()<<"按下了A";
    }
}
Widget::~Widget()
{
    delete ui;
}

posted @ 2025-05-01 20:20  噫~该死的碳酸饮料  阅读(34)  评论(1)    收藏  举报