Qt的绘图系统
绘图概念
图系统基于QPainter,QPainterDevice和QPaintEngine三个类
QPainter(画家) 使用QPaintEngine(绘图工具)在QPainterDevice(绘图设备)上画画。
注意:
1、如果在主窗口上绘画 必须在绘图事件(paintEvent)中完成画画.
2、绘图事件 调用的时机(1、窗口加载 2、update())
widget.h的类中:
widget.cpp
案例:画一个背景图(画家的方法)
QPainter画家的方法:
在widget.cpp的绘图事件中:
//重写绘图事件 主窗口加载的时候 调用
void Widget::paintEvent(QPaintEvent *event)
{
//定义一个画家 画图片
QPainter *painter = new QPainter(this);
//定义一个图片控件
QPixmap pix;
pix.load(":/image/Sunny.jpg");
//修改图片大小(和窗口一样大)
pix.scaled(this->width(),this->height());
//画家在主窗口绘画
painter->drawPixmap(0,0,this->width(),this->height(), pix);
}
运行结果:
案例:通过update()重新加载绘图事件
ui文件:
widget.h文件声明 画图时间函数
widget.cpp的构造函数中 让按钮动起来
widget.cpp的paintEvent绘图事件:
//重写绘图事件
void Widget::paintEvent(QPaintEvent *event)
{
static int x = 0;
//定义一个画家
QPainter *painter = new QPainter(this);
//定义一个图片控件
QPixmap pix;
pix.load(":/image/sunny.png");
pix.scaled( pix.width()*0.5, pix.height()*0.5);
//画家绘图
//drawPixmap前两个参数是起点坐标
painter->drawPixmap(x,0, pix.width(), pix.height(),pix);
x+=2;
if(x >= this->width())
{
x = 0;
}
}
2、画家的其他绘制函数
1、划线drawLine
//划线
painter->drawLine(0,0,200,200);
2、画矩形
//画家对 画笔进行设置
//设置画笔颜色
设置样式:
//画矩形
//画家对 画笔进行设置
//painter->setPen(Qt::DotLine);//样式
painter->setPen(Qt::red);//颜色 红色
painter->drawRect(50,50,100,100);
运行结果:
3、画圆
//画圆
painter->drawEllipse(150,150,200,200);
//画椭圆
painter->drawEllipse(200,400,200,100);
运行结果:
3、绘图设备
案例1:QBitmap
在widget.cpp的构造函数中:
运行结果:
案例2:image的像素操作
在QImage类中:
在widget.cpp的构造函数中:
#if 1
//定义QIamge一个绘图设备
QImage img;
img.load(":/image/up.png");//事先添加资源
for(int i=50;i<100;i++)
{
for(int j=50;j<100;j++)
{
int value= qRgb(255,0,0);
img.setPixel(i,j, value);
}
}
//定义一个画家
QPainter painter(&img);
painter.drawEllipse(QPoint(30,30),30,30);
//保存图片
img.save("C:\\work\\qt\\day21\\02_test\\imge02.jpg");
#endif
运行结果:
案例:重现绘图指令QPicture
在widget.cpp的构造函数中(保存绘图指令)
#if 1
//绘图设备
QPicture picture;
//画家
QPainter painter;
//记录绘图指令
painter.begin(&picture);
painter.drawEllipse(100,100,100,100);
//结束记录绘图指令
painter.end();
//保存绘图指令
picture.save("C:\\work\\qt\\day21\\02_test\\pic.zl");
#endif
运行结果:
重现pic.zl 到主窗口中(绘图事件中完成)
在widget.cpp的绘图事件中写
#if 1
QPicture picture;
QPainter painter(this);
//绘图设备picture 加载绘图指令
picture.load("C:\\work\\qt\\day21\\02_test\\pic.zl");
//画家根据 绘图指令绘图
painter.drawPicture(100,100, picture);
#endif
运行结果: