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

这篇具有很好参考价值的文章主要介绍了Qt之QGraphicsView实现截图(漏洞百出且BUG丛生版,部分源码+注释)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、截图操作示例图

1.图元绘制示例

下方一次绘制的图元为:矩形、圆形、箭头、画笔。
Qt之QGraphicsView实现截图(漏洞百出且BUG丛生版,部分源码+注释)

2.文本添加操作示例

下方为添加文本操作,演示文本过多时,文本框便捷不超出编辑区边界。
Qt之QGraphicsView实现截图(漏洞百出且BUG丛生版,部分源码+注释)

3.设置操作示例

下方为演示设置弹窗更新画笔颜色、画笔粗细更新后的绘制效果。
Qt之QGraphicsView实现截图(漏洞百出且BUG丛生版,部分源码+注释)

4.截图拖动示例

下方为截图图片拖动效果,仅支持未添加图元的情况。
Qt之QGraphicsView实现截图(漏洞百出且BUG丛生版,部分源码+注释)

5.文件保存示例

下方操作为截图保存当前截图,并再次打开保存路径验证保存成功的情况。
Qt之QGraphicsView实现截图(漏洞百出且BUG丛生版,部分源码+注释)

6.剪切板粘贴示例

下方操作为截图确定,并粘贴至Word中的操作
Qt之QGraphicsView实现截图(漏洞百出且BUG丛生版,部分源码+注释)

二、内容指路和思路

  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/)

注:文章为作者编程过程中所遇到的问题和总结,内容仅供参考,若有错误欢迎指出。
注:如有侵权,请联系作者删除文章来源地址https://www.toymoban.com/news/detail-432361.html

到了这里,关于Qt之QGraphicsView实现截图(漏洞百出且BUG丛生版,部分源码+注释)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • QT QGraphicsView 在鼠标点击处进行放大缩小

    一、前段时间在用QGraphicsView对图元进行放大缩小时,发现图形总是越来越跑偏,无法像地图中那样,点击哪里就能放大哪个地方。 如下所示:此时放大缩小的焦点并不在鼠标位置 方法,使用QGraphicsView类的设置属性函数.在构造函数中增加下面两个函数即可。 此时以鼠标为中

    2024年02月16日
    浏览(34)
  • Qt中QGraphicsView架构下实时鼠标绘制图形

    上一章节介绍了关于QGraphicsView的基础讲解,以及简单的类图创建,由上一章节中最后展示的动画效果来看,今年主要讲述如何在QGraphicsView架构下,实时拖动鼠标绘制图形! 今天主要以矩形为例,再来看一下展示效果吧! 想要实现鼠标拖拽绘图的效果,离不开鼠标的三大事件

    2024年01月22日
    浏览(37)
  • QT QGraphicsView 提升到 QChartView报错 解决方案

    本文主要描述, 使用QT提供的QChartView来绘制图表,提升QGraphicsView控件 继承QChartView后,然后将QGraphicsView提升到我们自己写的类,怎么才能确保提升后编译不报错. 临时方案(主要是修改ui_xxxx.h文件) 终极解决方案(针对网上好多方案都是修改ui_xxx.h文件,然后重新编译后又报错,又要修改

    2024年02月05日
    浏览(29)
  • 【[Qt]基于QGraphicsView的图像显示控件,支持放大、缩小、鼠标拖动】

    ImageViewer.h文件 ImageViewer.cpp 文件 具体使用代码如下 1、初始化类对象,并加入界面布局中 2、打开图像,并加载到控件中 3、从控件中卸载图片 源码链接:https://download.csdn.net/download/xiaohuihuihuige/87239431 百度云: 链接:https://pan.baidu.com/s/1W-KUlIKUFAktUKFin63N0g 提取码:4g8a

    2024年02月11日
    浏览(42)
  • 《QT从基础到进阶·十五》用鼠标绘制矩形(QGraphicsView、QPainter、QGraphicsRectItem)

    以下是鼠标绘制矩形最全的一种用法,完整源码将会放在最后面。 QT版本:5.15.2 VS版本:2019 1、在界面加载一张图片 界面的搭建选用QGraphicsView,自定义类GraphicsView继承QGraphicsView,在主程序中点击按钮打开 图片,相关代码如下: 2、创建矩形绘制对象,并绘制、移动矩形 在

    2024年02月04日
    浏览(40)
  • Windows 11又双叒出现Bug,导致截图工具崩溃

    自Windows 11于10月5日正式推送以来,其自身Bug就接连不断。此前就有媒体报道Windows 11影响AMD游戏性能下降问题,不过在10月21日微软发布了KB5006746 (Build 22000.282)更新补丁,彻底解决了上述问题。 间隔不到两周,Windows 11又被曝出Bug。近日有大量网友反映微软截图工具 (snippin

    2024年02月04日
    浏览(40)
  • 【bug】flameshot在ubuntu上的4K屏幕,双屏幕上用不了截图

    直接在4K屏幕上运行flameshot截图,直接黑屏 主屏 :4K 副屏:2k 2.1长按1-2秒开机键,先回到桌面。 2.2 设置主屏缩放为125% 2.3 设置键盘快捷键命令为 env QT_AUTO_SCREEN_SCALE_FACTOR=1 flameshot gui https://launchpad.net/~shutter/+archive/ubuntu/ppa https://github.com/LCTT/TranslateProject/blob/master/published/20181

    2024年02月16日
    浏览(26)
  • 浏览器网页内嵌Qt-C++音视频播放器的实现,支持软硬解码,支持音频,支持录像截图,支持多路播放等,提供源码工程下载

        在浏览器中实现播放RTSP实时视频流,⼤体上有如下⼏个⽅案: ⽅案一:浏览器插件⽅案 ActiveX、NPAPI、PPAPI     ActiveX插件适用于IE浏览器,NPAPI与PPAPI插件适用于谷歌浏览器,不过这些插件都已经不被浏览器所支持。 ⽅案二:先转码再转流⽅案     ⼯作原理是架设一

    2024年01月17日
    浏览(67)
  • 遇到一个同事,喜欢查其他同事的BUG,然后截图发工作大群里,还喜欢甩锅,该怎么办?...

    职场上都有哪些奇葩同事? 一位网友吐槽: 遇到一个同事,喜欢查同级别同事的bug,截图发工作群,甚至发大群里,还喜欢甩锅,该怎么办? 职场工贼,人人喊打,网友们纷纷给出了自己的应对之策。 有人说,就在群里回一个大拇哥。 有人说,说明他工作不饱和,告诉领

    2024年02月05日
    浏览(42)
  • QGraphicsView中重写鼠标事件实现图片的移动

            本文讲的是如何在PyQt5的组件QGraphicsView中重写鼠标事件实现图片的移动。         PyQt5作为强大的GUI编程工具,免不了会拿来做一些图片的显示和处理问题,有的会使用QPainter作为动态显示图片的工具,QLabel是显示静态图片的主推。但是我在工作中遇到了超大

    2023年04月14日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包