码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Qt实现桌面画线、标记,流畅绘制,支持鼠标和多点触控绘制


    前言

    经常会在网上直播讲课或者点评中看到可以在课件上或者桌面上进行画线标记划重点,其实实现并不难,原理就是在桌面上盖一个透明图层,然后根据鼠标点绘制曲线。
    今天分享如何通过Qt的QGraphics体系来实现这个功能,以前的文章已经介绍过使用Qt进行曲线绘制及相关原理,所以这里就不再重复了,直接讲关键部分代码。


    本文Demo下载
    快捷键说明:数字 1表示画线 2表示擦除 3表示清空,导航键 上下分别表示放大和缩小,Esc退出软件


    首先来看实际效果:
    在这里插入图片描述录制一个局部动画效果:
    在这里插入图片描述

    正文

    以上效果是通过QGraphics来实现,绘制非矢量图形(在图片上画线)。
    来看下几个关键点

    透明

    由于要实现透视到桌面效果,所以需要投图层设置为透明,所以首先得把QGraphicView设置为透明:

        view->setAttribute(Qt::WA_TranslucentBackground);
        view->setStyleSheet("background-color:transparent;border:0px");
    
    • 1
    • 2

    然后由于使用的是非矢量绘图方式,所以绘制的图片也要设置成透明才行:

    m_pRealCanvas = new QImage(m_size.toSize(),QImage::Format_ARGB32_Premultiplied);
    m_pRealCanvas->fill(QColor(255,255,255,1));
    
    • 1
    • 2

    绘制

    上面说了,为了能够更高效的绘制和擦除曲线,使用了非矢量的方式进行绘图,也就是在一张固定的图片上进行绘制。
    关于矢量和非矢量方式绘图的区别以及绘制相关注意事项,可以参考之前的文章。
    文章在这里

    擦除

    其实擦除功能和绘制功能一样, 由于使用的是非矢量画线,所以擦除只需要绘制一个和底色相同的粗的曲线即可实现擦除效果。但是要注意设置painter的setCompositionMode属性,设置为QPainter::CompositionMode_Source。

        m_pRealPainter->setRenderHint(QPainter::Antialiasing, true);
        m_pRealPainter->setCompositionMode(QPainter::CompositionMode_Source);
        m_pRealPainter->setPen(QPen(m_bgColor,width, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
        m_pRealPainter->fillPath(path,m_bgColor);//填充轮廓
    
    • 1
    • 2
    • 3
    • 4

    本文Demo下载
    快捷键:数字 1表示画线 2表示擦除 3表示清空,导航键 上下分别表示放大和缩小,Esc退出软件


  • 相关阅读:
    2022年大家都说智慧工地好,那么智慧工地有哪些令人惊艳的应用价值?
    51单片机BH1750智能补光灯台灯光强光照恒流源LED控制系统
    【砖墙】python刷题记录
    【计网笔记06】计算机网络之应用层协议(SMTP协议、POP3协议、HTTP协议)、DNS域名系统、电子邮件系统
    四、如何改变观察视角
    A Keypoint-based Global Association Network for Lane Detection
    elasticsearch国内镜像社区下载es+logstash+ik分词器+kibana
    『亚马逊云科技产品测评』活动征文|AWS 存储产品类别及其适用场景详细说明
    Ps:消除锯齿与修边
    PlantUML Integration 编写短信服务类图
  • 原文地址:https://blog.csdn.net/luoyayun361/article/details/127541538
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号