QT学习记录(三)绘图

按照下面两个教程学习

QT学习教程(全面)_Strive--顾的博客-CSDN博客_qt学习

天山老妖S的博客_QT开发(3)_51CTO博客

1、绘图

VC项目右键增加QT GUI Class,在QT Designer中编辑DlgDraw.ui

在DlgDraw中重载函数

void DlgDraw::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.drawLine(QPointF(0, 0), QPointF(100, 100));
}

 QT学习(5) 手动窗口重绘_qt 窗口重绘_Memories off的博客-CSDN博客

void DlgDraw::paintEvent(QPaintEvent *)
{
    if (nDraw == 1)//画线
    {
        QPainter painter(this);
        painter.drawLine(QPointF(0, 0), QPointF(100, 100));
    }
    if (nDraw == 2)//画笔和画刷
    {
        QPainter painter(this);
        QPen pen(Qt::DotLine);
        QBrush brush(Qt::blue);
        brush.setStyle(Qt::HorPattern);
        painter.setPen(pen);
        painter.setBrush(brush);
        painter.drawRect(50, 50, 200, 200);
    }
    if (nDraw == 3)//画弧
    {
        QRectF rectangle(10.0, 20.0, 80.0, 60.0); //矩形
        int startAngle = 30 * 16;     //起始角度
        int spanAngle = 120 * 16;   //跨越度数
        QPainter painter(this);
        painter.drawArc(rectangle, startAngle, spanAngle);
    }
    nDraw = 0;
}

 

 

 

生成图片

