qt 绘图QPainter

QPainter绘图系统

QPainter用来进行绘图操作的类。绘图设备一般包括Qwidget、Qpixmap、QImage.他们提供给QPainter画布。
QPaintDevice是一个可以使用QPainter进行绘图的抽象二维界面。
QPaintEngine给QPainter提供在不同设备上绘图的接口,QPaintEngine类由QPainter和QPaintDevice内部使用,应用程序一般无需使用QPaintEngine。
绘图设备包括QWidget、QPixmap、QImage等。
paintEvent世界和绘图区
QWidget类及其子类是最常用的绘图设备,从QWidget类继承的类都有paintEvent()事件,只需要重定义此事件就行。  相当于windows mfc的onpaint函数。

只要窗口部件需要被重绘就被调用。是repaint()或update()的结果。 几次调用update()的结果通常仅仅是一次paintEvent()调用。 Qt通常在paintEvent()调用之前擦除这个窗口部件的区域。

update()相当于 mfc 的invalidate();迫使paintEvent虚函数被调用。

QWidget绘图区就是其窗口内部区域。坐标系统的单位是像素。左上角坐标为(0,0)。这个坐标系统是物理坐标,称为视口(viewport)坐标。

高度:QWidget::height()

宽度:QWidget::width()

设置qwidget窗口大小的函数

1.setMinimumSize  setMaximumSize

2.resize

3.setFixedSize

QPainter绘图主要属性

QPen:画笔,用于控制线条的颜色、宽度等。   

setPen、setStyle(线条样式)、setCapStyle(线条端点样式)、setJoinStyle(线条连接样式)

QBrush:画刷,用于填充颜色、渐变特性等。

  setBrush、setStyle(填充样式)

渐变色:

线性渐变:QLinearGradient

辐射渐变:QRadialGradient

圆锥形渐变:QConicalGradient

//线性渐变
    QLinearGradient  linearGrad(0,0,100,0);//从左到右,
    linearGrad.setColorAt(0,Qt::yellow);//起点颜色
    linearGrad.setColorAt(1,Qt::green);//终点颜色
    linearGrad.setSpread(QGradient::PadSpread);  //展布模式
    painter.setBrush(linearGrad);

QFont:字体属性,用于绘制文字时,设置文字的样式、大小等 

setFont

绘图

点:drawPoint()、drawPoints()、

线:drawLine()、

区域:drawRect()

文本:drawText()

Qt提供了处理图像数据的类:QImage, QPixmap和QPicture。

  • QImage是为I/O和直接像素访问和操作而设计和优化的
  • QPixmap是为在屏幕上显示图像而设计和优化的。
  • QPicture类是一个记录和回放QPainter命令的绘制设备。

drawPicture: QPicture 

 QPicture picture;
 QPainter painter;
 painter.begin(&picture);           // paint in picture
 painter.drawEllipse(10,20, 80,70); // draw an ellipse
 painter.end();                     // painting done
 picture.save("drawing.pic");       // save picture


QPicture picture;
QPainter painter;
picture.load("drawing.pic");
painter.begin(this);
painter.drawPicture(0,0,picture);
painter.end();

drawPixmap:   QPixmap

QPixmap绘图依赖硬件,QPixmap的设计本来就是用来加速显示,用paint绘图时用QPixmap会比其他类的效果好很多。一般小图片用QPixmap加载,和平台相关(在不同的平台可能绘制出的效果不一样)。QPixmap上绘图比较慢,但显示它则比较快(使用GPU处理,相对减轻了CPU的负担).

可以直接使用构造函数,关联资源 ,如 QPixmap(":/res/python.jpg");也可以使用load、save进行加载或保存。

load() 加载图像文件作为QPixmap对象
save() 将QPixmap对象保存为文件
    QRect rect1(0,0,100,100);
    paint.drawPixmap(rect1,QPixmap(tr(":/res/about.png")));

drawImage   QImage

