Qt——QPainter绘画

绘图的事件: void paintEvent(QPaintEvent *); 在widget.h中进行声明
声明一个画家对象:QPainter painter(this) this指定的绘图的设备
画线、圆、矩形、文字;
设置画笔和画刷;

#include "widget.h"
#include "ui_widget.h"
#include 
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
}

void Widget::paintEvent(QPaintEvent *){
    // 实例化画家对象  this 指定的是当前的设备
    QPainter painter(this);
    //设置画笔颜色
    QPen pen(QColor(255,0,0));
    //设置画笔宽度
    pen.setWidth(5);
    //设置风格
    pen.setStyle(Qt::DotLine);
    //让画家使用该画笔
    painter.setPen(pen);


    //画刷  用于对封闭图形上色
    QBrush brush(Qt::blue);
    //画刷风格
    brush.setStyle(Qt::Dense7Pattern);
    // 让画家使用画刷
    painter.setBrush(brush);

    //画线
    painter.drawLine(QPoint(0,0),QPoint(100,100));
    //画圆
    painter.drawEllipse(QPoint(100,100),50,50);   //利用椭圆画圆
    //画矩形
    painter.drawRect(QRect(20,20,50,50));
    //画文字
    painter.drawText(QRect(10,200,400,50),"遇事不决,可问春风");


}

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


QPainter高级设置

#include "widget.h"
#include "ui_widget.h"
#include 
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
}

void Widget::paintEvent(QPaintEvent *){
 QPainter painter(this);
    painter.drawEllipse(QPoint(100,100),100,100);
    // 抗锯齿能力  会导致 效率低
    painter.setRenderHint(QPainter::HighQualityAntialiasing,true);
    painter.drawEllipse(QPoint(300,100),100,100);


    painter.drawRect(QRect(20,20,50,50));
    //移动画家  防止两个图在同一位置重叠
    painter.translate(100,0);
    //保存画家状态
    painter.save();
    painter.drawRect(QRect(20,20,50,50));
    painter.translate(100,0);
    //还原画家保存的状态
    painter.restore();
    painter.drawRect(QRect(20,20,50,50));   //此时这个圆会与第二个圆位置相同,两个圆重叠在一起

}

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

利用画家画图片
如果想手动调用绘图事件利用update();

#include "widget.h"
#include "ui_widget.h"
#include 
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    //点击移动按钮图片移动
    connect(ui->pushButton,&QPushButton::clicked,[=](){
        //如果手动调用绘图事件  用update更新
        pos+=20;   //pos在类中定义
        update();   //更新图片中pos位置按钮按下更新一次
    });
}

void Widget::paintEvent(QPaintEvent *){

    //**************利用画家画资源图片******************
     QPainter painter(this);

     //移动得如果超出屏幕就从头开始
     if(pos>this->width()){
         pos = 0;
     }
     painter.drawPixmap(pos,100,QPixmap(":/icon/iconpicture/1.png"));  //pos在类中进行定义

}

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

Pixmap绘图设备:
对不同平台做了显示优化

#include "widget.h"
#include "ui_widget.h"
#include
#include 
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    //Pixmap绘图设备  专门为了平台做了显示优化
    QPixmap pix(300,300);    //设定宽高
    //填充颜色
    pix.fill(Qt::white);

    //声明画家
    QPainter painter(&pix);
    painter.setPen(QPen(Qt::green));     //设置画笔为绿色
    painter.drawEllipse(QPoint(150,150),100,100);  //画圆
    //保存
    pix.save("E:\\pix.png");   //将图片保存到E盘
    
}

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

QImage绘图设备(与Pixmap相似)
但是QImage可以对像素进行访问

 //QImage绘图设备
    QImage img(300,300,QImage::Format_RGB32);
    img.fill(Qt::white);

    //声明画家
    QPainter painter(&img);
    painter.setPen(QPen(Qt::blue));
    painter.drawEllipse(QPoint(150,150),100,100);
    //保存
    img.save("E:\\img.png");

利用QImage对像素点进行修改:
在widget中加入绘画事件

//绘图事件
void Widget::paintEvent(QPaintEvent *){
    QPainter painter(this);
    //利用QImage对像素进行修改
    QImage img;
    img.load(":/iconpicture/1.png");     //使用img绘制资源文件

    //修改像素点
    for(int i = 50;i<100;i++){
        for(int j = 50;j<100;j++){
            QRgb  value = qRgb(250,0,0);    //设置一个RGB值
            img.setPixel(i,j,value);    //将(i,j)像素点修改为value的值
        }
    }

    painter.drawImage(0,0,img);   //在0,0点画一个img
}

QPicture绘图设备
记录和重现绘图指令,在绘图事件中可以将特殊格式的图片进行显示;

#include "widget.h"
#include "ui_widget.h"
#include
#include 
#include
#include 
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

      //QPicture绘图设备       可以记录和重现绘图指令
    QPicture pic;
    QPainter painter;
    painter.begin(&pic);     //开始往pic画
    painter.setPen(QPen(Qt::cyan));
    painter.drawEllipse(QPoint(150,150),100,100);
    painter.end();           //结束绘画

    pic.save("E:\\pic.ch");   //.ch格式不能识别,绘图事件中重现该图


}

//绘图事件
void Widget::paintEvent(QPaintEvent *){
    QPainter painter(this);
    //重现QPicture绘图指令
    QPicture pic;
    pic.load("E:\\pic.ch");
    painter.drawPicture(0,0,pic);
}

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


learned from:传智教育

你可能感兴趣的:(Qt)