您的位置:首页 > 编程语言 > Qt开发

QT——QT图形片

2015-12-07 00:00 417 查看
QPainter可以绘制一切想要的图形,从最简单的一条直线到其他任何复杂的图形,它还可以用来绘制文本和图片。QPainter可以在继承自QPaintDevice类的任何对象上进行绘制操作。

QPainter一般在一个部件的重绘事件(Paint Event)的处理函数paintEvent()中进行绘制所有的绘制操作都要在这个函数里面完成。首先要创建QPainter对象,然后进行图形的绘制,最后销毁QPainter对象。

QPoint类的点为整形, QPointF类的点为浮点型

//1.在mainwindow.h文件中添加重绘事件处理函数的声明:
protected:
void paintEvent(QPaintEvent *);
//所有的绘制操作都要在这个函数里面完成。

//2.下面到mainwindow.cpp文件中先需要添加头文件包含:
#include <QPainter>
//然后添加该函数的定义:
void MainWindow::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.drawLine(QPointF(0, 0), QPointF(100, 100));
/*
...
所有绘图都要在这个函数里完成
...
*/
}


画笔和画刷

void MainWindow::paintEvent(QPaintEvent *)
{
QPainter painter(this);
QPen pen; //画笔
pen.setColor(QColor(255, 0, 0));
pen.setStyle(Qt::DotLine);
QBrush brush(QColor(0, 255, 0, 125)); //画刷
//QBrush brush(Qt::blue);//预定义颜色
brush.setStyle(Qt::HorPattern);
painter.setPen(pen); //添加画笔
painter.setBrush(brush); //添加画刷
painter.drawRect(50, 50, 200, 100); //绘制矩形
}

//设置画笔和画刷样式可以用pen.setStyle()和brush.setStyle(Qt::HorPattern)来改变
//具体见帮助文档的示例


渐变填充

QGradient类就是用来和QBrush一起指定渐变填充的。Qt现在支持三种类型的渐变填充:

线性渐变(子类QLinearGradient)在开始点和结束点之间插入颜色;

辐射渐变(子类QRadialGradient)在焦点和环绕它的圆环间插入颜色;

锥形渐变(子类QConicalGradient)在圆心周围插入颜色。

void MainWindow::paintEvent(QPaintEvent *)
{
//线性渐变
QLinearGradient linearGradient(QPointF(40, 190), QPointF(70, 190));
//这个长度将按照比例变化为0-1之间。
//插入颜色
linearGradient.setColorAt(0, Qt::yellow);
linearGradient.setColorAt(0.5, Qt::red);
linearGradient.setColorAt(1, Qt::green);
//指定渐变区域以外的区域的扩散方式,见帮助文档
linearGradient.setSpread(QGradient::RepeatSpread);
//使用渐变作为画刷
QPainter painter(this);
painter.setBrush(linearGradient);
painter.drawRect(10, 20, 90, 40);
}

//辐射渐变
/*对于辐射渐变需要指定圆心center和半径radius,这样就确定了一个圆,然后再指定一个焦点focalPoint。焦点的位置为0,圆环的位置为1,然后在焦点和圆环间插入颜色。辐射渐变也可以使用setSpread()函数设置渐变区域以外的区域的扩散方式,三种扩散方式的效果如下图所示*/
QRadialGradient radialGradient(QPointF(100, 190),50,QPointF(275,200));
radialGradient.setColorAt(0, QColor(255, 255, 100, 150));
radialGradient.setColorAt(1, QColor(0, 0, 0, 50));
painter.setBrush(radialGradient);
painter.drawEllipse(QPointF(100, 190), 50, 50);

//锥形渐变
/*对于锥形渐变需要指定中心点center和一个角度angle(其值在0到360之间),然后沿逆时针从给定的角度开始环绕中心点插入颜色。这里给定的角度沿逆时针方向开始的位置为0,旋转一圈后为1。setSpread()函数对于锥形渐变没有效果。*/
QConicalGradient conicalGradient(QPointF(250, 190), 60);
conicalGradient.setColorAt(0.2, Qt::cyan);
conicalGradient.setColorAt(0.9, Qt::black);
painter.setBrush(conicalGradient);
painter.drawEllipse(QPointF(250, 190), 50, 50);


绘制文字

http://bbs.qter.org/forum.php?mod=viewthread&tid=98&extra=page%3D2%26filter%3Dauthor%26orderby%3Ddateline%26orderby%3Ddateline

绘制路径

http://bbs.qter.org/forum.php?mod=viewthread&tid=100&extra=page%3D1%26filter%3Dauthor%26orderby%3Ddateline%26orderby%3Ddateline

绘制图片

Qt提供了四个类来处理图像数据:QImage、QPixmap、QBitmap和QPicture,它们也都是常用的绘图设备。

QImage主要用来进行I/O处理,它对I/O处理操作进行了优化,而且也可以用来直接访问和操作像素;

QPixmap主要用来在屏幕上显示图像,它对在屏幕上显示图像进行了优化;

QBitmap是QPixmap的子类,它是一个便捷类,用来处理颜色深度为1的图像,即只能显示黑白两种颜色;

QPicture用来记录并重演QPainter命令。这一节我们只讲解QPixmap。

//一画图
QPainter painter(this);
QPixmap pix;
pix.load("../painter_2/logo.png");//相对路径,也可以使用绝对路径,不过最好使用资源文件来存放图片
painter.drawPixmap(0, 0, 129, 66, pix);
//二平移图片
//QPainter类中的translate()函数实现坐标原点的改变,改变原点后,此点将会成为新的原点(0,0)
painter.translate(100, 100); //将(100,100)设为坐标原点
painter.drawPixmap(0, 0, 129, 66, pix);
//三缩放图片
qreal width = pix.width(); //获得以前图片的宽和高
qreal height = pix.height();
//将图片的宽和高都扩大两倍,并且在给定的矩形内保持宽高的比值不变
pix = pix.scaled(width*2, height*2, Qt::KeepAspectRatio);//保持比例
painter.drawPixmap(70, 70,pix);
//四、旋转图片
/*旋转使用的是QPainter类的rotate()函数,它默认是以原点为中心进行旋转的。我们要改变旋转的中心,可以使用前        面讲到的translate()函数完成。*/
painter.translate(64, 33); //让图片的中心作为旋转的中心
painter.rotate(90); //顺时针旋转90度
painter.translate(-64,-33); //使原点复原
painter.drawPixmap(100, 100, 129, 66, pix);
//五、扭曲图片
//面的参数实现横行变形,后面的参数实现纵向变形。当它们的值为0时,表示不扭曲。
painter.shear(0.5, 0); //横向扭曲
painter.drawPixmap(100, 0, 129, 66, pix);


坐标系统

http://bbs.qter.org/forum.php?mod=viewthread&tid=116&extra=page%3D1%26filter%3Dauthor%26orderby%3Ddateline%26orderby%3Ddateline

窗口坐标系统放大和画布坐标系统放大的区别,窗口放大会出现颗粒感。

QPainter painter(this) ;//this就表明了是在窗口上进行绘图
QPixmap pix(200, 200);//画布
pix.fill(Qt::red);
//新建QPainter类对象,在pix上进行绘图
QPainter pp(&pix);//重新认识,实在哪个对象上画图
//在pix上的(0,0)点和(50,50)点之间绘制直线
pp.drawLine(0, 0, 50, 50);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: