当前位置: 首页 > news >正文

Qt绘图案例

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

案例一:画背景图片

在头文件中在protect保护类型中添加paintEvent函数,paintEvent是一个虚函数,重写需要函数名,函数参数,返回值都相同。

    void paintEvent(QPaintEvent *);

在.cpp文件中先添加头文件

#include <QPainter>

实现paintEvent函数绘制背景图片

第一种方法:

void Widget::paintEvent(QPaintEvent *)
{
    QPainter p(this);
    p.drawPixmap(0,0,width(),height(),QPixmap("../image/picture.jpg"));
}

如上图,我们需要用QPainter 定义一个变量p,后面是绘图设备

调用drawPixmap,前两个是坐标原点,0,0点事窗口左上角。width和height是Widget的宽度和高度。最后一个参数QPixmap函数中的参数有一个是绘制图片的路径,当然也可以用加载资源的方法。我们这里需要提前把图片资源放在和项目文件夹的同一路径下。如下图:

第二种方法:

void Widget::paintEvent(QPaintEvent *)
{
    QPainter p;
    p.begin(this);
    p.drawPixmap(rect(),QPixmap("../image/picture.jpg"));
    p.end();
}

第二种方法中没有像第一种方法中那样,在定义QPainter p时指定p的设备。可以像上图那样,先定义,再通过begin和end函数来实现。绘图操作需要在begin和end函数中间进行。这里用到drawPixmap的另一个构造函数,其中第一个参数rect()函数是获取矩形区域,这里就是指对话框区域。

下面是两个方法实现的效果图,我的image文件夹内的名为picture.jpg图片成为对话框的背景。

案例二:画线和图形

和案例一差不多,我们一样在头文件类中创建一个画家QPainterEvent

protected:
    void paintEvent(QPaintEvent *);

如下图,我们还在private里面添加了一个x变量,这个是我们我们后面用到的和现在的没什么关系。

我们在.cpp文件中添加包含

#include <QPainter>//画家
#include <QPen>//线条颜色,风格
#include <QBrush>//可以填充颜色

 

然后继续在该文件中添加如下代码

void Widget::paintEvent(QPaintEvent *)
{
    QPainter p;
    p.begin(this);
    //定义画笔
    QPen pen;
    pen.setWidth(5);//设置线宽
    //pen.setColor(Qt::red);//第一种方法设置颜色,不过此方法颜色有限
    pen.setColor(QColor(14,9,234));//第二种方法,rgb设置颜色,可以自己调色
    pen.setStyle(Qt::DashLine);//设置风格,这个风格产生虚线

    p.setPen(pen);//把画笔交给画家

    //画直线
    p.drawLine(50,50,150,50);
    p.drawLine(50,50,50,150);

    //创建画刷对象
    QBrush brush;
    brush.setColor(Qt::red);//设置颜色
    brush.setStyle(Qt::Dense1Pattern);//设置风格

    //把画刷交给画家
    p.setBrush(brush);

    //画矩形
    p.drawRect(150,150,100,50);

    //画圆形
    p.drawEllipse(QPoint(150,150),50,25);

    //画笑脸
    p.drawPixmap(x,180,80,80,QPixmap("../image/face.png"));


    p.end();
}

代码中有详细注释,点击运行,会得到画图结果,当然首先你需要有一个笑脸的图片,也可以随便找一个图片做实验。

案例三:我们添加一个按钮,每按一次按钮,让上面的笑脸向右水平移动

首先双击左面的界面文件

然后拖进去一个按钮,在按钮上右击转到槽

这样我们定义的x就能派上用场

首先在构造函数里面让x的值为0

在槽函数内添加代码

void Widget::on_pushButton_clicked()
{
    x += 20;
    if(x>width())
    {
        x = 0;
    }
    //刷新窗口,让窗口重绘
    update();//间接调用paintEvent()

}

运行结果,按一次按钮,笑脸向右移动

转载于:https://my.oschina.net/startstorm/blog/852295

相关文章:

  • U3D Invoke() IsInvoking CancelInvoke方法的调用
  • 我们在压力中成长
  • ACE ADMIN中 JQGrid Table(简单实用)
  • 如何从文件读取显示位图?
  • yii2 基本的增删改查
  • *setTimeout实现text输入在用户停顿时才调用事件!*
  • Linux随机生成密码的10种方法
  • 限制用户输入的方法
  • C++11 tuple的使用
  • 在VS2003中部署Crystal Report 10
  • 我的测试生活感悟2 - Art Of Unit Testing
  • 牛客---java练习
  • 今天晨跑了,呵呵
  • 素数
  • .net 简单实现MD5
  • 【Leetcode】104. 二叉树的最大深度
  • Angular 2 DI - IoC DI - 1
  • C# 免费离线人脸识别 2.0 Demo
  • Cumulo 的 ClojureScript 模块已经成型
  • Elasticsearch 参考指南(升级前重新索引)
  • miaov-React 最佳入门
  • nodejs:开发并发布一个nodejs包
  • Octave 入门
  • PHP CLI应用的调试原理
  • Promise面试题2实现异步串行执行
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • React+TypeScript入门
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • sublime配置文件
  • 浮现式设计
  • 今年的LC3大会没了?
  • 码农张的Bug人生 - 初来乍到
  • 那些被忽略的 JavaScript 数组方法细节
  • 前端js -- this指向总结。
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 数组的操作
  • 探索 JS 中的模块化
  • const的用法,特别是用在函数前面与后面的区别
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • ​TypeScript都不会用,也敢说会前端?
  • ​比特币大跌的 2 个原因
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • #pragma 指令
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (一)认识微服务
  • (转载)深入super,看Python如何解决钻石继承难题
  • **PHP分步表单提交思路(分页表单提交)
  • .NET 材料检测系统崩溃分析
  • .NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景
  • .netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项
  • .NETCORE 开发登录接口MFA谷歌多因子身份验证
  • .NET分布式缓存Memcached从入门到实战