if (nDraw == 7)
    {
        QPainter painter(this);
        QPixmap pix;
        QString path1 = QDir::currentPath()+"/images/ai.jpg";
        //QImageReader reader(path1);
        //reader.setDecideFormatFromContent(true);
        //QPixmap pix = QPixmap::fromImage(reader.read());
        //label->setPixmap(img);

        if (pix.load(path1))
        {
            ui.label1->setPixmap(pix);

            painter.drawPixmap(20, 20, 100, 120, pix);

            //将(100,100)设为坐标原点
            painter.translate(100, 100);
            painter.drawPixmap(0, 0, 80, 100, pix);

            //获得以前图片的宽和高
            qreal width = pix.width();
            qreal height = pix.height();
            //将图片的宽和高都缩小,并且在给定的矩形内保持宽高的比值不变
            pix = pix.scaled(width*0.2, height*0.2,
                Qt::KeepAspectRatio);
            painter.drawPixmap(90, 90, pix);

            //让图片的中心作为旋转的中心
            painter.translate(40, 50);
            painter.rotate(90); //顺时针旋转90度
            painter.translate(-40, -50); //使原点复原
            painter.drawPixmap(100, 100, 80, 100, pix);

            painter.shear(0.5, 0); //横向扭曲
            painter.drawPixmap(100, 0, 80, 100, pix);
        }

        运行以后,ai美女图片竟然不显示,必应搜索了一下,有的说是路径不对,有的说qmake一下,有的说不能随便改图片文件的扩展名。除了qmake以外,我都尝试了一遍,结果还是不显示,最后受qmake启发,在VC中将程序清理重新生成一遍,点击图片按钮,图片就显示出来了。

坐标系统

 涂鸦板

        增加放大功能,鼠标轨迹与图形出现偏离。窗口的坐标扩大了,但是画布的坐标并没有扩大,而我们画图用的坐标值是鼠标指针的,鼠标指针又是获取的窗口的坐标值。现在窗口和画布的同一点的坐标并不相等,所以就出现了这样的问题。

在画布上画矩形会出现下图的重影现象

原因是在我们拖动鼠标的过程中,屏幕已经刷新了很多次,也可以理解为paintEvent()函数执行了多次,每执行一次就会绘制一个矩形。

解决方法就是双缓冲绘图。鼠标按键还没有释放的时候,在辅助画布上绘图,当鼠标按键释放的时候,在真正的画布上绘图。

 图形视图框架

如果想要视图在当前窗口,使用下面的语句定义视图:

// 视图
    QGraphicsView *view = new QGraphicsView(this);

 否则,生成新的子窗口作为新视图的窗口。

下面的语句报错:
        color = qvariant_cast(event->mimeData()->colorData());

QT 错误    C2672    “qvariant_cast”: 未找到匹配的重载函数

改成:

color = qvariant_cast<QColor>(event->mimeData()->colorData());

设置scene的范围

scene->setSceneRect(QRectF(0, 0, 300, 300));

鼠标点击,图形右移,敲击键盘,图像下移

如果想用鼠标拖动矩形,在MyItem的构造函数中增加如下语句:

setFlag(QGraphicsItem::ItemIsMovable);

碰撞检测

 动画,绕着左上角坐标偏移一定距离旋转。

比如

QRectF MyItem::boundingRect() const
{
    qreal penWidth = 1;
    return QRectF(0 - penWidth / 2, 0 - penWidth / 2,
        20 + penWidth, 20 + penWidth);
}

void MyItem::paint(QPainter *painter,
    const QStyleOptionGraphicsItem *option,
    QWidget *widget)
{
    Q_UNUSED(option);  //标明该参数没有使用
    Q_UNUSED(widget);
    //painter->setBrush(Qt::red);
    //如果与其他图形项碰撞则显示红色,否则显示绿色
    painter->setBrush(!collidingItems().isEmpty() ? Qt::red : Qt::green);
    painter->drawRect(0, 0, 20, 20);
}

绕着左上角旋转

比如

QRectF MyItem::boundingRect() const
{
    qreal penWidth = 1;
    return QRectF(10 - penWidth / 2, 10 - penWidth / 2,
        20 + penWidth, 20 + penWidth);
}

void MyItem::paint(QPainter *painter,
    const QStyleOptionGraphicsItem *option,
    QWidget *widget)
{
    Q_UNUSED(option);  //标明该参数没有使用
    Q_UNUSED(widget);
    //painter->setBrush(Qt::red);
    //如果与其他图形项碰撞则显示红色,否则显示绿色
    painter->setBrush(!collidingItems().isEmpty() ? Qt::red : Qt::green);
    painter->drawRect(10, 10, 20, 20);
}

 表示,绕着左上角旋转,但是旋转半径为10。

 场景层

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/22248.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++之堆排

堆排的原理和结构&#xff1a; 堆排序是一种常见的排序算法&#xff0c;基于堆这种数据结构实现。堆是一种特殊的树形数据结构&#xff0c;它满足以下两个条件&#xff1a; 堆是一棵完全二叉树。 堆的任意节点的值&#xff0c;都必须大于等于&#xff08;或小于等于&#xff0…

基于ROS2的costmap中Obstacle Layer中对障碍物信息的增加与删除机制的方案调研。

文章目录 1.背景2.目标3. 障碍物信息添加方式发送数据的数据结构与接收数据的数据结构 4. 障碍物清理机制4.1 可调参数4.2 优化光追算法4.3 障碍物跟踪 1.背景 基于costmap地图&#xff0c;使用navigation导航时&#xff0c;会出现由于激光雷达/图像测距的局限性&#xff0c; …

由浅入深Netty粘包与半包解决方案

目录 1 粘包现象2 半包现象3 现象分析4 解决方案4.1 方法1&#xff1a;短链接4.2&#xff1a;方法2&#xff1a;固定长度4.3 方法3&#xff1a;固定分隔符4.4 方法4&#xff1a;预设长度 1 粘包现象 服务端代码 public class HelloWorldServer {static final Logger log Logg…

【libcurl 】win32 构建 Release版本 修改cmakelist 链接openssl1.1.*

以下库均已MD的构建以vs2019 V142构建MD构建 直接换用了一个openssl库,libcurl连接报错 $(ProjectDir)..\..\..\3rdparty\openssl\xdw_openssl1_1_1\lib\win32\libcrypto.lib

【Unity】 UI自适应案例

UI自适应案例 案例一:背包自动布局1. 创建背包面板2. 背包子项自动布局3. C#代码:动态添加子项到背包中案例二:文字自适应高度1. 创建文字面板2. 组件基本设置3. C#代码:动态更新文字并自适应高度案例一:背包自动布局 需求:动态添加背包组件,设定每行特定个数并自动匹配…

C++学习之路-变量和基本内置类型

变量和基本内置类型 一、基本内置类型1.1 算数类型1.2 带符号类型和无符号类型1.3 类型转换含有无符号类型的表达式 1.4 字面值常量整形和浮点型字面值字符和字符串字面值转义序列指定字面值的类型 二、变量2.1 变量的定义初始化列表初始化默认初始化 2.2 变量声明和定义的关系…

彻底理解粘性定位 - position: sticky(IT枫斗者)

彻底理解粘性定位 - position: sticky 介绍 粘性定位可以被认为是相对定位(position: relative)和固定定位(position: fixed)的混合。元素在跨越特定阈值前为相对定位&#xff0c;之后为固定定位。例如: .sticky-header { position: sticky; top: 10px; }在 视口滚动到元素…

python处理字符串、文本实例及注释

1、多个界定符切割字符串 代码 line = asdf fjdk; afed, fjek,asdf, foo import re re.split(r[;,\s]\s*, line) 结果 在上面的例子中,分隔符可以是逗号,分号或者是空格,并且后面紧跟着任意个的空格。只要这个模式被找到,那么匹配的分隔符两边的实体都会被当成是结果中…

【数据结构与算法】- 期末考试

课程链接: 清华大学驭风计划 代码仓库&#xff1a;Victor94-king/MachineLearning: MachineLearning basic introduction (github.com) 驭风计划是由清华大学老师教授的&#xff0c;其分为四门课&#xff0c;包括: 机器学习(张敏教授) &#xff0c; 深度学习(胡晓林教授), 计算…

可算是熬出头了,测试6年,费时8个月,入职阿里,涨薪14K

前言 你的努力&#xff0c;终将成就无可替代的自己。 本科毕业后就一直从事测试的工作&#xff0c;和多数人一样&#xff0c;最开始从事点点点的工作&#xff0c;看着自己的同学一步一步往上走&#xff0c;自己还是在原地踏步&#xff0c;说实话这不是自己想要的状态。 一年半…

在 Android 手机上恢复出厂设置后恢复照片的 4 种简单方法(新方法)

“嗨&#xff0c;谁能帮我恢复我的照片&#xff0c;因为我不小心恢复了出厂设置&#xff0c;而且我没有做备份&#xff1f;几个月来我一直试图通过使用恢复软件来恢复我的照片&#xff0c;root 了一个深扫描&#xff0c;但没用……” 恢复出厂设置可以清除电子设备的所有信息并…

Linux安装Redis数据库,无需公网IP实现远程连接

文章目录 1. Linux(centos8)安装redis数据库2. 配置redis数据库3. 内网穿透3.1 安装cpolar内网穿透3.2 创建隧道映射本地端口 4. 配置固定TCP端口地址4.1 保留一个固定tcp地址4.2 配置固定TCP地址4.3 使用固定的tcp地址连接 转发自cpolar内网穿透的文章&#xff1a;公网远程连接…

连续签到积分兑换试用流量主小程序开发

每日签到积分兑换试用流量主小程序开发 打卡兑奖小程序。用户签到活得积分。积分可以兑换商品。观看激励视频广告可以积分翻倍。 用户可以参加试用商品活动参加试用需要提交信息。可以通过分享方式直接获取试用资格。 以下是流量主小程序的功能列表&#xff1a; 广告位管理&a…

Java流程控制(一)

⭐ 控制语句⭐ 条件判断结构(选择结构)⭐ switch 语句 做任何事情事情都要遵循一定的原则&#xff0c;毕竟不以规矩&#xff0c;不成方圆&#xff0c;例如&#xff0c;到图书馆去借书&#xff0c;就必须要有借书证&#xff0c;并且借书证不能过期&#xff0c;这两个条件缺一不可…

Spring Boot 日志处理

Spring Boot 日志处理 Spring Boot 是一个非常流行的 Java 开发框架&#xff0c;它提供了简洁的配置和强大的开发工具。日志是应用程序中必不可少的一部分&#xff0c;因为它可以帮助开发人员进行调试和故障排除。Spring Boot 提供了多种日志框架&#xff0c;本文将重点介绍如…

Java泛型基本知识附面试题

一次平平无奇的面试 为什么要写这篇文档&#xff0c;主要就是在字节二面的时候&#xff0c;面试官提了这么一个问题 面试官&#xff1a;Java中的List<Integer>里有可能存String类型元素吗&#xff1f; 当时的我&#xff1a;应该…不可以吧&#xff0c;好像编译器会报错…

跟我一起使用 compose 做一个跨平台的黑白棋游戏(4)移植到compose-jb实现跨平台

前言 在上一篇文章中&#xff0c;我们已经实现了游戏的所有界面和逻辑代码&#xff0c;并且在 Android 上已经可以正常运行。 这篇文章我们将讲解如何将其从使用 jetpack compose 修改为使用 compose-jb 从而实现跨平台。 老规矩&#xff0c;先看效果图&#xff1a; 可以看到…

BurpSuite—-Target模块(目标模块)

前言 本文主要介绍BurpSuite—-Target模块(目标模块)的相关内容 关于BurpSuite的安装可以看一下之前这篇文章&#xff1a; http://t.csdn.cn/cavWt Target功能 目标工具包含了SiteMap&#xff0c;用你的目标应用程序的详细信息。它可以让你定义哪些对象在范围上为你目前的工…

「车型分析」控制系统典型应用车型 —— 辊筒AGV

辊筒AGV (Roller conveyor ) 是一种常见的AGV机器人类型&#xff0c;它利用辊筒和轮子在巷道中实现货物的搬运和运输&#xff0c;可实现托盘物品的卸载和运输等功能, 具有更高的灵活性、适应性和效率。本文将基于这款市场上常见的AGV进行一次简单的介绍。 1 车型介绍: 辊筒AGV…

Java基础学习(18)反射、动态代理

Java基础学习 一、反射1.1 什么是反射1.2 获取class对象 二、综合练习2.1 保存信息2.2 文件的动态创建 三、动态代理3.1 什么是动态代理3.2 创建代理 一、反射 1.1 什么是反射 反射允许对封装类的字段&#xff0c;方法和构造函数的信息进行编程访问 个人理解&#xff1a; 就是…