绘图事件
绘图事件
- 基础
同其他事件一样,我们想要实现绘图事件,只需要重写绘图事件的虚函数即可。
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;
}


浙公网安备 33010602011771号