目录
1.绘图操作的原理:
2.重写绘图事件
3.绘制基本图形(直线、椭圆、矩形、文字)
4.画笔设置(颜色、宽度、风格)
5.设置画刷(颜色、风格)
6.高级设置(抗锯齿、画家移动、保存和恢复)
7.利用画家对象加载图片
7.1加载图片
7.2按下按钮移动图片:
7.3基于定时器实现自动移动
8.绘图设备
8.1绘图的实质
8.2pixmap设备
8.3Image设备
3.picture设备
1.利用绘图事件,重写绘图事件函数
2.创建一个画家对象,其次使用画家对象的各种函数,来绘制图形或者图片
3.设置画家的相关参数以及画笔和画刷的调用,修饰所画图形
1.先在头文件中声明
//重写绘图事件---在.h文件中声明
void paintEvent(QPaintEvent*);
2.在cpp文件中重写
注意添加 画家 头文件
#include
//重写绘图事件
void Widget:: paintEvent(QPaintEvent*)
{
//首先要包含头文件
//实例出一个画家对象
QPainter painter1(this); //并指定父亲
}
//绘制直线---参数(坐标1,左标2)
painter1.drawLine(QPoint(400,400),QPoint(600,600));
//绘制椭圆---参数(中心,半长,半高)
painter1.drawEllipse(QPoint(500,500),100,50);
//绘制矩形--- 参数(左顶点,长,高)
painter1.drawRect(400,400,150,50);
//这个参数被QRect包裹住了
painter1.drawRect(QRect(500,500,60,100));
//绘制文字
painter1.drawText(QRect(600,50,150,60),"文字显示");
//画笔设置--颜色
QPen pen1(QColor(255,0,0));
//设置画笔宽度
pen1.setWidth(4);
//设置画笔风格
pen1.setStyle(Qt::DashDotDotLine);
//将画笔添加给画家
painter1.setPen(pen1);
//设置画刷-包括颜色
QBrush brush1(Qt::cyan);
//设置画刷风格--qbrushstyle进行枚举
brush1.setStyle(Qt::CrossPattern);
//将画刷添加给画家
painter1.setBrush(brush1);
//绘制一个圆
//加抗锯齿效果---参数为:setRenderHint搜索即可
//抗锯齿--效率低
painter1.setRenderHint(QPainter::HighQualityAntialiasing);
painter1.drawEllipse(QPoint(600,200),150,150);
//保存画笔当前的数据
painter1.save();
//移动画笔的初始位置---两个参数分别为x和y的偏移量
painter1.translate(100,50);
//绘制直线---参数(坐标1,左标2)
painter1.drawLine(QPoint(400,400),QPoint(600,600));
//恢复画笔之前保存的数据
painter1.restore();
利用Label标签也可以加载动态和静态图片,利用画家函数同样可以
首先要将图片资源添加到项目中,其次是使用函数--paint1.drawpixmap()
//重定义窗口大小--直接this即可
this->resize(1200,800);
//重命名窗口名称
this->setWindowTitle("新登录页面");
//实例出一个画家对象
QPainter paint1(this); //并且指定父类
//利用画家加载图片--前提是添加系统资源
//pixmap:象图
// 第一个参数是图片的起始坐标
paint1.drawPixmap(0,0,QPixmap(":/resour/03.jpg"));
connect(ui->pushButton_4,&QPushButton::clicked,this,[=](){
//左移图片
//用updata函数更新数据--重新获取画家对象信息
QX -= 20;
if(QX < 0)
{
QX = this->width();
}
update();
});
//用定时器实现自动移动
QTimer* timer1 = new QTimer(this);
//timer1->start(100);
//信号和槽
connect(timer1,&QTimer::timeout,this,[=](){
QX+=5;
if(QX > this->width())
{
QX=0;
}
update();
});
connect(ui->pushButton_5,&QPushButton::clicked,this,[=](){
//停止定时器
timer1->stop();
});
connect(ui->pushButton_6,&QPushButton::clicked,this,[=](){
//停止定时器
timer1->start(100);
});
}
注意:一个比较重要的东西就是---把代码写在合适的文件内
利用画家 QPainter 在绘图设备 QPainterDevice 上进行绘制,两者之间通过 引擎 QPainterEngine
进行通信(翻译 QPainter 的指令)
专门为图像在屏幕上的显示做了优化
//对象出一个pixmap绘图设备---500*500
QPixmap pixmap1(500,500);
//实例化一个画家对象
QPainter painter1;
painter1.begin(&pixmap1);
//默认背景是黑色
//将默认背景改为白色
pixmap1.fill(Qt::white);
//设置画家画笔颜色
painter1.setPen(QPen(Qt::red));
//设置填充格式
painter1.setBrush(QBrush(Qt::cyan,Qt::DiagCrossPattern));
//设置画笔宽度
QPen pen1(Qt::red);
pen1.setWidth(5);
pen1.setStyle(Qt::CustomDashLine);
painter1.setPen(pen1);
//绘制一个圆
painter1.drawEllipse(QPoint(250,250),100,100);
//保存文件
pixmap1.save("D:\\QT\\09NINE\\pixmap1.jpg");
//结束painter1
painter1.end();
注意:直接这样写会提示:画板设备没有释放
解决方案:不使用painter1指针+begin与end函数
image设备提供了像素级的图片访问功能
1.在指定磁盘位置绘制image图片
QImage image1(500,500,QImage::Format_RGB32);
QPainter painter2(&image1);
//默认背景是黑色
//将默认背景改为白色
image1.fill(Qt::white);
2.对图片进行像素级修改
void mydevice::paintEvent(QPaintEvent* ev)
{
//如果想在窗口绘图,只能重写paintEvent函数
//创建painter3,并且把窗口指定为父类
QPainter* painter3 = new QPainter(this);
//利用image对图片像素进行修改
//添加资源文件
//在窗口中绘图进行修改
//创建一个image类型的对象
QImage image2;
//利用该对象加载资源图片
image2.load(":/resour/02.jpg");
//对像素进行处理
int i = 0;
int j = 0;
for(i=0;iwidth();i++)
{
for(j=0;jheight();j++)
{
QRgb value = qRgb(255,0,0);
image2.setPixel(i,j,value);
}
}
//painter3将image画出来
painter3->drawImage(0,0,image2);
}
picture可以记录和重现绘图指令
1.记录绘图信息
//创建picture对象
QPicture picture1;
//创建painter3
QPainter painter3;
//开始记录
painter3.begin(&picture1);
//调节画笔颜色
painter3.setPen(Qt::cyan);
//绘制矩形
painter3.drawRect(200,200,100,100);
//结束
painter3.end();
//保存picture
picture1.save("D:\\QT\\09NINE\\picture.zt");
2.在绘图窗口重现绘图
//重写绘画函数
void mydevice::paintEvent(QPaintEvent* )
{
//重新创建一个对象
QPicture picture2;
//加载之前的绘图信息
picture2.load("D:\\QT\\09NINE\\picture.zt");
//利用画家重现绘图步骤
QPainter painter4(this);
//绘制picture
painter4.drawPicture(0,0,picture2);
}
以上便是全部内容!!!欢迎大家交流学习!!!