033-第三代软件开发-固定区域截图

news2024/11/24 14:08:22
头图

第三代软件开发-固定区域截图

文章目录

  • 第三代软件开发-固定区域截图
    • 项目介绍
    • 固定区域截图
      • QWidget 版本
      • QML 版本
    • 自由截图
    • 自由截图二

关键字: QtQml关键字3关键字4关键字5

项目介绍

欢迎来到我们的 QML & C++ 项目!这个项目结合了 QML(Qt Meta-Object Language)和 C++ 的强大功能,旨在开发出色的用户界面和高性能的后端逻辑。

在项目中,我们利用 QML 的声明式语法和可视化设计能力创建出现代化的用户界面。通过直观的编码和可重用的组件,我们能够迅速开发出丰富多样的界面效果和动画效果。同时,我们利用 QML 强大的集成能力,轻松将 C++ 的底层逻辑和数据模型集成到前端界面中。

在后端方面,我们使用 C++ 编写高性能的算法、数据处理和计算逻辑。C++ 是一种强大的编程语言,能够提供卓越的性能和可扩展性。我们的团队致力于优化代码,减少资源消耗,以确保我们的项目在各种平台和设备上都能够高效运行。

无论您是对 QML 和 C++ 开发感兴趣,还是需要我们为您构建复杂的用户界面和后端逻辑,我们都随时准备为您提供支持。请随时联系我们,让我们一同打造现代化、高性能的 QML & C++ 项目!

重要说明☝

☀该专栏在第三代软开发更新完将涨价

固定区域截图

其实在Ubuntu 下,也没有找到好的截图工具,之前Windows下都是使用Snipaste,结果发现作者还没有开发Linux的版本,而项目也有截图的需求,不过我们的截图很简单,就是把某一固定的区域保存成图片,在说直白点,就是把某一个控件保存成图片。

QWidget 版本

之前QWidget下就有这个功能,我先找一下QWidget下的实现代码

/**
 * @brief XXXXXXX::snapshot
 * 快照功能
 * 这个暂未开启
 */
void XXXXXXX::snapshot(QString path)
{

    QRect rect = ui->widget_customPlot->geometry();                              // 截图区域
    QPixmap p = ui->widget_customPlot->grab(rect);                               // 获取谁的RGB
#ifdef QT_NO_DEBUG
    if(!p.save(path,"png"))
    {
        qWarning()<<"save snapshot failed" << LOCATION;
    }
#else
    Q_UNUSED(path)
    QString filePathName = "widget";
    filePathName += QDateTime::currentDateTime().toString("yyyy-MM-dd hh-mm-ss-zzz");
    filePathName += ".png";
    if(!p.save(filePathName,"png"))
    {
        qDebug()<<"save snapshot failed";
    }
#endif

}

QML 版本

有了在QWidget下的经验,我相信Qt 在Qml 下也为我们做了这接口,所以百度下下。代码如下

function snapshot()
{
    rect_drawArea.grabToImage(function(result)
    {
        result.saveToFile("./T_Image/" + UserProfile.userName 
                          "/" +turing_QCustomPlotForThyroid_up
                          "_" + turing_QCustomPlotForThyroid_u
                          "_" +
                          Math.floor(new Date()) +
                          ".png")   // save to file
        screenshotImage.source = result.url;
        screenshotRect.visible = true
        screenshotAnimation.start()
        hidescreenshotRect.start()
    });
}

这里就有人会发现还加了别的代码了,是的,我还给他写了一个简单的动画,类似咱们手机截图那样,缩小到右下角,并小时,代码如下:

/// 截图展示框
Rectangle
{
    id:screenshotRect
    x:0
    y:0
    width: parent.width
    height: parent.height
    visible: false
    color: "transparent"
    Image {
        id: screenshotImage
        anchors.fill: parent
        anchors.margins: 2
    }
}
ParallelAnimation {
    id: screenshotAnimation
    running: false
    NumberAnimation { target: screenshotRect; property: "y";from: 0; to: rect_drawArea.height-10; duration: 300}
    NumberAnimation { target: screenshotRect; property: "width";from: rect_drawArea.width; to: 10; duration: 300}
    NumberAnimation { target: screenshotRect; property: "height";from: rect_drawArea.height; to: 10; duration: 300}
}

上面的代码光是缩小了,还得消失呢,我就偷懒了,又给了一个定时器

    Timer
    {
        id:hidescreenshotRect
        repeat: false
        interval: 300
        running: false
        onTriggered: screenshotRect.visible = false

    }

自由截图

!!! 以下代码并未在项目中实现

要使用 QT QML 实现自由截图,需要使用 Qt 的 QPixmap 和 QWidget 类,以及 QML 的 Canvas 元素和 Image 元素。下面是一个简单的示例代码,可以在 Qt Quick 应用程序中使用 QML 实现自由截图功能:
首先,在 main.cpp 文件中包含必要的头文件,并创建一个 Stopwatch 类继承自 QObject,用于控制截图的启动和停止:

#include <QApplication>  
#include <QDeclarativeView>  
#include <QDeclarativeContext>
class Stopwatch : public QObject  
{
public:  
   Stopwatch();  
   Q_INVOKABLE bool isRunning() const;  
public slots:  
   void start();  
   void stop();  
private:  
   bool m_running;  
};  

然后在 main.h 文件中添加必要的头文件和声明:

#ifndef MAIN_H  
#define MAIN_H
#include <QApplication>  
#include <QDeclarativeView>  
#include <QDeclarativeContext>  
#include <QPixmap>  
#include <QWidget>  
#include <QMouseEvent>  
#include <QKeyEvent>
class Stopwatch;
int main(int argc, char *argv[])  
{
   //...  
   QDeclarativeView *view = new QDeclarativeView();  
   QDeclarativeContext *context = view->getContext();  
   context->setContextRoot(view);
   Stopwatch *stopwatch = new Stopwatch();  
   context->setContextProperty("stopwatch", stopwatch);
   QWidget *root = new QWidget();  
   QPixmap *screenshot = new QPixmap(root->size());  
   screenshot->setParent(root);  
   context->setContextProperty("screenshot", screenshot);
   QCanvas *canvas = new QCanvas();  
   context->setContextProperty("canvas", canvas);
   //...  
   return app.exec();  
}
#endif // MAIN_H  

在 main.cpp 文件中,需要实现 Stopwatch 类的 isRunning() 方法和 start() 方法:

Stopwatch::Stopwatch()  
{
   m_running = false;  
}
bool Stopwatch::isRunning() const  
{
   return m_running;  
}
void Stopwatch::start()  
{
   m_running = true;  
}
void Stopwatch::stop()  
{
   m_running = false;  
}

接下来,在 QML 中可以使用 Canvas 和 Image 元素来实现自由截图功能。以下是一个简单的 QML 代码示例:

import QtQuick 2.0  
import QtQuick.Controls 2.0
Rectangle {  
   id: root  
   width: 640  
   height: 480
   Canvas {  
       id: canvas  
       width: root.width  
       height: root.height
       onPaint: {  
           var screenshot = stopwatch.screenshot  
           screenshot.save("screenshot.png")  
       }  
   }
   Image {  
       id: screenshot  
       source: "screenshot.png"  
       anchors.fill: parent  
   }
   Keys.onPressed: {  
       if (event.key === Keys.Space) {  
           stopwatch.start()  
       }  
   }
   Keys.onReleased: {  
       if (event.key === Keys.Space) {  
           stopwatch.stop()  
       }  
   }  
}

以上代码使用 Canvas 元素来绘制屏幕截图,并在 Image 元素中显示截图。在 Keys.onPressed 和 Keys.onReleased 事件处理程序中,可以使用 QKeyEvent 来捕获键盘事件,从而控制截图的启动和停止。
要使用此代码,需要在 Qt Quick 应用程序中包含 main.qml 文件,并在该文件中添加上述代码。然后,运行应用程序并在屏幕上自由截图。

自由截图二

!!!仅供参考

import QtQuick 2.0
import QtQuick.Controls 2.0
import QtQuick.Window 2.0

