Qt之QGraphicsView实现截图(漏洞百出且BUG丛生版,部分源码+注释)

文章目录

  • 一、截图操作示例图
    • 1.图元绘制示例
    • 2.文本添加操作示例
    • 3.设置操作示例
    • 4.截图拖动示例
    • 5.文件保存示例
    • 6.剪切板粘贴示例
  • 二、内容指路和思路
  • 三、部分源码
    • 1.自定义文本框源码
    • 2.多类型图形数据的存储
    • 3.截图源码
  • 总结
  • 相关文章

一、截图操作示例图

1.图元绘制示例

下方一次绘制的图元为:矩形、圆形、箭头、画笔。
在这里插入图片描述

2.文本添加操作示例

下方为添加文本操作,演示文本过多时,文本框便捷不超出编辑区边界。
在这里插入图片描述

3.设置操作示例

下方为演示设置弹窗更新画笔颜色、画笔粗细更新后的绘制效果。
在这里插入图片描述

4.截图拖动示例

下方为截图图片拖动效果,仅支持未添加图元的情况。
在这里插入图片描述

5.文件保存示例

下方操作为截图保存当前截图,并再次打开保存路径验证保存成功的情况。
在这里插入图片描述

6.剪切板粘贴示例

下方操作为截图确定,并粘贴至Word中的操作
在这里插入图片描述

二、内容指路和思路

  1. 图标准备,可通过阿里巴巴矢量图标库获取
  2. 托盘图标对象,可通过Qt之QSystemTrayIcon(托盘图标)的使用(含源码+注释)查看
  3. 基本图形绘制,画笔实现和矩形绘制
  4. 箭头绘制,Qt绘制带箭头的线段
  5. 文本添加思路,此处博主直接走了个捷径,通过创建一个QTextEdit控件,设置其全透明和显示位置来实现文本添加(第三节附源码)。
  6. 多图形的绘制,不同数据通过QVariant的canConvert、setValue和value函数实现不同类型的存储(第三节附部分源码)。
  7. 图形的改变,主要通过鼠标事件实现并且图片更新要通过 “this->viewport()->update();”重绘图形

三、部分源码

1.自定义文本框源码

CTextEdit.h

#ifndef CTEXTEDIT_H
#define CTEXTEDIT_H#include <QObject>
#include <QTextEdit>class CTextEdit : public QTextEdit
{Q_OBJECT
public:explicit CTextEdit(QWidget *parent = nullptr);~CTextEdit();/*** @brief setEditTopLeftPos 设置左上角位置* @param pos 位置*/void setEditTopLeftPos(const QPoint &pos);/*** @brief setTextPointSize 设置文本大小* @param size 文本大小*/void setTextPointSize(int size);/*** @brief setEditRange 设置编辑边界* @param editRange 编辑边界*/void setEditRange(const QRect &editRange);/*** @brief editFlag 获取编辑标记* @return 编辑标记值*/bool editFlag() const;/*** @brief setEditFlag 设置标记标记* @param editFlag 更新的编辑标记*/void setEditFlag(bool editFlag);private slots:/*** @brief on_textChanged 文本更新槽函数*/void on_textChanged();signals:/*** @brief editTextFinished 文本编辑完成信号* @param text 完成文本*/void editTextFinished(const QString &text);// QWidget interface
protected:/*** @brief focusOutEvent 焦点丢失对象* @param event 事件对象*/void focusOutEvent(QFocusEvent *event);private:QRect   m_editRange;    // 编辑边界bool    m_editFlag;     // 编辑标记
};#endif // CTEXTEDIT_H

CTextEdit.cpp

#include "CTextEdit.h"
#include <QDebug>
#include <QScrollBar>CTextEdit::CTextEdit(QWidget *parent): QTextEdit(parent), m_editFlag(false)
{this->setWindowFlag(Qt::FramelessWindowHint, true);this->setStyleSheet("border: 1px solid red;background:transparent;");this->hide();// 文本颜色为红色this->setTextColor(Qt::red);// 设置默认文本大小this->setFontPointSize(10);// 设置滚动条隐藏this->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);// 文本更新信号槽connect(this, &CTextEdit::textChanged, this, &CTextEdit::on_textChanged);
}CTextEdit::~CTextEdit()
{}void CTextEdit::setEditTopLeftPos(const QPoint &pos)
{const QPoint &editBrPos = m_editRange.bottomRight();QPoint brPos;brPos.setX(pos.x() + 80 > editBrPos.x()? editBrPos.x(): pos.x() + 20);brPos.setY(pos.y() + 30 > editBrPos.y()? editBrPos.y(): pos.y() + 30);// 设置显示位置this->setGeometry(QRect(pos, brPos));// 控件显示this->setVisible(true);
}void CTextEdit::setTextPointSize(int size)
{// 设置字体大小setFontPointSize(size * 5);
}void CTextEdit::on_textChanged()
{// 获取文本字体样式QFont tmpFont = this->font();// 设置文本大小tmpFont.setPointSize(this->fontPointSize());// 创建字体度量对象并传入样式QFontMetrics metrics(tmpFont);// 获取控件文本QString text = this->toPlainText();// 获取文本宽度并添加20像素的空间int width = metrics.width(text) + 20;// 获取左上角的点QPoint tlPos = this->geometry().topLeft();// 获取窗口大小QSize size = this->rect().size();// 获取水平/垂直可便宜的最大宽度/高度int hOffset = m_editRange.right() - tlPos.x();int vOffset = m_editRange.bottom() - tlPos.y();// 更新宽度size.setWidth(width < hOffset? width: hOffset);// 获取滚动条最大值int height = this->verticalScrollBar()->maximum();// 更新高度size.setHeight(height + this->height() < vOffset? height + this->height(): vOffset);// 更新显示区域this->setGeometry(QRect(tlPos, size));
}void CTextEdit::focusOutEvent(QFocusEvent *event)
{Q_UNUSED(event);this->hide();// 获取编辑的文本QString text = this->toPlainText();// 当字符串不为空才进入if(!text.isEmpty()){// 发出编辑完成的文本并清空编辑框内容emit editTextFinished(text);this->clear();}
}bool CTextEdit::editFlag() const
{return m_editFlag;
}void CTextEdit::setEditFlag(bool editFlag)
{m_editFlag = editFlag;
}void CTextEdit::setEditRange(const QRect &editRange)
{m_editRange = editRange;
}

2.多类型图形数据的存储

添加矩形/圆形数据

            // 创建对应图像数据QPair<bool, QRect> tmpData;// 添加数据tmpData.first = ToolType::DRAW_RECTANGLE == m_toolGraphiWgt->curToolType();tmpData.second = QRect(m_pressPos, endPos);var.setValue<QPair<bool, QRect>>(tmpData);

转换矩形/圆形数据

        // 图像转换为对应类型的存储数据QPair<bool, QRect> pair = figureInfo.figureData.value<QPair<bool, QRect>>();if(pair.first){painter->drawRect(pair.second); // 绘制矩形}else{painter->drawEllipse(pair.second);  // 绘制圆形}

3.截图源码

    QScreen *screen = QApplication::primaryScreen();m_pixmap =  screen->grabWindow(0);

总结

总的来说截图软件没有太大的难点,可能稍微多一点就是细节功能的微调等;其中存在的问题包括:截图程序置顶、截图编辑区域拖动更新大小、鼠标跟踪优化等问题。(可私聊获取源码)

相关文章

Qt之QSystemTrayIcon(托盘图标)的使用(含源码+注释)
Qt之QPainter实现画笔功能(逻辑简单,不懂算我输 含源码+注释)
Qt之QPainter绘制多个矩形/圆形(含源码+注释)
Qt绘制带箭头的线段

友情提示——哪里看不懂可私哦,让我们一起互相进步吧
(创作不易,请留下一个免费的赞叭 谢谢 o/)

注:文章为作者编程过程中所遇到的问题和总结,内容仅供参考,若有错误欢迎指出。
注:如有侵权,请联系作者删除

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

这可能是解决你Spring MVC接口漏洞百出的关键

1. 前言 在 Java 开发中接触的开发者大多数不太注重对接口的测试&#xff0c;结果在联调对接中出现各种问题。也有的使用 Postman 等工具进行测试&#xff0c;虽然在使用上没有什么问题&#xff0c;如果接口增加了权限测试起来就比较恶心了。所以建议在单元测试中测试接口&…

由苹果的低级Bug想到的

前段时间的问题&#xff0c;本来想写篇文章说说代码规范&#xff0c;code review相关的&#xff0c;不过看到果壳已经有篇很棒的文章&#xff0c;借来放在这里&#xff0c;也是对自己的指导。果壳很好&#xff0c;里面的文章都很有很有含金量&#xff0c;建议大家都收藏起来 原…

关于人工智能不会使大脑变懒惰的议论文_台湾人工智能学校执行长陈升玮:孩子成为这型人,就不怕被AI取代...

陪伴每个父母和小孩&#xff0c;成为更好的自己。 搜寻公众号 "亲子天下"(微信 ID&#xff1a;cn-parenting)关注 世界经济论坛〈工作大未来〉报告二○一六年的预测&#xff1a;二○二一年全世界会产生两百万个新工作&#xff0c;但随着人工智能(AI)兴起&#xff0c;…

关于人工智能不会使大脑变懒惰的议论文_人工智能的好处和风险:所有您需要知道的...

​ 人工智能不是想象中的未来。现在,在我们的搜索引擎中,人工智能不仅仅是自动完成,也不仅仅是自动驾驶汽车。从机器学习到机器人,人工智能为我们提供了多种技术,使机器能够感知,理解,学习和行动。 是否考虑将绝佳的AI机会纳入您的业务?在您做出决定之前,这里有一些AI…

有可以模拟钢琴弹奏乐曲的手机软件吗?

我们常常喜欢抱着手机做很多有趣的事。其实现在的智能手机真的可以做很多以前意想不到的事。像是手机里有可以模拟钢琴弹奏乐曲的手机软件&#xff0c;钢琴键盘模拟器很有趣。所以很受年轻的小伙伴欢迎。今天我就在这里和大家分享一下&#xff0c;可以模拟钢琴弹奏乐曲的手机软…

普通计算机可以演奏音乐吗,用电脑演奏的音乐还是音乐吗?

现代电子科技迅猛发展&#xff0c;很多作曲家都用电脑作曲&#xff0c;非常方便&#xff0c;就是演奏的时候也能交给电脑负责&#xff0c;合成多个音轨&#xff0c;演奏出复杂的音乐作品。那么&#xff0c;用电脑演奏的音乐还是音乐吗&#xff1f; 当然是音乐。电脑可以负责人脑…

freepiano 手残党也想弹钢琴(在电脑上弹奏电子钢琴自娱自乐,也许还是有点困难,不如试试freepiano+鼠标宏,这样用简谱就不怕残疾了)

我不懂五线谱&#xff0c;勉强能看看简谱&#xff0c;喜欢音乐&#xff0c;但又手残玩不好乐器&#xff0c;像是钢琴电子琴都是双手一起像打键盘一样弹右手位&#xff0c;没法自己搞伴奏&#xff0c;吉他也按不住大横按的和弦&#xff0c;简直没有音乐细菌。 自己想玩吧&#…

毛利率低至个位数,甚至为负?车载语音赛道「现实很骨感」

作为座舱智能化交互的关键角色之一&#xff0c;语音识别及交互一直以来也是不少汽车品牌的主打功能之一。 比如&#xff0c;随意打断语音助手&#xff0c;连续下达指令&#xff0c;融合更多车身控制功能&#xff0c;甚至是ChatGPT大模型的结合&#xff0c;给了消费者更多的想象…

北森控股,云端HCM解决方案“一哥”胜算几成?

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 近日&#xff0c;云端HCM解决方案“一哥”北森控股有限公司&#xff08;以下简称“北森控股”&#xff09;再度递表港交所&#xff0c;摩根士丹利及中金公司为联席保荐人。 资料来源&#xff1a;北森控股招股书 此次IPO北森…

