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);