6

我正在为即时通讯客户端开发插件,该插件将在 QWebView 中显示聊天日志。插件必须支持 html 模板。现在我正在尝试通过调用 QWebElement.appendInside('new message') 来附加新消息,如果在模板中有 javascript 源它不起作用。例如模板可能是这样的类型:

<!--MessageIn-->
<div class="space">&nbsp;</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() 因为我不知道函数名称。

4

2 回答 2

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);
于 2013-02-02T21:41:48.910 回答
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\">&nbsp;</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 代码以获得您所需要的。但这应该是一个很好的起点;)

于 2012-10-22T10:32:28.027 回答