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

发布时间 2023-08-13 12:06:08作者: 理想主义者光芒万丈

有以下文件:

相对路径:"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):