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

头图

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

文章目录

  • 第三代软件开发-固定区域截图
    • 项目介绍
    • 固定区域截图
      • 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_DEBUGif(!p.save(path,"png")){qWarning()<<"save snapshot failed" << LOCATION;}
#elseQ_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 filescreenshotImage.source = result.url;screenshotRect.visible = truescreenshotAnimation.start()hidescreenshotRect.start()});
}

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

/// 截图展示框
Rectangle
{id:screenshotRectx:0y:0width: parent.widthheight: parent.heightvisible: falsecolor: "transparent"Image {id: screenshotImageanchors.fill: parentanchors.margins: 2}
}
ParallelAnimation {id: screenshotAnimationrunning: falseNumberAnimation { 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:hidescreenshotRectrepeat: falseinterval: 300running: falseonTriggered: 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: 480Canvas {  id: canvas  width: root.width  height: root.heightonPaint: {  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.0Window {visible: truewidth: 800height: 600title: "自由截图"Rectangle {id: selectionRectcolor: "transparent"border.color: "red"border.width: 2visible: falseproperty int startX: 0property int startY: 0MouseArea {id: mouseAreaanchors.fill: parenthoverEnabled: trueonPressed: {selectionRect.visible = trueselectionRect.startX = mouseXselectionRect.startY = mouseY}onPositionChanged: {if (mouseArea.pressed) {var width = mouseX - selectionRect.startXvar height = mouseY - selectionRect.startYselectionRect.x = selectionRect.startXselectionRect.y = selectionRect.startYselectionRect.width = widthselectionRect.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 = falsefileDialog.onAccepted: {grab.saveUrl(fileDialog.fileUrl)}fileDialog.open()}
}

博客签名2021

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

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

相关文章

js实现将文本生成二维码(腾讯云cos)

示例 页面代码 import { getQCodeUrl } from /utils/cosInstance; import { PageContainer } from ant-design/pro-components; import { Access, useAccess } from umijs/max; import { Button, Image } from antd; import { useState } from react;const AccessPage: Reac…

AD7321代码SPI接口模数转换连接DAC0832输出verilog

名称&#xff1a;AD7321代码12位ADC&#xff0c;SPI接口模数转换连接DAC0832输出 软件&#xff1a;QuartusII 语言&#xff1a;VHDL 代码功能&#xff1a; 使用VHDL语言编写代码&#xff0c;实现AD7321的控制&#xff0c;将模拟信号转换为数字信号&#xff0c;再经过处理后…

SpringCore完整学习教程5,入门级别

本章从第6章开始 6. JSON Spring Boot提供了三个JSON映射库的集成: Gson Jackson JSON-B Jackson是首选的和默认的库。 6.1. Jackson 为Jackson提供了自动配置&#xff0c;Jackson是spring-boot-starter-json的一部分。当Jackson在类路径上时&#xff0c;将自动配置Obj…

vue3-admin-element框架登录如何修改?

1、找到vite.config.js文件 配置反向代理 2、找到src文件下的user.js文件 3、找到views文件下的login文件 打开找到comp文件夹找到LoginFrom.vue页面进去 把这个改成自己的账户数据&#xff08;密码不一致自行更改&#xff09; 4、找到store文件下的modules下的user.js 5、找到…

安装 tensorflow==1.15.2 遇见的问题

一、直接安装 命令&#xff1a;pip install tensorflow1.15.2 二、换 阿里云 镜像源 命令&#xff1a;pip install -i http://mirrors.aliyun.com/pypi/simple tensorflow1.15.2 三、换 豆瓣 镜像源 命令&#xff1a;pip install http://pypi.douban.com/simple tensorflow1…

vscode连接服务器一直retry

解决方法 打开vscode控制面板&#xff0c;输入命令remote-ssh: kill vs code server on host 选择一直连接不上的服务器端口 重新连接

Mysql第四篇---数据库索引优化与查询优化

文章目录 数据库索引优化与查询优化索引失效案例数据准备1. 全值匹配2 最佳左前缀法则(联合索引)主键插入顺序4 计算、函数导致索引失效5 类型转换(自动或手动)导致索引失效6 范围条件右边的列索引失效7 不等于(!或者<>)索引失效8 is null可以使用索引, is not null无法使…

C++入门精讲——入门看完这一篇就够了

文章目录 前言1. C发展历史2. 关键字3. 命名空间3.1 命名空间的概念3.2 命名空间的定义3.3 命名空间的使用 4. C输入、输出5. 缺省参数5.1 全缺省5.2 半缺省 6. 函数重载6.1 几种不同类型的函数重载6.2 函数重载的原理——名字修饰(name Mangling)6.2.1 C程序为什么不支持函数重…

一文解决:Swagger API 未授权访问漏洞问题

Swagger 是一个用于设计、构建、文档化和使用 RESTful 风格的 Web 服务的开源软件框架。它通过提供一个交互式文档页面&#xff0c;让开发者可以更方便地查看和测试 API 接口。然而&#xff0c;在一些情况下&#xff0c;未经授权的访问可能会导致安全漏洞。本文将介绍如何解决 …

ESP8266,手机与电脑之间的TCP通讯

电脑端运行通讯猫调试助手,作为服务端: 电脑端 电脑的IP地址是: 192.168.2.232 手机与电脑之间的TCP通讯 手机端运行网络调试精灵,作为客户端: 手机端 如果从手机端点击"发送"按钮,则也会将"ghhh东方红广场"几个字发送到电脑上(服务端). ESP8266作为客户…

H5游戏分享-全民找房祖名qmxzfzm

H5游戏分享-全民找房祖名qmxzfzm 一开始就比较简单 后面就会越来越难&#xff0c;而且也有时间限制 游戏的源码 <!DOCTYPE html> <html><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width,ini…

【AD9361 数字接口CMOS LVDSSPI】B 并行数据之CMOS 续

续【AD9361 数字接口CMOS &LVDS&SPI】B 并行数据之CMOS 数据总线空闲和周转周期 &#xff08;CMOS&#xff09; P0_D[11&#xff1a;0]和P1_D[11&#xff1a;0]总线信号通常由BBP或AD9361有源驱动。在任何空闲期间&#xff0c;两个组件都会忽略数据总线值。但是&…

【Unity3D】Unity与Android交互

1 Unity 发布 apk 1.1 安装 Android Build Support 在 Unity Hub 中打开添加模块窗口&#xff0c;操作如下。 选择 Android Build Support 安装&#xff0c;如下&#xff08;笔者这里已安装过&#xff09;。 创建一个 Unity 项目&#xff0c;依次点击【File→Build Settings→…

Pytorch从零开始实战07

Pytorch从零开始实战——咖啡豆识别 本系列来源于365天深度学习训练营 原作者K同学 文章目录 Pytorch从零开始实战——咖啡豆识别环境准备数据集模型选择训练模型可视化模型预测其他问题总结 环境准备 本文基于Jupyter notebook&#xff0c;使用Python3.8&#xff0c;Pytor…

集群节点批量执行 shell 命令

1、SSH 工具本身支持多窗口 比如 MobaXterm&#xff1a; 2、编写脚本通过 ssh 在多台机器批量执行shell命令 创建 ssh_hosts 配置文件&#xff0c;定义需要批量执行的节点&#xff08;必须能够通过 ssh 免密登录&#xff0c;且存在同名用户&#xff09; vim ssh_hostsbig…

C++之左值、右值、std::forward、std::move总结(二百五十)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

039-第三代软件开发-PDF阅读器

第三代软件开发-PDF阅读器 文章目录 第三代软件开发-PDF阅读器项目介绍PDF阅读器1 初始化PDF view2 qml 中使用3 创建模块 关键字&#xff1a; Qt、 Qml、 pdf、 LTDev、 本地 项目介绍 欢迎来到我们的 QML & C 项目&#xff01;这个项目结合了 QML&#xff08;Qt Met…

python二次开发Solidworks:齿轮生成器

目录 1、参数 2、手动建模 2.1方程式驱动曲线画渐开线 2.2画基圆、齿根圆、分度圆和齿顶圆 2.3画单个齿廓 2.4以齿厚拉伸基圆草图 2.5以齿厚拉伸单齿廓草图 2.6阵列齿数个单齿 3、python自动化建模 4、总结 1、参数 模数 "m" 2 齿数"z" 50 压…

白嫖在线云服务器,免费在 linux 服务器使用 docker 。 附视频+附文档

白嫖在线云服务器&#xff0c;免费在 linux 服务器使用 docker 。 附视频附文档 文章目录 前言启动 Nginx 案例最后 视频&#xff1a;https://www.bilibili.com/video/BV1WN411W79V/ 国内互联网经过多年发展&#xff0c;单体应用已经无法支持我们的互联网业务&#xff0c;分布…

Python---练习:有一物,不知其数,三三数之余二,五五数之余三,七七数之余二,问物几何?

案例&#xff1a; 有一物&#xff0c;不知其数&#xff0c;三三数之余二&#xff0c;五五数之余三&#xff0c;七七数之余二&#xff0c;问物几何&#xff1f; 人话&#xff1a; 有一个数字&#xff0c;不知道具体是多少&#xff0c;用3去除剩2&#xff0c;用5去除剩3&#…