首页 > 其他分享 >通过重写js脚本文件的例子看文件操作

通过重写js脚本文件的例子看文件操作

时间:2023-08-13 12:11:36浏览次数:41  
标签:文件 txt replace QString employeesList js 重写 external

有以下文件:

相对路径:"Resources/MainWindow/MsgHtml/msgtmpl.txt"

文件内容:

 要求:由于将要进行通信,我们将external0这个网页对象作为qq的发送者,这是可行的,然而接收者只有这一个对象external是不够的,我们将上面的txt文件作为一个初始版本,最后要进行更改,并最终要

写入js文件中。

 

前期准备阶段代码:

TalkWindowShell::TalkWindowShell(QWidget *parent)
	: BasicWindow(parent)
{
	ui.setupUi(this);
	setAttribute(Qt::WA_DeleteOnClose);
	initControl();

	initTcpSocket();

	QFile file("Resources/MainWindow/MsgHtml/msgtmpl.js");    //js文件相对路径
	if (!file.size()) {    //只进行一次初始化,若有内容则不会进行写入js文件操作
		QStringList employeesIDList;
		getEmployeesID(employeesIDList);   //获取员工Id,主要是为了确定创建多少个接收对象与对象的命名

		if (!createJSFile(employeesIDList)) {
			QMessageBox::information(this, QString::fromLocal8Bit("提示"),
				QString::fromLocal8Bit("更新js文件数据失败!"));
		}
	}
}

 这里看一下:getEmployeesID函数(该函数一开始是用QStringList &做返回值的,当然了返回的是在函数体中定义的局部变量,最后将它赋值给一个其他变量。这本身就有点问题。但时,鉴于int& 将局部变量返回时,还是能得到一个数值的,所以当时以为这里也ok,但是却返回了0,故此改为void作为返回值。)

void  TalkWindowShell::getEmployeesID(QStringList& employeesList)
{
    QSqlQueryModel queryModel;
    queryModel.setQuery("SELECT employeeID FROM tab_employees WHERE status=1");
    
    //返回模型的总行数(员工的总数)
    int employeesNum = queryModel.rowCount();
    QModelIndex index;
    for (int i = 0; i < employeesNum; i++) {
        index = queryModel.index(i,0);    //行,列
        employeesList << queryModel.data(index).toString();
    }
}

 

下面来看主要部分代码:

bool TalkWindowShell::createJSFile(QStringList & employeesList)
{
    //读取txt文件数据
    QString strFileTxt = "Resources/MainWindow/MsgHtml/msgtmpl.txt";
    QFile fileRead(strFileTxt);
    QString strFile;

    if (fileRead.open(QIODevice::ReadOnly)) {
        strFile = fileRead.readAll();      //注意:readAll()最后是否以回车符结束是非常有影响的(有区别)
        fileRead.close();
    }
    else {
        QMessageBox::information(this,
            QString::fromLocal8Bit("提示"),
            QString::fromLocal8Bit("读取msgtmpl.txt失败!"));
        return false;
    }

    //替换(external0,appendHtml0用作自己发信息使用)
    QFile fileWrite("Resources/MainWindow/MsgHtml/msgtmpl.js");
    if (fileWrite.open(QIODevice::WriteOnly | QIODevice::Truncate)) {
        //更新空值
        QString strSourceInitNull = "var external = null;";

        //更新初始化
        QString strSourceInit = "external = channel.objects.external;";
        
        //更新newWebChannel
        QString strSourceNew = "new QWebChannel(qt.webChannelTransport,\
            function(channel) {\
            external = channel.objects.external;\
            }\
            );";

        //更新追加recvHtml,脚本中有双引号无法直接进行赋值,采用读文件方式
        QString strSourceRecvHtml;
        QFile fileRecvHtml("Resources/MainWindow/MsgHtml/recvHtml.txt");
        if (fileRecvHtml.open(QIODevice::ReadOnly)) {
            strSourceRecvHtml = fileRecvHtml.readAll();
            fileRecvHtml.close();
        }
        else {
            QMessageBox::information(this,
                QString::fromLocal8Bit("提示"),
                QString::fromLocal8Bit("读取recvHtml.txt失败!"));
            return false;
        }

        //保存替换后的脚本
        QString strReplaceInitNull;
        QString strReplaceInit;
        QString strReplaceNew;
        QString strReplaceRecvHtml;

        for (int i = 0; i < employeesList.length(); i++) {
            //编辑替换后的空值
            QString strInitNull = strSourceInitNull;
            strInitNull.replace("external",QString("external_%1").arg(employeesList.at(i)));
            strReplaceInitNull += strInitNull;
            strReplaceInitNull += "\n";

            //编辑替换后的初始值
            QString strInit = strSourceInit;
            strInit.replace("external",QString("external_%1").arg(employeesList.at(i)));
            strReplaceInit += strInit;
            strReplaceInit += "\n";

            //编辑替换后的newWebChannel
            QString strNew = strSourceNew;
            strNew.replace("external",QString("external_%1").arg(employeesList.at(i)));
            strReplaceNew += strNew;
            strReplaceNew += "\n";

            //编辑替换后的recvHtml
            QString strRecvHtml = strSourceRecvHtml;
            strRecvHtml.replace("external",QString("external_%1").arg(employeesList.at(i)));
            strRecvHtml.replace("recvHtml",QString("recvHtml_%1").arg(employeesList.at(i)));
            strReplaceRecvHtml += strRecvHtml;
            strReplaceRecvHtml += "\n";
        }

        strFile.replace(strSourceInitNull,strReplaceInitNull);
        strFile.replace(strSourceInit, strReplaceInit);
        strFile.replace(strSourceNew, strReplaceNew);
        strFile.replace(strSourceRecvHtml, strReplaceRecvHtml);

        QTextStream stream(&fileWrite);
        stream << strFile;
        fileWrite.close();

        return true;
    }
    else {
        QMessageBox::information(this,
            QString::fromLocal8Bit("提示"),
            QString::fromLocal8Bit("写msgtmpl.js失败!"));

        return false;
    }
}

