有以下文件:
相对路径:"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