博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
QT——QT图形片
阅读量:6505 次
发布时间:2019-06-24

本文共 3915 字,大约阅读时间需要 13 分钟。

hot3.png

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

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

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

//1.在mainwindow.h文件中添加重绘事件处理函数的声明:protected:void paintEvent(QPaintEvent *);//所有的绘制操作都要在这个函数里面完成。//2.下面到mainwindow.cpp文件中先需要添加头文件包含:#include 
//然后添加该函数的定义: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);

绘制文字

绘制路径

绘制图片

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

坐标系统

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

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

转载于:https://my.oschina.net/zengjs275/blog/540448

你可能感兴趣的文章
《iOS创意程序设计家》——导读
查看>>
spring-aop
查看>>
android RecycleView Adapter简单封装
查看>>
PgSQL · 案例分享 · 递归收敛优化
查看>>
Dart的数据库操作
查看>>
Codeforces 591 B Rebranding【Codeforces Round #327 (Div. 2)】
查看>>
命名难,难于上青天
查看>>
做完和做好不一样
查看>>
APUE读书笔记-05标准输入输出库(7)
查看>>
23 第一周作业
查看>>
DNS解析偶尔延迟
查看>>
iOS打电话,发短信,发邮件,打开网址
查看>>
06-验证码-基本功能实现
查看>>
Java数据结构与算法(六) 希尔排序
查看>>
canvas学习笔记
查看>>
IntelliJ Idea下Go项目开启Debug调试
查看>>
elasticsearch安装步骤
查看>>
PHP获取Cookie模拟登录CURL(转)
查看>>
PHP-权限控制类(转)
查看>>
CSS3秘笈第三版涵盖HTML5学习笔记9~12章
查看>>