044_第三代软件开发-保存PDF

第三代软件开发-保存PDF
文章目录
- 第三代软件开发-保存PDF
- 项目介绍
- 保存PDF
- 头文件
- 源文件
- 使用
关键字:
Qt
、
Qml
、
pdf
、
painter
、
打印
项目介绍
欢迎来到我们的 QML & C++ 项目!这个项目结合了 QML(Qt Meta-Object Language)和 C++ 的强大功能,旨在开发出色的用户界面和高性能的后端逻辑。
在项目中,我们利用 QML 的声明式语法和可视化设计能力创建出现代化的用户界面。通过直观的编码和可重用的组件,我们能够迅速开发出丰富多样的界面效果和动画效果。同时,我们利用 QML 强大的集成能力,轻松将 C++ 的底层逻辑和数据模型集成到前端界面中。
在后端方面,我们使用 C++ 编写高性能的算法、数据处理和计算逻辑。C++ 是一种强大的编程语言,能够提供卓越的性能和可扩展性。我们的团队致力于优化代码,减少资源消耗,以确保我们的项目在各种平台和设备上都能够高效运行。
无论您是对 QML 和 C++ 开发感兴趣,还是需要我们为您构建复杂的用户界面和后端逻辑,我们都随时准备为您提供支持。请随时联系我们,让我们一同打造现代化、高性能的 QML & C++ 项目!
重要说明☝
☀该专栏在第三代软开发更新完将涨价
保存PDF
这个其实如果是QWidget开发,那就很简单了,直接有现成的打印模块,但是QML下是没有的,这里就需要重新写一下,首先,还是需要我们使用Qt的打印模块,
QT += printsupport
这里需要说明一下,这个文件不是原创,是在GitHub上找到另一个,完了做了修改。
头文件
#ifndef XXXX_PRINT_H
#define XXXX_PRINT_H#include <QObject>
#ifndef QT_NO_PRINTER
#include <QPrinter>
#include <QPrintDialog>
#endif
#include <QQuickItem>
#include <QJSValue>
#include <QDir>class XXXX_Print : public QQuickItem
{Q_OBJECT
// QML_ELEMENTQ_DISABLE_COPY(XXXX_Print)public:typedef enum { Print, PrintToFile, GrabOnly } GrabMode;Q_ENUMS(GrabMode);private:QSharedPointer<QQuickItemGrabResult> m_result;// 打印的qml组件QQuickItem *m_item;
#ifndef QT_NO_PRINTERQPrintDialog *m_printDialogue;QPrinter *m_printer;bool m_pagePrinted;bool m_sessionOpen;// 指定调用“print()”将产生多少份副本int m_copyCount;QPainter *m_painter;// 启用或禁用抗锯齿bool m_antialias;// 启用或禁用单色打印(例如,热敏打印机)bool m_monochrome;// 选择“打印到文件”时要打印到的文件路径(在某些平台上)QString m_filepath;QRectF m_margins;
#endifGrabMode m_mode;QString m_fileDest;QString m_fileType;int m_fileQuality;QJSValue m_callback;Q_PROPERTY(QQuickItem* item READ getItem WRITE setItem NOTIFY itemChanged)
#ifndef QT_NO_PRINTERQ_PROPERTY(QString filepath READ getFilePath WRITE setFilePath NOTIFY filePathChanged)Q_PROPERTY(QString fileDest READ fileDest WRITE setFileDest NOTIFY fileDestChanged)Q_PROPERTY(bool antialias READ getAntialias WRITE setAntialias NOTIFY antialiasChanged)Q_PROPERTY(bool monochrome READ getMonochrome WRITE setMonochrome NOTIFY monochromeChanged)// 打印的 dpi 整数分辨率Q_PROPERTY(int resolution READ getResolution WRITE setResolution NOTIFY resolutionChanged)Q_PROPERTY(int copyCount READ getCopyCount WRITE setCopyCount NOTIFY copyCountChanged)// QRectF 对象,表示以设备像素为单位的页面尺寸Q_PROPERTY(QRectF pageRect READ getPageRect NOTIFY sizeChanged)Q_PROPERTY(QRectF paperRect READ getPaperRect NOTIFY sizeChanged)Q_PROPERTY(QStringList paperSizes READ getPaperSizes)Q_PROPERTY(QString printerName READ getPrinterName WRITE setPrinterName NOTIFY printerNameChanged)Q_PROPERTY(Status status READ getStatus)
#endifpublic:XXXX_Print(QQuickItem *parent = 0);~XXXX_Print();#ifndef QT_NO_PRINTERtypedef enum {Millimeter = QPageSize::Millimeter,Point = QPageSize::Point,Inch = QPageSize::Inch,Pica = QPageSize::Pica,Didot = QPageSize::Didot,Cicero = QPageSize::Cicero,DevicePixel} Unit;Q_ENUMS(Unit)typedef enum {Idle = QPrinter::Idle,Active = QPrinter::Active,Aborted = QPrinter::Aborted,Error = QPrinter::Error,Unknown} Status;Q_ENUMS(Status)
#endifpublic slots:
#ifndef QT_NO_PRINTERbool print(QJSValue callback=QJSValue());bool setup(bool bDialogue = false);bool open();bool close();bool newPage() const;bool abort();
#endifbool grabImage(const QString &fileFormat, int quality=100, QJSValue callback=QJSValue());bool saveImage(const QString &fileName, const QString &fileFormat, int quality, QJSValue callback=QJSValue());// Property Hooks:void setItem( QQuickItem *item );
#ifndef QT_NO_PRINTERvoid setFilePath(const QString &filepath);void setFileDest(const QString &newFileDest);void setMonochrome(bool toggle);void setAntialias(bool toggle);void setMargins(double top, double right, double bottom, double left);bool setPageSize( qreal width, qreal height, Unit unit );bool setPageSize( const QString &paperSize );void setPrinterName(const QString &printerName);void setResolution(int dpi);void setCopyCount(int count);
#endifQQuickItem *getItem() const { return m_item; }
#ifndef QT_NO_PRINTERQString getFilePath() const { return m_filepath; }const QString fileDest() const { return m_fileDest; };bool getMonochrome() const { return m_monochrome; }bool getAntialias() const { return m_antialias; }QRectF getMargins() const { return m_margins; }QRectF getPageRect(Unit unit=DevicePixel) const;QRectF getPaperRect(Unit unit=DevicePixel) const;QStringList getPaperSizes() const;QString getPrinterName() const;int getResolution() const { return m_printer->resolution(); }int getCopyCount() const { return m_printer->copyCount(); }Status getStatus() const;
#endifprivate slots:bool grab();void grabbed();private:bool printGrab(const QImage &img);bool isDirExist(QString fullPath);signals:void itemChanged();void frameGrabbed(const QByteArray &imageData);void sizeChanged();void printComplete();void printError();
#ifndef QT_NO_PRINTERvoid filePathChanged();void monochromeChanged();void antialiasChanged();void marginsChanged();void printerNameChanged();void resolutionChanged();void copyCountChanged();
#endifvoid fileDestChanged();void strTestChanged();
};#endif // XXXX_PRINT_H
源文件
#include "XXXX_print.h"#include <QBuffer>
#include <QFileInfo>
#include <QPainter>
#ifndef QT_NO_PRINTER
# include <QPrintEngine>
#endif
#include <QQuickItemGrabResult>// Just for converting QByteArray:
#include <QQmlEngine>void XXXX_Print::setFileDest(const QString &newFileDest)
{if (m_fileDest == newFileDest)return;m_fileDest = newFileDest;emit fileDestChanged();
}XXXX_Print::XXXX_Print(QQuickItem *parent):QQuickItem(parent)
{
#ifndef QT_NO_PRINTERm_printDialogue = nullptr;m_printer = new QPrinter(QPrinter::ScreenResolution);m_pagePrinted = false;m_sessionOpen = false;m_copyCount = 1;m_painter = nullptr;m_antialias = true;m_monochrome = false;m_margins = QRectF(0, 0, 0, 0);m_filepath.clear();
#endifm_mode = XXXX_Print::GrabOnly;m_item = NULL;m_fileDest.clear();m_fileType.clear();m_fileQuality = 0;
}XXXX_Print::~XXXX_Print()
{
#ifndef QT_NO_PRINTERdelete m_printer;
#endif
}#ifndef QT_NO_PRINTER
/*** @brief XXXX_Print::print 打印/保存PDF(打印 setup至true)* @param callback* @return*/
bool XXXX_Print::print(QJSValue callback)
{m_mode = XXXX_Print::Print;m_callback = callback;return grab();
}
#endif/*** @brief XXXX_Print::grabImage 图片以QByteArray存储* @param fileFormat* @param quality* @param callback* @return*/
bool XXXX_Print::grabImage(const QString &fileFormat, int quality, QJSValue callback)
{m_mode = XXXX_Print::GrabOnly;m_callback = callback;m_fileType = fileFormat;m_fileQuality = quality;return grab();
}/*** @brief XXXX_Print::saveImage 保存图片,不用打开* @param fileName 图片名称* @param fileFormat 图片类型* @param quality 图片像素-1 0-100* @param callback* @return*/
bool XXXX_Print::saveImage(const QString &fileName, const QString &fileFormat, int quality, QJSValue callback)
{m_mode = XXXX_Print::PrintToFile;m_callback = callback;m_fileDest = fileName;m_fileType = fileFormat;m_fileQuality = quality;return grab();
}#ifndef QT_NO_PRINTER
/*** @brief XXXX_Print::setup 初始化打印机(true)/存储PDF(false)* @param bDialogue* @return*/
bool XXXX_Print::setup(bool bDialogue)
{m_printer->setOutputFormat(QPrinter::NativeFormat);QMarginsF margins( 0.0, 0.0, 0.0, 0.0);if( !m_printer->setPageMargins( margins, QPageLayout::Millimeter ) ){qWarning() << tr("Printer: Failed to set page margin (in mm) as configured.");return false;}QString strFilePath = QCoreApplication::applicationDirPath();m_printer->setOutputFileName(m_filepath + m_fileDest); //设置输出路径if(bDialogue){m_printDialogue = new QPrintDialog(m_printer);if( m_printDialogue->exec() == QDialog::Accepted ){m_printDialogue->deleteLater();return true;}qWarning() << "打印机初始化失败";delete m_printDialogue;}else{// HP LaserJet Pro M428f-M429f [453773]m_printer->setOutputFormat(QPrinter::PdfFormat); //设置输出格式为pdfreturn true;}return false;
}/*** @brief XXXX_Print::open 打开打印机/存储* @return*/
bool XXXX_Print::open()
{if( m_sessionOpen ){qCritical() << tr("Printer::open called while already in a multipage session. (Call 'close' first.)");return false;}m_painter = new QPainter();if( !m_painter ){qCritical() << tr("Printer::open failed to instantiate new QPainter. (Are you out of memory?)");return false;}if(!m_painter->begin(m_printer)){qCritical() << tr("Failed to initialise QPainter to QPrintDevice.");return false;}m_painter->setRenderHint(QPainter::Antialiasing, m_antialias);m_painter->setRenderHint(QPainter::TextAntialiasing, m_antialias);m_painter->setRenderHint(QPainter::SmoothPixmapTransform, m_antialias);m_sessionOpen = true;return true;
}/*** @brief XXXX_Print::close 关闭打印机/存储* @return*/
bool XXXX_Print::close()
{if( !m_sessionOpen ){qCritical() << tr("Printer::close called while not in multipage session.");return false;}delete m_painter;m_painter = nullptr;m_sessionOpen = false;return true;
}/*** @brief XXXX_Print::newPage 下一页* @return*/
bool XXXX_Print::newPage() const
{if( !m_sessionOpen ){qCritical() << tr("Printer::newPage called while not in a multipage session. (Call Printer::open first.)");return false;}return m_printer->newPage();
}/*** @brief XXXX_Print::abort 中止打印机* @return*/
bool XXXX_Print::abort()
{if( m_sessionOpen )close();return m_printer->abort();
}void XXXX_Print::setMonochrome(bool toggle)
{if( m_monochrome == toggle )return;m_monochrome = toggle;emit monochromeChanged();
}void XXXX_Print::setAntialias(bool toggle)
{if( m_antialias == toggle )return;m_antialias = toggle;emit antialiasChanged();
}void XXXX_Print::setFilePath(const QString &filepath)
{if( m_filepath == filepath )return;isDirExist(filepath);m_filepath = filepath;emit filePathChanged();
}
#endifvoid XXXX_Print::setItem(QQuickItem *item)
{if( m_item == item )return;m_item = item;emit itemChanged();
}#ifndef QT_NO_PRINTER
void XXXX_Print::setMargins(double top, double right, double bottom, double left)
{QRectF m( left, top, right-left, bottom-top );if( m_margins == m )return;m_margins = m;emit marginsChanged();
}bool XXXX_Print::setPageSize( const QString &paperSize )
{QPageSize size;// Run through each..for( int x=0; x < QPageSize::LastPageSize; x++ ){size = QPageSize((QPageSize::PageSizeId)x);if( size.name() == paperSize ){bool result = m_printer->setPageSize( size );emit sizeChanged();return result;}}qWarning() << tr("Unknown paper size: ") << paperSize << tr(" (Refer to 'paperSizes()' for valid options.)");return false;
}bool XXXX_Print::setPageSize( qreal width, qreal height, Unit unit )
{QSizeF szf(width, height);QPageSize size;switch( unit ){case DevicePixel:// Fanagle from DPI:szf /= m_printer->resolution();size = QPageSize(szf, QPageSize::Inch);break;default:size = QPageSize(szf, (QPageSize::Unit)unit);break;}bool result = m_printer->setPageSize(size);emit sizeChanged();return result;
}void XXXX_Print::setPrinterName(const QString &printerName)
{if( m_printer->printerName() == printerName )return;m_printer->setPrinterName( printerName );emit printerNameChanged();
}void XXXX_Print::setResolution(int dpi)
{if( m_printer->resolution() == dpi )return;m_printer->setResolution( dpi );emit resolutionChanged();
}void XXXX_Print::setCopyCount(int count)
{if( m_printer->copyCount() == count )return;m_printer->setCopyCount( count );emit copyCountChanged();
}QRectF XXXX_Print::getPageRect(Unit unit) const
{return m_printer->pageRect( (QPrinter::Unit)unit );
}QRectF XXXX_Print::getPaperRect(Unit unit) const
{return m_printer->paperRect( (QPrinter::Unit)unit );
}QStringList XXXX_Print::getPaperSizes() const
{QStringList results;QPageSize size;// Run through each..for( int x=0; x < QPageSize::LastPageSize; x++ ){size = QPageSize((QPageSize::PageSizeId)x);results.append( size.name() );}return results;
}XXXX_Print::Status XXXX_Print::getStatus() const
{QPrinter::PrinterState state = m_printer->printEngine()->printerState();return (XXXX_Print::Status)state;
}
#endifbool XXXX_Print::grab()
{if( !m_item ){qWarning() << tr("Printer::grab: No item source specified. (Set it with the 'item' property.)");return false;}QSharedPointer<QQuickItemGrabResult> res = m_item->grabToImage();if( !res ){qWarning() << tr("Printer::grab: Grab failed for some reason. (Is the item loaded and rendered?)");return false;}connect( res.data(), SIGNAL(ready()), this, SLOT(grabbed()) );m_result = res;return true;
}#ifndef QT_NO_PRINTER
bool XXXX_Print::printGrab(const QImage &img)
{if( !m_sessionOpen ){qCritical() << tr("Printer: Attempt to print without first calling Printer::open(). (This behaviour changed in 1.2)");;return false;}if( m_monochrome )m_painter->drawImage( m_printer->paperRect(QPrinter::DevicePixel), img.convertToFormat(QImage::Format_Mono, Qt::MonoOnly | Qt::ThresholdDither) );elsem_painter->drawImage( m_printer->paperRect(QPrinter::DevicePixel), img );return true;
}/*** @brief XXXX_Print::isDirExist 判断文件夹是否存在,不存在则创建* @param fullPath* @return*/
bool XXXX_Print::isDirExist(QString fullPath)
{
// QString strFilePath = QCoreApplication::applicationDirPath();QDir dir(fullPath);if(dir.exists()){return true;}else{return dir.mkdir(fullPath);}
}
#endifvoid XXXX_Print::grabbed()
{const QImage img = m_result.data()->image();m_result.clear();QQmlEngine *jse = qmlEngine(this);jse->collectGarbage();bool ret = true;if( m_mode == XXXX_Print::PrintToFile ){ret = img.save(m_fileDest, m_fileType.toStdString().c_str(), m_fileQuality);if( m_callback.isCallable() ){QJSValueList args;args << ret;m_callback.call(args);}}
#ifndef QT_NO_PRINTERelse if( m_mode == XXXX_Print::Print ){ret = printGrab(img);if( m_callback.isCallable() ){QJSValueList args;args << ret;m_callback.call(args);}}
#endifelse if( m_callback.isCallable() ){QImage image;QByteArray ba;QBuffer buffer(&ba);buffer.open(QIODevice::WriteOnly);// 此函数将 QImage 写入给定设备ret = img.save(&buffer, m_fileType.toStdString().c_str(), m_fileQuality);buffer.close();if( ret ){QJSValueList args;args << jse->toScriptValue<QByteArray>(ba);m_callback.call( args );}}// m_callback = QJSValue();if( ret )emit printComplete();elseemit printError();
}#ifndef QT_NO_PRINTER
QString XXXX_Print::getPrinterName() const
{return m_printer->printerName();
}
#endif
使用
XXX_Print {id: printPDFfilepath: pdfFilePathfileDest: "/" + UserProfile.userName + dateString +".pdf"antialias: falsemonochrome: falseonPrintComplete: console.log("Print complete.");onPrintError: console.log("Print error!");Component.onCompleted: scanPaperSizes();function scanPaperSizes(){printPDF.setPageSize( 'A4' );printPDF.setMargins(0,0,0,0)}}

相关文章:

044_第三代软件开发-保存PDF
第三代软件开发-保存PDF 文章目录 第三代软件开发-保存PDF项目介绍保存PDF头文件源文件使用 关键字: Qt、 Qml、 pdf、 painter、 打印 项目介绍 欢迎来到我们的 QML & C 项目!这个项目结合了 QML(Qt Meta-Object Languageÿ…...
2023红帽论坛:构建开放AI生态,助力企业数字革新之路
随着人工智能技术的飞速发展,各行各业正面临着一场前所未有的数字化转型浪潮。尤其是AIGC(人工智能生成内容)技术自2022年底以来的蓬勃兴起,不仅重塑了用户体验,也为企业运营带来了深刻的变革。 在这样的大背景下&…...
阿里云国际站和华为云国际站之间该如何选择?
阿里云国际站和华为云国际站都是知名的云计算服务提供商,它们各自具有一些独特的优势和劣势。以下是它们之间的一些对比,九河云根据不同的使用场景提供的建议: 阿里云国际站: 优势: 全球覆盖:阿里云国际…...

JavaScript设计模式之责任链模式
适用场景:一个完整的流程,中间分成多个环节,各个环节之间存在一定的顺序关系,同时中间的环节的个数不一定,可能添加环节,也可能减少环节,只要保证顺序关系就可以。 如下图: ES5写法…...

云安全—kubelet攻击面
0x00 前言 虽然说总结的是kubelet的攻击面,但是在总结攻击面之前还是需要去了解kubelet的基本原理,虽然说我们浅尝即止,但是还是要以能给别人讲出来为基本原则。 其他文章: 云安全—K8s APi Server 6443 攻击面云安全—K8S API Server 未授…...
leetcode经典面试150题---5.多数元素
目录 题目描述 前置知识 代码 方法一 排序法 思路 实现 复杂度 方法二 哈希表 思路 实现 题目描述 给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的,并且给…...

Vue ElementUI el-tooltip 全局样式修改
el-tooltip 要点 此处是全局配置;如果想设置指定的 tooltip 可设置属性 popper-class,为 tooltip 的 popper 添加类名;代码 6 - 8 行,隐藏小三角; .el-tooltip__popper {border-radius: 4px !important;color: #9E9…...

MATLAB_5MW风电永磁直驱发电机-1200V直流并网MATLAB仿真模型
仿真软件:matlab2016b 风机传动模块、PMSG模块、蓄电池模块、超级电容模块、无穷大电源、蓄电池控制、风机控制、逆变器控制等模块。 逆变器输出电压: 混合储能系统SOC: 威♥关注“电击小子程高兴的MATLAB小屋”获取更多精彩资料࿰…...
11.4商业伦理(全)
大型工商业城市和小城市的商业伦理道德水平是否存在差异,如果有,存在哪些差异? 伦理道德对产业分工的影响 产业层级越高,需要的商业伦理道德水平越高 产业级别越高,利润率越高 去中心化的去信任化的比特币会不会取…...

【漏洞复现】S2-045 Remote Code Execution(CVE-2017-5638)
感谢互联网提供分享知识与智慧,在法治的社会里,请遵守有关法律法规 文章目录 1.1、漏洞描述1.2、漏洞等级1.3、影响版本1.4、漏洞复现1、基础环境2、漏洞扫描nacs3、漏洞验证 1.5、修复建议 说明内容漏洞编号CVE-2017-5638漏洞名称S2-045 远程代码执行漏…...

Linux----------------Shell重定向输入输出
(一) 标准输入 以键盘读取用户输入的数据,然后再把数据拿到 Shel程序中使用。 标准输出 Shell 程序产生的数据,这些数据一般都是呈现到显示器上供用户浏览查看 输入输出重定向 输入方向就是数据从哪里流向程序。数据默认从键…...

apachesolr中简单使用
core使用 首先点击add core 可以看到报错solrconfig.xml不在new_core目录下,new_core是我们点击后自动创建的 那么我们将D:\solr2\solr-9.3.0\solr-9.3.0\server\solr\configsets下的任何一个目录下的conf拷贝到new_core过去 这里是使用_default下的conf目录拷贝…...
C++多线程编程:其一、thread类概述
thread是C11版本中出现的线程对象,可以让程序员非常方便地创建线程。 非空的thread对象创建以后,线程就会自动运行起来。简单地理解,一个线程对象中会传入一个函数指针,之后编译器会构造一个栈,将这个函数指针压栈。函…...

C++11 initializer_list 轻量级初始化列表的使用场景(让自定义类可以用初始化列表的形式来实例化对象)
initializer_list 是 C11 中的一个特性,它允许你使用花括号 {} 中的值列表来初始化容器或数组。通常用于初始化标准库容器,比如 std::vector、std::set、std::map 以及数组。 场景一:用初始化列表初始化容器 std::vector<int> arr {…...

请求地址‘/operlog‘,发生未知异常
👨🏻💻 热爱摄影的程序员 👨🏻🎨 喜欢编码的设计师 🧕🏻 擅长设计的剪辑师 🧑🏻🏫 一位高冷无情的编码爱好者 大家好,我是全栈工…...

Makefile 保姆级使用教程
目录 Makefile 规则 Makefile的使用介绍 make 命令的使用 即时变量、延时变量介绍和使用 使用make命令编译多个文件 假想目标 常用函数 1.$(foreach var,list,text) 2.$(wildcard pattern) 3.$(filter pattern...,text) 4.$(filter-out pattern...,text) 5.$(patsub…...

【GitHub】Watch、Star、Fork、Follow 有什么区别?
目录 一、前言二、区别1. Watch2. Star3. Fork4. Follow 一、前言 GitHub 是最受欢迎的代码托管平台之一,拥有大量的开源代码可供学习。 Github 中也有类似 “点赞”、“收藏”、“加关注” 的功能。 下面介绍下,GitHub 中 Watch、Star、Fork、Follow 有…...

MyBatis实现多表映射、分页显示、逆向工程
目录 一、MyBatis实现多表映射 1.1 实体类设计 1.2 一对一关系实现案例 1.3 对多配置实现案例 1.4 设置自动映射与n张表关联映射 二、MyBatis实现分页功能 2.1 mybatis插件工作原理 2.2 引入插件与插件的使用 三、逆向工程插件 3.1 什么是逆向工程 3.2 MyBat…...
C++基础面试题
一、vector和list的区别 1.1 底层数据结构 vector 使用动态数组作为底层数据结构,元素在内存中是连续存储的; list 使用双向链表作为底层数据结构,元素在内存中通过节点相互连接。 1.2 插入和删除操作 vector 在尾部插入或删除元素效率高&…...

asp.net人事管理信息系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio
一、源码特点 asp.net 人事管理信息系统是一套完善的web设计管理系统,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为vs2010,数据库为sqlserver2008,使用c#语言 开发 asp.net 人事管理系统1 应用技术…...

网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...

【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...

uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...
快刀集(1): 一刀斩断视频片头广告
一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...