2012-10-12 8 views
6

Sto lavorando su plug-in per client im che mostrerà chatlog in QWebView. Il plugin deve supportare i modelli html. Ora sto provando ad aggiungere nuovi messaggi chiamando QWebElement.appendInside ('nuovo messaggio') e se nel template c'è javascript source non funziona. Per esempio modello può essere tale tipo:Come far funzionare JavaScript in chiamata QWebElement.appendInside ('qualche codice html')?

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

Funzioni getitall() e Animation1() non viene eseguita.

Non riesco a utilizzare QWebElement.evaluatejavascript() perché non conosco i nomi delle funzioni.

+0

È possibile cercare i nodi nel modello, quindi leggerne il contenuto e valutarlo. –

+0

C'è un altro problema con ** evaluatejavascript() **: se ** document.write() ** è usato nella funzione JavaScript (nel modello), il risultato di esso sostituirà l'intero DOM. – Sergey

+0

è un mio errore. metodo ** document.write ** non dovrebbe essere usato nella pagina caricata. ** evaluateJavaScript ** è adatto. – Sergey

risposta

1

La soluzione è usare JQuery. Guarda questo esempio

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

ho provato e con questo codice funziona:

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

Come potete vedere ho creato la mia funzione javascript e sto usando che per testare il codice. L'approccio dovrebbe essere uguale con qualsiasi metodo javascript. Quindi dovresti personalizzare il tuo codice javascript e (x) html/xml per ottenere esattamente ciò di cui hai bisogno. Ma questo dovrebbe essere un buon punto di partenza;)

+0

Come ho detto nel primo messaggio, non potevo usare assessjavascript, per qualche motivo. Innanzitutto, poiché non conosco i nomi delle funzioni JS e no, non voglio cercarli attraverso l'intero frammento di modello. – Sergey

Problemi correlati