QImage类提供了一个独立于硬件的图像表示,它允许直接访问像素数据,并且可以用作绘制设备;适合加载大图片;可以在线程中绘图,可以优化UI响应时间。绘制图片出来的效果和平台无关,QImage上绘图比较快,但显示它则比较慢。

QImage的基本函数的使用与QPixmap类似,可以直接使用构造函数,关联资源

    QRect rect2(100,0,100,100);
    paint.drawImage(rect2,QImage(tr(":/res/about.png")));

QPixmap与QImage的区别:

QPixmap依赖于硬件,QImage不依赖于硬件。

QPixmap主要是用于绘图,针对屏幕显示而最佳化设计,QImage主要是为图像I/O、图片访问和像素修改而设计的。
当图片小的情况下,直接用QPixmap进行加载,画图时无所谓,当图片大的时候如果直接用QPixmap进行加载,会占很大的内存,一般一张几十K的图片,用QPixmap加载进来会放大很多倍。

所以一般图片大的情况下,用QImage进行加载,然后转乘QPixmap用户绘制。QPixmap绘制效果是最好的。

QImage image = pixmap.toImage();
QPixmap pixmap = QPixmap::fromImage(image);

坐标平移:translate

坐标旋转:rotate

缩放:scaled

状态保存 save

状态恢复    restore

恢复所有操作: resetTransform

坐标

物理坐标:

即视口坐标,setviewport  默认情况下,视口等于绘图设备的整个矩形区。单位为像素、

逻辑坐标:

窗口坐标,中心为原点(0,0)setwindow  如果想不用管实际物理坐标范围大小,可通过设置成窗口坐标来绘图。这是设备大小变化时,绘制的图片也自动变化大小。

调用setwindow后,后面用到的坐标都是按逻辑坐标来算了的。是按比例缩放

void Widget::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event);
    QPainter    painter(this);

    int W=width();
    int H=height();

    int side=qMin(W,H);//去长和宽的小值
    QRect rect((W-side)/2, (H-side)/2,side,side); //viewport矩形区
    painter.drawRect(rect); //Viewport大小

    painter.setViewport(rect);//设置Viewport
    painter.setWindow(-100,-100,200,200); // 设置窗口大小,逻辑坐标

    painter.setRenderHint(QPainter::Antialiasing);

//设置画笔
    QPen    pen;
    pen.setWidth(1); //线宽
    pen.setColor(Qt::red); //划线颜色
    //Qt::NoPen,Qt::SolidLine, Qt::DashLine, Qt::DotLine,Qt::DashDotLine,Qt::DashDotDotLine,Qt::CustomDashLine
    pen.setStyle(Qt::SolidLine);//线的类型,实线、虚线等
    //Qt::FlatCap, Qt::SquareCap,Qt::RoundCap
    pen.setCapStyle(Qt::FlatCap);//线端点样式
    //Qt::MiterJoin,Qt::BevelJoin,Qt::RoundJoin,Qt::SvgMiterJoin
    pen.setJoinStyle(Qt::BevelJoin);//线的连接点样式
    painter.setPen(pen);

    painter.setCompositionMode(QPainter::CompositionMode_Difference);

    for(int i=0; i<36;i++)
    {
        painter.drawEllipse(QPoint(50,0),50,50);
        painter.rotate(10);
    }
}

裁剪区域   setClipRegion

延伸:设置widget的背景图片的办法

1.在paintEvent事件中绘制图片

void Widget::paintEvent(QPaintEvent * ev)
{
	QPainter painter(this);
	painter.drawPixmap(rect(),QPixmap(":/bg.jpg"),QRect());
}

缺点就是要使用paintEvent事件需要新建一个类,不适合子窗口

2.使用调色板QPalette来设置图片

QPalette pal =this->palette();
pal.setBrush(QPalette::Background,QBrush(QPixmap(":/bg.jpg")));
setPalette(pal);

3.使用样式表(setStyleSheet)

setStyleSheet("border-image:url(:/bg.jpg)");


 

你可能感兴趣的:(qt,qt,开发语言)