我正在为即将在QWebView中显示聊天记录的即时客户端插件工作。插件必须支持html模板。现在我试图通过调用QWebElement.appendInside('new message')来附加新消息,如果在模板中有javascript源它不起作用。 例如,模板可以是这样的类型:
<!--MessageIn-->
<div class="space"> </div>
<div class="in MessageIn" id="oneShot">
<div class="tr">
<div class="bl">
<div class="br">
<p class="head">
<span class="time" id="time">%time%</span>
<span class="name" id="name">%name%</span>
</p>
<p class="content">
<span class="text" id="text"><script>getitall('%text%','%name%','%cid%','%base%',meldungsart[0]);</script></span>
</p>
</div>
</div>
</div>
</div>
<script type="text/javascript">animation1();</script>
不会执行函数getitall()和animation1()。
我不能使用QWebElement.evaluatejavascript()因为我不知道函数名。
答案 0 :(得分:1)
解决方案是使用JQuery。看看这个例子
//QString add contains block of HTML code
QWebElement bodyElem = webView->page()->mainFrame()->documentElement().findFirst("body");
add = "var $bodyy=$('body');"
+ "$bodyy.append('" + add + "');"
+ "null;";
bodyElem.evaluateJavaScript(add);
答案 1 :(得分:0)
我尝试过使用此代码,它可以运行:
//main.cpp:
#include <QtGui/QApplication>
#include "mainwindow.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
//mainwindow.h:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
//mainwindow.cpp:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtWebKit/QWebElement>
#include <QtWebKit/QWebPage>
#include <QtWebKit/QWebFrame>
#include <QDebug>
MainWindow::~MainWindow()
{
delete ui;
}
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QString str="<div class=\"space\"> </div>"
" <div class=\"in MessageIn\" id=\"oneShot\">"
" <div class=\"tr\">"
" <div class=\"bl\">"
" <div class=\"br\">"
" <p class=\"head\">"
" <span class=\"time\" id=\"time\">%time%</span>"
" <span class=\"name\" id=\"name\">%name%</span>"
" </p>"
" <p class=\"content\">"
" <span class=\"text\" id=\"text\"> <script>getitall('%text%','%name%','%cid%','%base%',meldungsart[0]);</script></span>"
" </p>"
" </div>"
" </div>"
" </div>"
" </div>";
QWebPage *page = new QWebPage(this);
ui->webView->setPage(page);
QWebFrame *frame = page->mainFrame();
frame->setHtml("<html><head><script type=\"text/javascript\">function displayDate(){ document.getElementById(\"time\").innerHTML=Date(); }</script></head><body><p>First Paragraph</p><p>Second Paragraph</p><div id=\"void\">void</div></body></html>");
QWebElement voiddiv = frame->findFirstElement("div#void");
voiddiv.setInnerXml(str);
voiddiv.evaluateJavaScript("displayDate();");
}
//mainwindow.ui:
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralWidget">
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QWebView" name="webView">
<property name="url">
<url>
<string>about:blank</string>
</url>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QMenuBar" name="menuBar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>18</height>
</rect>
</property>
</widget>
<widget class="QToolBar" name="mainToolBar">
<attribute name="toolBarArea">
<enum>TopToolBarArea</enum>
</attribute>
<attribute name="toolBarBreak">
<bool>false</bool>
</attribute>
</widget>
<widget class="QStatusBar" name="statusBar"/>
</widget>
<layoutdefault spacing="6" margin="11"/>
<customwidgets>
<customwidget>
<class>QWebView</class>
<extends>QWidget</extends>
<header>QtWebKit/QWebView</header>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>
//pro file:
QT += core gui webkit
TARGET = QWebViewTest
TEMPLATE = app
SOURCES += main.cpp\
mainwindow.cpp
HEADERS += mainwindow.h
FORMS += mainwindow.ui
正如您所看到的,我创建了自己的javascript函数,我正在使用它来测试代码。方法应该与任何javascript方法相同。所以你应该自定义你的javascript和(x)html / xml代码,以获得你所需要的。但这应该是一个很好的起点;)