有以下文件:
相对路径:"Resources/MainWindow/MsgHtml/msgtmpl.txt"
文件内容:
要求:由于将要进行通信,我们将external0这个网页对象作为qq的发送者,这是可行的,然而接收者只有这一个对象external是不够的,我们将上面的txt文件作为一个初始版本,最后要进行更改,并最终要
写入js文件中。
(qt中所有DOM节点(属性,说明,文本等)都可以使用QDomNode表示
qt与html通信需要借助QWebChannel类,而QWebChannel这个网页通道,需要在里面注册一个网页对象(相对应的是网页对象类,之后还要定义一个网页类)。
将网页进行展示的话需要一个网页视图类。)
前期准备阶段代码:
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):