第四范式,第四次递表!能否凭借SageGPT挤进大模型赛道?

4月24日消息&#xff0c;据港交所文件&#xff0c;北京第四范式智能技术股份有限公司向港交所提交上市申请书&#xff0c;中金公司担任独家保荐人。如能顺利上市&#xff0c;第四范式将成为继商汤科技&#xff08;00020.HK&#xff09;、创新奇智&#xff08;02121.HK&#xff…

机械图样解读——回转面

回转面的形成 直线或曲线绕轴线回转形成的曲面称为回转面。 回转面的表示

机械制图 机械识图 三视图画法认图视频教程

机械制图 机械识图 三视图画法认图视频教程 链接&#xff1a;https://pan.baidu.com/s/1fUtYooCRIkoLN5lyFURWCA 提取码&#xff1a;1612

解读机械图样——斜视图

斜视图是零件向不平行于基本投影面的平面投射所得的视图&#xff0c;用于表达零件上倾斜结构的真实形状&#xff0c;如图1-8所示。对于垂直于斜面的孔和槽&#xff0c;用斜视图可以按照实际的尺寸画出它的形状&#xff0c;也易于标注尺寸。 绘制斜视图时&#xff0c;一般在原图…

【CAD】机械类制图实用功能总结

【CAD】机械类制图实用功能总结 一、简介二、正文&#xff08;一&#xff09;快捷键/快捷字母&#xff08;二&#xff09;实用功能1、块2、零件件号标注及材料表关联&#xff08;Vault&#xff09;3、粗糙度标准更改4、增加图纸页数&#xff08;Vault&#xff09;5、尺寸对齐6、…

Highcharts绘制饼图

1、使用Highcharts制作饼图的效果图如下: 2、对应的JavaScript代码---pie-chart.js如下: $(function () {var chart;var totalMoney=50000$(document).ready(function() {chart = new Highcharts.Chart({chart: {renderTo: pie_chart,plotBackgroundColor: white,//背景颜色…

helm和chart

Helm helm是Kubernetes 应用的包管理工具&#xff0c;主要用来管理 Charts&#xff0c;类似Linux系统的yum。Helm Chart 是用来封装 Kubernetes 原生应用程序的一系列 YAML 文件。可以在你部署应用的时候自定义应用程序的一些 Metadata&#xff0c;以便于应用程序的分发。 he…

控制highcharts饼图四周线的长短

var colors [#08c60c,//绿色#ffc002,//黄色#eb3928,//红色#B5B5B5//灰色 ]; // 创建渐变色 Highcharts.getOptions().colors Highcharts.map(colors, function (color) {return {radialGradient: { cx: 0.5, cy: 0.3, r: 0.7 },stops: [[0, color],[1, Highcharts.Color(colo…

CAD轴测图怎么画?快来试试浩辰CAD超级轴测命令!

很多新手设计师小伙伴&#xff0c;不知道CAD轴测图怎么画&#xff1f;其实很简单&#xff0c;浩辰CAD中的超级轴测功能&#xff0c;可以方便地将CAD平面图转化为轴侧图&#xff0c;是绘制管线系统图的好帮手。今天就和小编一起来看看在浩辰CAD软件中通过调用超级轴测命令来绘制…

使用highchart实现3D饼图(重点是3D图、饼图图例不显示问题)

一&#xff1a;使用highchart实现3D饼图 HTML&#xff1a;需要一个容器来绘图 <div class"dataItemRight" id"trafficData"></div>JS&#xff1a;所需js文件 <script src"js/jquery.min.js" type"text/javascript" c…

TeeChart基础使用手册

TeeChart使用手册 pdf版下载地址 TeeChart库下载 文章目录 TeeChart使用手册1、TeeChart.dll、TeeChart8.ocx、TeeChart.WPF.dll优缺点1.1 TeeChart.dll1.2 TeeChart8.ocx1.3 TeeChart.WPF.dll 2、Windows窗体应用(.NET Framework) TeeChart.dll2.1 创建工程2.2 添加TeeChart…