Window {
    visible: true
    width: 800
    height: 600
    title: "自由截图"

    Rectangle {
        id: selectionRect
        color: "transparent"
        border.color: "red"
        border.width: 2
        visible: false

        property int startX: 0
        property int startY: 0

        MouseArea {
            id: mouseArea
            anchors.fill: parent
            hoverEnabled: true

            onPressed: {
                selectionRect.visible = true
                selectionRect.startX = mouseX
                selectionRect.startY = mouseY
            }

            onPositionChanged: {
                if (mouseArea.pressed) {
                    var width = mouseX - selectionRect.startX
                    var height = mouseY - selectionRect.startY
                    selectionRect.x = selectionRect.startX
                    selectionRect.y = selectionRect.startY
                    selectionRect.width = width
                    selectionRect.height = height
                }
            }

            onReleased: {
                captureScreen(selectionRect.x, selectionRect.y, selectionRect.width, selectionRect.height)
                selectionRect.visible = false
            }
        }
    }

    function captureScreen(x, y, width, height) {
        var screen = Qt.application.screens[0]
        var grab = screen.grabWindow(0, x, y, width, height)
        var fileDialog = Qt.createQmlObject("import QtQuick.Dialogs 1.2; FileDialog {}", window)
        fileDialog.title = "保存截图"
        fileDialog.selectExisting = false
        fileDialog.onAccepted: {
            grab.saveUrl(fileDialog.fileUrl)
        }
        fileDialog.open()
    }
}


博客签名2021

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

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

相关文章

粤嵌实训医疗项目--day03(Vue + SpringBoot)

往期回顾 粤嵌实训医疗项目day02&#xff08;Vue SpringBoot&#xff09;-CSDN博客 粤嵌实训医疗项目--day01&#xff08;VueSpringBoot&#xff09;-CSDN博客 目录 一、SpringBoot AOP的使用 二、用户模块-注册功能&#xff08;文件上传&#xff09; 三、用户模块-注册实现…

基于stm32的ADC读取烟雾报警器的数值

本文想要设计一个设计一个有stm32控制的烟雾报警系统。通过MQ-2烟雾报警器将获取模拟的数值传递给stm32的ADC外设并在串口助手上显示对应的电压值。烟雾报警器浓度越高&#xff0c;他的电压就越高&#xff0c;但是不会超过3.3V。设置一个电压临界值&#xff0c;当传输回来的电压…

Python环境下LaTeX数学公式转图像方案调研与探讨

目录 引言方案一&#xff1a;基于LaTeX环境方案二&#xff1a;基于KaTeX(推荐) 方案三&#xff1a;基于Matplotlib写在最后 引言 近来&#xff0c;涉及到一些公式识别的项目&#xff0c;输入是公式的图像&#xff0c;输出是LaTeX格式的数学公式字符串。 这类项目一般都采用深…

小程序如何设置首选配送公司

小程序的一个重要环节就是配送服务。为了提供更好的发货体验&#xff0c;避免商家总是要在众多的配送公司中选择想要&#xff0c;小程序支持设置首选配送。下面将具体介绍一下小程序如何设置。 在小程序管理员后台->配送设置->首选配送处&#xff0c;指定需要设置的首选…

如何使用gpt提高效率

如何使用gpt提高效率 自动化替代人力工作减少创意工作需求技术依赖风险实际应用领域内容生成自动回答问题自动化编程个性化推荐 博主 默语带您 Go to New World. ✍ 个人主页—— 默语 的博客&#x1f466;&#x1f3fb; 《java 面试题大全》 &#x1f369;惟余辈才疏学浅&…

Linux进程控制(一)

前言&#xff1a;Linux进程控制是指在Linux操作系统中&#xff0c;对进程的创建、运行、管理和终止等方面进行控制的一系列机制和技术。Linux作为一个多任务操作系统&#xff0c;能够同时运行多个进程任务的执行&#xff0c;继前面我们对Linux进程创建的学习之后&#xff0c;今…

【多线程面试题 六】、 如何实现线程同步?

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a; 如何实现线程同步&…

Linux touch命令:创建文件及修改文件时间

既然知道了如何在 Linux 系统中创建目录&#xff0c;接下来你可能会想在这些目录中创建一些文件&#xff0c;可以使用 touch 命令。 需要注意的是&#xff0c;touch 命令不光可以用来创建文件&#xff08;当指定操作文件不存在时&#xff0c;该命令会在当前位置建立一个空文件&…

“第五十三天”

今天没有做什么&#xff0c;不过这个在打印&#xff0c;的时候一直卡着&#xff0c;我一直在想把逗号打印在后面&#xff0c;所以一直想办法确定最后一个是哪一位&#xff0c;这里居然没有绕过来其实可以看做是前面&#xff0c;这样第一个不打印逗号&#xff0c;后面打印就可以…

【笔录】TVP技术沙龙:寻宝AI时代

目录 引言大模型的应用案例大模型三问模型落地可行性考量维度AIGC的几个可行应用方向 引言 大模型是10倍的机会&#xff0c;但并不是平均主义的机会&#xff0c;没有低垂的果实。 企业想在大模型的赛道上跑出成绩&#xff0c;应该怎么做&#xff0c;又要选择哪些赛道&#xff1…

postgresSQL 数据库本地创建表空间读取本地备份tar文件与SQL文件

使用pgAdmin4&#xff0c;你安装PG得文件夹****/16/paAdmin 4 /runtime/pgAdmin4.exe 第一步&#xff1a;找到Tablespaces 第二步&#xff1a;创建表空间名称 第三步&#xff1a;指向数据文件 第四步&#xff1a;找到Databases&#xff0c;创建表空间 第五步&#xff1a;输入数…

矩阵按键简单使用

1、写矩阵按键&#xff08;下面在按这个格式把别的行也写入进去&#xff09; 2、在LCD中显示

听GPT 讲Rust源代码--library/std(7)

题图来自 Programming languages: How Google is using Rust to reduce memory safety vulnerabilities in Android[1] File: rust/library/std/src/sys/unix/kernel_copy.rs 在Rust的标准库中&#xff0c;kernel_copy.rs文件位于sys/unix目录下&#xff0c;其主要作用是实现特…

全志T113-S3 裸机SMHC eMMC读写问题记录

由于全志的资料实在太少&#xff0c;很多只能通过很长时间测试才能知道问题&#xff0c;目前还没有实现时钟初始化&#xff0c;只使用了默认的24MHz时钟&#xff0c;测试eMMC读写过程中遇到2个问题&#xff1b; 问题1&#xff1a;读取扇区的时候&#xff0c;会遇到数据停止位错…

python 笔记:h5py 读取HDF5文件

1 HDF5文件 HDF5 是 Hierarchical Data Format version 5 的缩写&#xff0c;是一种用于存储和管理大量数据的文件格式一个h5py文件可以看作是 “dataset” 和 “group” 二合一的容器 dataset : 数据集&#xff0c;像 numpy 数组一样工作group : 包含了其它 dataset 和 其它 …

双11数码好物盘点、实用不踩坑的数码好物推荐

每年的双11都是买数码产品的最佳时间&#xff0c;因为很多外设产品的在双11都有很不错的降价空间&#xff0c;今天就列出几款适合双11购买的数码产品吧&#xff01; 1、不用入耳佩戴的开放式耳机 -官方售价&#xff1a;199 推荐理由&#xff1a; 要推荐的是这款健康舒适的开…

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-屏幕监控

红队专题 招募六边形战士队员[24]屏幕监控-(1)屏幕查看与控制技术的讲解图像压缩算法图像数据转换其他 [25]---屏幕监控(2)查看屏幕的实现 招募六边形战士队员 一起学习 代码审计、安全开发、web攻防、逆向等。。。 私信联系 [24]屏幕监控-(1)屏幕查看与控制技术的讲解 屏幕…

分布式锁-Redis红锁解决方案

一 分布式锁的概念 1&#xff1a;概念 分布式锁&#xff08;多服务共享锁&#xff09; 在分布式的部署环境下&#xff0c;通过锁机制来让多客户端互斥的对共享资源进行访问控制分布式系统不同进程共同访问共享资源的一种锁的实现。如果不同的系统或同一个系统的不同主机之间共…

Oracle数据库设置归档模式(超级简单)

1、打开监听 查看监听的状态&#xff0c;如果没打开监听需要打开监听&#xff0c;如果打开直接下一步 lsnrctl status 打开监听 lsnrctl start 2、启动数据库 首先进入数据库 sqlplus /nolog 然后连接管理员 conn / as sysdba 3、查看当前模式 archive log list 可以…

Spring5学习笔记—CGlib动态代理

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; Spring专栏 ✨特色专栏&#xff1a; M…