2012-10-12 2 views
6

Ich arbeite am Plugin für einen Client, der in QWebView Chatlog anzeigen wird. Plugin muss HTML-Vorlagen unterstützen. Jetzt versuche ich, neue Nachrichten durch Aufruf von QWebElement.appendInside ('neue Nachricht') anzuhängen, und wenn in der Vorlage JavaScript-Quelle ist, funktioniert es nicht. Zum Beispiel Vorlage kann eine solche Art sein:Wie JavaScript in Call QWebElement.appendInside ('einige HTML-Code') arbeiten?

<!--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> 

Funktionen getitall() und animation1() nicht ausgeführt werden.

Ich kann QWebElement.evaluatejavascript() nicht verwenden, weil ich keine Funktionsnamen kenne.

+0

Sie können in der Vorlage nach Knoten suchen, dann deren Inhalt lesen und auswerten. –

+0

Es gibt ein anderes Problem mit ** evaluatejavascript() **: Wenn ** document.write() ** in der JavaScript-Funktion (in der Vorlage) verwendet wird, dann wird das Ergebnis das gesamte DOM ersetzen. – Sergey

+0

es ist mein Fehler. methode ** document.write ** sollte in geladenen Seiten nicht verwendet werden. ** evaluateJavaScript ** ist geeignet. – Sergey

Antwort

1

Die Lösung ist, JQuery zu verwenden. Schauen Sie sich dieses Beispiel an

//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); 
0

Ich habe versucht, und mit diesem Code funktioniert es:

//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 

Wie Sie mir meine eigene JavaScript-Funktion sehen und ich, dass der Code zu testen verwenden. Der Ansatz sollte mit allen Javascript-Methoden identisch sein. So sollten Sie Ihre Javascript und (x) HTML/XML-Code anpassen, um genau das zu bekommen, was Sie brauchen. Aber das sollte ein guter Startpunkt sein;)

+0

Wie ich in der ersten Nachricht gesagt habe, konnte ich aus einigen Gründen evaluatejavascript nicht verwenden. Erstens, weil ich Namen von JS-Funktionen nicht kenne und nein, ich möchte sie nicht durch das ganze Template-Fragment suchen. – Sergey

Verwandte Themen