Qt 2D绘图(4):填充原理
本文为原创文章,转载请注明出处,或注明转载自“黄邦勇帅(原名:黄勇)
本文出自本人原创著作《Qt5.10 GUI完全参考手册》网盘地址:
https://pan.baidu.com/s/1iqagt4SEC8PUYx6t3ku39Q
《C++语法详解》网盘地址:https://pan.baidu.com/s/1dIxLMN5b91zpJN2sZv1MNg
若对C++语法不熟悉,建议参阅本人所著《C++语法详解》一书,电子工业出版社出版,该书语法示例短小精悍,对查阅C++知识点相当方便,并对语法原理进行了透彻、深入详细的讲解,可确保读者彻底弄懂C++的原理,彻底解惑C++,使其知其然更知其所以然。此书是一本全面了解C++不可多得的案头必备图书。
需要使用到的QPainter类中的函数原型如表12-17所示
当绘制封闭的形状时,在其内部可以填充各种颜色、图案等属性。但并不是所有封闭形状都可以被填充,比如使用QPainter::drawLine()函数绘制的封闭形状就不能被填充,以下把可被填充的形状,称为填充区域。
使用QPainter对象绘制的直线、弧不是填充区域,使用QPainter对象绘制的矩形、椭圆、弦、扇形是填充区域,使用路径QPainterPath绘制的图形是填充区域。另外,使用QPen绘制的轮廓也是可被填充的。
注意:填充区域不一定有轮廓线,比如使用Qt::NoPen画笔样式绘制的填充区域就没有轮廓线。
使用画刷可向填充区域中填充颜色、图案、渐变等属性。
要填充虚线的空白和字体背景,需要使用setBackground()函数设置背景画刷,且还需使用setBackgroundMode()函数把背景模式设置为Qt::OpaqueMode(不透明),详见示例12.16
画刷原点对于使用渐变填充的区域和使用画刷填充纹理图案时会有一定影响,详见示例12.17。
示例12.16:填充直线、虚线的空白处、字体背景(运行结果见图12-49)
void paintEvent(QPaintEvent *e){
QPainter pr(this);
QLinearGradient g(QPointF(11,11),QPointF(155,11)); //创建直线渐变
g.setColorAt(0,QColor(111,255,255)); //青色
g.setColorAt(0.5,QColor(111,1,1)); //红色
g.setColorAt(1,QColor(255,255,1)); //黄色
g.setSpread(QGradient::RepeatSpread); //渐变重复传播
//创建两个画刷
QBrush bs(g); QBrush bs1(QColor(1,111,1)); //bs1为绿色
//设置画笔
QPen pn;
pn.setCapStyle(Qt::FlatCap); //该端头样式可消除端头延长部分的影响
pn.setWidth(10); //线宽
pn.setStyle(Qt::DashLine); //设置为虚线
pn.setBrush(bs); //设置画笔的画刷为bs(渐变色)
pr.setPen(pn); //设置画笔
QFont f; f.setPointSize(33); pr.setFont(f); //设置字体
pr.setBackground(bs1); //设置背景画刷为bs1(纯绿色)
pr.setBackgroundMode(Qt::OpaqueMode); //设置背景模式为不透明
pr.drawText(11,111,"FFXXXXF"); //绘制文字
pr.drawLine(11,33,513,33); } //绘制直线(虚线)
示例12.17:画刷原点与渐变填充
//该示例效果见图12-50
void paintEvent(QPaintEvent *e){
QPainter pr(this);
QLinearGradient g(QPointF(0,11),QPointF(155,11));
g.setColorAt(0,QColor(111,1,1)); //红色
g.setColorAt(0.5,QColor(1,111,1)); //绿色
g.setColorAt(1,QColor(255,255,1)); //黄色
g.setSpread(QGradient::RepeatSpread); //重复传播
QBrush bs(g); pr.setBrush(bs);
pr.setBrushOrigin(111,111); //设置画刷原点
pr.drawRect(11,11,333,222);
pr.drawLine(111,0,111,444); }
示例12.18:画刷原点与纹理图案(效果见图12-51)
void paintEvent(QPaintEvent *e){
QPainter pr(this);
QBrush bs1(QPixmap("F:/5b.png"));
pr.setBrush(bs1);
pr.setBrushOrigin(111,111); //把画刷原点设置为与矩形的左上角相同,以使画刷从
//图片5b.png的左上角开始填充矩形。
pr.drawRect(111,111,400,300); }
本文作者:黄邦勇帅(原名:黄勇)