QT学习记录(三)绘图

news2024/9/21 18:43:45

按照下面两个教程学习

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。

 场景层

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Flutter控件之图片Image封装

Flutter控件之基类Widget封装 Flutter控件之文本Text封装 为什么要进行繁琐的封装&#xff1f;直接用也挺好啊&#xff0c;这个回答一点毛病没有&#xff0c;大部分视图都可以原生绘制&#xff0c;可在Flutter中偏偏原生的控件&#xff0c;少了很多需要又常用的属性&#xff…

最小生成树—Kruskal算法和Prim算法

1.最小生成树 连通图&#xff1a;在无向图中&#xff0c;若从顶点v1到顶点v2有路径&#xff0c;则称顶点v1与顶点v2是连通的。如果图中任 意一对顶点都是连通的&#xff0c;则称此图为连通图。 生成树&#xff1a;一个连通图的最小连通子图称作该图的生成树。有n个顶点的连通…

Java基础-面向对象总结(3)

本篇文章主要讲解Java面向对象的知识点 面向对象的三大特性类的扩展(抽象类,接口,内部类,枚举) 目录 面向对象和面向过程的区别? 面向对象的五大基本原则 面向对象三大特性 继承 怎么理解继承 ? 继承和聚合的区别&#xff1f; 封装 多态 什么是多态 什么是运行时多…

面试阿里、字节全都一面挂,被面试官说我的水平还不如应届生

测试员可以先在大厂镀金&#xff0c;以后去中小厂毫无压力&#xff0c;基本不会被卡&#xff0c;事实果真如此吗&#xff1f;但是在我身上却是给了我很大一巴掌... 所谓大厂镀金只是不卡简历而已&#xff0c;如果面试答得稀烂&#xff0c;人家根本不会要你。况且要不是大厂出来…

MySQL数据库基础4-内置函数

文章目录 日期函数字符串函数数学函数其他函数 日期函数 函数名称描述current date()当前日期current time()当前时间current timestamp()当前时间戳date(datetime)返回datetime参数的日期部分date add(date, interval d_value type)在date中添加日期或时间&#xff0c;interv…

GitHub Actions Error “Waiting for a runner to pick up this job”

GitHub Actions Error “Waiting for a runner to pick up this job” 什么是GitHub Actions GitHub Actions 是一个 CI/CD&#xff08;持续集成和持续部署&#xff09;平台&#xff0c;可以让您自动化工作流程并与 GitHub 存储库中的代码集成。使用 GitHub Actions&#xff…

智能排班系统 【数据库设计】

文章目录 数据库设计规范ER图物理模型数据表登录日志表操作日志表菜单表角色表企业表门店表省市区表门店节日表消息表职位表排班规则表排班任务表排班结果存储scheduling_date排班日表scheduling_shift排班班次表shift_user班次员工中间表 定时通知表用户表中间表role_menu角色…

适合小白的网络安全书籍推荐

学习的方法有很多种&#xff0c;看书就是一种不错的方法&#xff0c;但为什么总有人说&#xff1a;“看书是学不会技术的”。 其实就是书籍没选对&#xff0c;看的书不好&#xff0c;你学不下去是很正常的。 一本好书其实不亚于一套好的视频教程&#xff0c;尤其是经典的好书…

MATLAB系列(2)——plot画图函数

一、plot plot画的是折线图。plot可以画出多种线类型的图&#xff0c;比如实线、虚线、星线、圆圈线等,一个图里可以画多条折线&#xff0c;方便对比。 1.1 设置坐标轴标签 和 图名 使用xlabel 和ylabel&#xff0c;title设置图名&#xff0c;fontsize设置名字字体大小 1.2 …

Netty核心技术三--NIO编程

1. JAVA NIO基本介绍 Java NIO 全称 java non-blocking IO&#xff0c;是指 JDK 提供的新API。从 JDK1.4 开始&#xff0c;Java 提供了一系列改进的输入/输出的新特性&#xff0c;被统称为 NIO(即 New IO)&#xff0c;是同步非阻塞的 NIO 相关类都被放在 java.nio 包及子包下&…

【软件测试基础】

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f93a;&#x1f93a;&#x1f93a; 目录 1、什么是软件测试(CASE) 1.1 软件测试就是验…

亲测解决:项目无法编译/打包,提示找不到符号的问题

我在对服务进行打包的过程中遇到了“Error…找不到符号”的问题&#xff0c;但是我的项目是能够正常启动的&#xff0c;为什么会出现这个问题呢&#xff1f; 有的博主说是因为我没有正常打包&#xff0c;然后我又学习了一遍如何对项目进行打包…但是然并卵&#xff08;然而并没…

【Java数据结构】——第十节(下).选择排序与堆排序

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;Java初阶数据结构 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01; 文章目…

一文3000字从0到1手把手教你基于PostMan的接口自动化测试

临近下半年&#xff0c;公司任务也不是很多&#xff0c;趁这个机会老大让我研究了一下PostMan的脚本自动化测试。作为一个前端开发&#xff0c;说实话&#xff0c;对于PostMan的操作&#xff0c;仅仅限于新建请求->填写url地址和参数->send发送&#xff0c;然后看看返回值…

智能排班系统 【开源说明】

文章目录 引言说明讲讲开源开源要做什么了解开源协议项目的信息脱敏写好项目说明文档修改.gitignore 项目不完善点说明管理系统前端页面自适应做得不好部分页面体验不好 管理系统后端接口缺乏数据校验数据管理接口查询不够完善接口可以更加完善 开源仓库地址其他文章引用说明前…

【我的创作纪念日】—— 纪念四年的坚持

这是一篇和技术无关的博客&#xff0c;但对我而言&#xff0c;它承载了不菲的价值 普通且宁静的一天&#xff0c;被一条消息戳中&#xff0c;于是&#xff0c;写一篇分享帖&#xff0c;纪念我这 1460 天的坚持初衷&#xff1a; 前言&#xff1a;对过去的回顾 4 年前的我&#…

南京邮电大学算法与设计实验二:贪心算法(最全最新,与题目要求一致)

三、实验原理及内容 实验原理&#xff1a; 1、用贪心法实现求两序列的一般背包问题。要求掌握贪心法思想在实际中的应用&#xff0c;分析一般背包的问题特征&#xff0c;选择算法策略并设计具体算法&#xff0c;编程实现贪心选择策略的比较&#xff0c;并输出最优解和最优解值。…

图的遍历,最小生成树,最短路径算法的手算。

1.图的遍历 按照某种规则沿着图中的边对图中的所有顶点访问一次且仅访问一次。 注&#xff1a;图是一种特殊的树。 1.广度优先遍历BFS 不难看出&#xff0c;图的广度优先就是参照的树的层次遍历算法。 2.深度优先遍历 从某个顶点开始V&#xff0c;访问这个顶点V相邻的任意…

【音视频开发】视频编码格式:YUV

文章目录 分类标准分类 简介 参考&#xff1a;YCbCr与YUV 分类标准 首先&#xff0c;我们可以将 YUV 格式按照数据大小分为三个格式&#xff0c;YUV 420&#xff0c;YUV 422&#xff0c;YUV 444。由于人眼对 Y 的敏感度远超于对 U 和 V 的敏感&#xff0c;所以有时候可以多个 …

位运算符及其相关操作详解

位运算符详解 前言&#xff1a;由于位运算符是直接对二进制数操作&#xff0c;因此对二进制、八进制、十六进制不甚了解的小伙伴建议先看这篇二进制、八进制、十六进制与十进制的相互关系&#xff0c;这样阅读本篇时将事半功倍 总览 位运算是对计算机存储的二进制序列的相应位进…