各个文件以及最终的js文件:

recvHtml.txt:

 msgtmpl.txt并未改变。

最后的js文件(msgtmpl.js)(注意这里已经有内容了,说明,下次启动程序时,不会继续调用创建js文件函数createJSFile):

 

标签:文件,txt,replace,QString,employeesList,js,重写,external
From: https://www.cnblogs.com/ylww/p/17625973.html

相关文章

  • 删除迅雷批理下载时在文件名尾部追加的41位随机字符串
    在删除迅雷批理下载时,通查会在文件名尾部追加的41位随机字符串。如文件名:知识点精讲(二十六)-建筑工程标准_889fcab66c13b6a02d0fe7b96045573a5506aaee.pdf 红色文字为迅雷追加的字符串,此时文件名过长,想删除该如何做呢?知识点精讲(二十六)-建筑工程标准_889fcab66c13b6a02d0fe......
  • Pixi.js的使用整理
    最近在做的一个前端项目中,有一些图像的处理操作(3D图,2D图都有),其中3D图也是通过获取后端服务的图像2D数据进行绘制展示,通过鼠标各种操作调用后端服务来进行重新获取新图数据。这里前端设计到图像的操作使用了PIXIJS,这里将使用的方式做一个说明,以作参考。首先pixijs的官网:https://pi......
  • 虚拟文件系统
    虚拟文件系统作为内核子系统为用户空间程序提供了文件和文件系统相关的接口。VFS之所以能衔接各种各样的文件系统,是因为它定义了所有文件系统都支持的基本的,概念上的接口和数据结构。Unix文件系统相关的抽象概念:文件,目录项,索引节点,安装节点。在Unix中,文件系统被安装在一个特定的......
  • json解析源码学习
    c#的几个Json库MiniJSONSimpleJsonlitjsonNewtonJson 其中MiniJSON最简单,所以这边也是学习这个库的Json解析部分(注意:只涉及解析,没有生成json)。整体代码也没有用到特别的算法什么的,就是一个一个字符的读取,然后根据读到的边界标识符来进行后续的读取,边界标识符的话就是:{}、[......
  • JScript连接ADO的类
    vardb={ commandText:"", connectString:"Provider=Microsoft.Ace.OLEDB.12.0;DataSource=D:\\db1.accdb", conn:newActiveXObject("adodb.connection"), open:function(){returnthis.conn.Open(this.connectString);}, close......
  • o、JS逆向
    JS逆向网站加密和混淆技术我们在爬取网站的时候,会遇一些需要分析接口或URL信息的情况,这时会有各种各样类似加密的情形。某个网站的URL带有些看不太懂的长串加密参数,要抓取就必须懂得这些参数是怎么构造的,否则我们连完整的URL都构造不出来,更不用说爬取了。在分析某个......
  • vscode取消json文件注释下划线
    使用vscode打开一个json文件,如果有单行或多行注释,则会显示红色下划线,解决办法如下:方法1点击底部的JSON,选择JSONwithComments即可,然后红色下划线消失,底部显示如下方法2方法1重启vscode可能会失效,因此在设置中搜索files.associations,然后如下图添加项这样就不会失效了!......
  • 致远OA任意文件上传漏洞
    漏洞编号无影响产品致远OAV8.0致远OAV7.1、V7.1SP1致远OAV7.0、V7.0SP1、V7.0SP2、V7.0SP3利用状态在野利用(已公开poc)漏洞详情路径(需要普通用户权限)POST/seeyon/aiax.do?method=aiaxAction&managerName=cipSynSchemeManager&requestCompress=gzipHTTP/1.1Host:1......
  • windws系统上,vscode中怎么把gin项目生产linux可执行文件
    在Windows系统上,您可以通过以下步骤在VSCode中将Gin项目生成Linux可执行文件:1.确保您已经安装了Golang和VSCode。2.打开VSCode并导入您的Gin项目。3.在终端中导航到项目的根目录。4.运行以下命令以生成Linux可执行文件:SETGOOS=linuxSETGOARCH=amd64gobuild-......
  • Django实现文件上传、文件列表查看、修改、限流和日志记录
    Django实现文件上传、文件列表查看、修改、限流和日志记录本章先简单实现文件的上传,后续会将标题的功能一一添加上去实现,并且给出远程服务器的不同连接方式【密码和秘钥】,欢迎继续关注。安装了Django框架pipinstalldjango 创建一个Django项目django-adminstartproj......