Qt开发基础(12)——绘图事件

目录

1.绘图事件的基本操作

2.绘图事件的高级设置

 3.利用画家画资源图片

4.绘图设备 


1.绘图事件的基本操作

#include "widget.h"
#include "ui_widget.h"
#include<QPainter>

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(3);

    //让画家使用这个颜色的笔
    painter.setPen(pen);

    //设置画刷
    QBrush brush(QColor(0,255,0));//或者 QBrush brush(QColor::green);

    //设置画刷风格
    brush.setStyle(Qt::Dense7Pattern);

    //让画家使用画刷
    painter.setBrush(brush);

    //画线
    painter.drawLine(QPoint(0,0),QPoint(100,100));
    //画圆:圆心,半径rx=ry,就是一个圆
    painter.drawEllipse(QPoint(100,100),50,50);

    //画圆:圆心,半径rx!=ry,就是一个椭圆
    painter.drawEllipse(QPoint(100,100),50,70);


    //画矩形
    painter.drawRect(QRect(20,20,50,50));

    //画文字
    painter.drawText(QRect(10,200,100,50),"hello world");
}

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

2.绘图事件的高级设置

#include "widget.h"
#include "ui_widget.h"
#include<QPainter>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
}

void Widget::paintEvent(QPaintEvent *)
{

    QPainter painter(this);
    painter.drawEllipse(QPoint(100,50),50,50);

    //对于下面的圆设置一下抗锯齿的能力,就是没有毛刺,更加清晰,但效率较低
    painter.setRenderHint(QPainter::Antialiasing);
    painter.drawEllipse(QPoint(200,50),50,50);


    //画两个重合的矩形
    painter.drawRect(QRect(200,200,50,50));

    //为了不让重合,我们可以移动画家画的位置
    painter.translate(100,0);
    
    //还原画家的保存状态
    painter.restore();
    
    painter.drawRect(QRect(200,200,50,50));
}

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

 3.利用画家画资源图片

#include "widget.h"
#include "ui_widget.h"
#include<QPainter>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    //点击移动按钮,移动右图片,我们只需改x的位置即可
    connect(ui->pushButton,&QPushButton::clicked,[=](){
        //如果要手动调用绘图事件,用updata()更新
        update();
    });

}

void Widget::paintEvent(QPaintEvent *)
{

    QPainter painter(this);

    //如果超出屏幕,从0开始
    if(posX>this->width())
    {
        posX=0;
    }
    posX+=20;//让这幅图每次按一次移动20个单位
    painter.drawPixmap(posX,0,QPixmap("D:/testImage/2.jpg"));

}

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

4.绘图设备 

 绘图设备时指继承QPainterDevice的子类,Qt一共提供了四个这样的类,分别如下所示:

  • QPixmap专门为图像在屏幕上的显示做了优化
  • QBitmap是QPixmap的一个子类,它的色深限定为1,可以使用QPixmap的isQBitmap来确定这个QPixmap是不是QBitmap
  • QImage专门为图像的像素级访问做了优化
  • QPicture则可以记录和重现QPainter的各条命令

之前我们绘制都是往widget上画,现在我们往磁盘上画:

新建文件如下所示:

将Pixmap作为绘图设备:

#include "widget.h"
#include "ui_widget.h"
#include<QPixmap>
#include<QPainter>

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);//往pix上画
    painter.setPen(QPen(Qt::green));
    painter.drawEllipse(QPoint(150,150),100,100);

    //保存
    pix.save("D:/pix.png");
}

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

 



 将QImage作为绘图设备:可以对像素进行访问


    //QImage作为绘图设备
    QImage img(300,300,QImage::Format_RGB32);//宽高和格式
    img.fill(Qt::white);

    QPainter painter(&img);
    painter.setPen(QPen(Qt::green));
    painter.drawEllipse(QPoint(150,150),100,100);

    //保存
    img.save("D:/img.png");


像素访问:

widget.cpp如下:

#include "widget.h"
#include "ui_widget.h"
#include<QPixmap>
#include<QPainter>

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);//往pix上画
//    painter.setPen(QPen(Qt::green));
//    painter.drawEllipse(QPoint(150,150),100,100);

//    //保存
//    pix.save("D:/pix.png");


    //QImage作为绘图设备
//    QImage img(300,300,QImage::Format_RGB32);//宽高和格式
//    img.fill(Qt::white);

//    QPainter painter(&img);
//    painter.setPen(QPen(Qt::green));
//    painter.drawEllipse(QPoint(150,150),100,100);

//    //保存
//    img.save("D:/img.png");



}

void Widget::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    //利用QImage 对像素进行修改
    QImage img;
    img.load("D:\\testImage\\2.jpg");

    //修改像素值
    for(int i=50;i<100;i++)
    {
        for(int j=50;j<100;j++)
        {
            QRgb value = qRgb(255,0,0);
            img.setPixel(i,j,value);
        }
    }
    painter.drawImage(0,0,img);


}


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



QPicture绘图设备:可以记录和重现绘图指令

#include "widget.h"
#include "ui_widget.h"
#include<QPixmap>
#include<QPainter>
#include<QPicture>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

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

    //保存磁盘
    pic.save("D:/pic.zt");
}

void Widget::paintEvent(QPaintEvent *)
{

}


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



重现QPicture的绘图指令

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include<QPixmap>
#include<QPainter>
#include<QPicture>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

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

    //保存磁盘
    pic.save("D:/pic.zt");
}

void Widget::paintEvent(QPaintEvent *)
{
    //重现绘图指令
    QPainter painter(this);
    QPicture pic;
    pic.load("D:/pic.zt");

    painter.drawPicture(0,0,pic);

}


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

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,关于QT绘图系统,我可以为您提供一些基本的介绍和使用方法。 QT提供了一套强大的绘图系统,可以用来绘制各种图形、图表、文本、图像等等。QT绘图系统主要由以下几个类组成: 1. QPainter:绘图类,用于绘制各种图形、图像、文本等。 2. QPen:画笔类,用于设置绘图的线条样式、颜色、粗细等。 3. QBrush:画刷类,用于设置绘图的填充样式、颜色等。 4. QFont:字体类,用于设置绘图的字体、大小、样式等。 5. QRect和QRectF:矩形类,用于表示矩形区域的位置和大小。 6. QImage:图像类,用于表示位图图像。 使用QT绘图系统进行绘图主要有两种方式,一种是在QWidget或QGraphicsView等控件的paintEvent事件中进行绘制,另一种是创建QPixmap或QImage等图像对象,然后使用QPainter在图像上进行绘制。 下面是一个简单的示例代码,演示了如何在QWidget中使用QT绘图系统进行绘制: ```cpp void MyWidget::paintEvent(QPaintEvent *event) { QPainter painter(this); // 设置画笔和画刷 QPen pen(Qt::red, 2, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin); QBrush brush(Qt::yellow, Qt::SolidPattern); painter.setPen(pen); painter.setBrush(brush); // 绘制矩形和椭圆 QRect rect(100, 100, 200, 100); painter.drawRect(rect); painter.drawEllipse(rect); // 绘制文本 QFont font("Arial", 20); painter.setFont(font); painter.drawText(rect, Qt::AlignCenter, "Hello, QT!"); } ``` 在这个示例代码中,我们在QWidget的paintEvent事件中创建了一个QPainter对象,然后设置了画笔和画刷,接着使用QRect定义了一个矩形区域,并使用drawRect和drawEllipse方法在该区域上绘制了矩形和椭圆。最后,使用setFont和drawText方法在矩形区域中央绘制了一段文本。 当然,QT绘图系统的功能远不止于此,您可以根据需要使用更多的API进行绘制。希望这个简单的介绍可以帮助您更好地了解和使用QT绘图系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI炮灰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值