2012-10-12 209 views
6

Estoy trabajando en el complemento para el cliente im que se mostrará chatlog en QWebView. El complemento debe ser compatible con plantillas html. Ahora estoy intentando añadir nuevos mensajes mediante la llamada QWebElement.appendInside ('mensaje nuevo') y si en la plantilla hay una fuente de JavaScript, no funciona. Por ejemplo plantilla puede ser tal tipo:¿Cómo obtener javascript funcionando en la llamada QWebElement.appendInside ('algún código 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> 

Funciones getitall() y animation1() no será ejecutado.

No puedo usar QWebElement.evaluatejavascript() porque no conozco los nombres de las funciones.

+0

Puede buscar nodos en la plantilla, luego leer su contenido y evaluarlo. –

+0

Hay otro problema con ** evaluatejavascript() **: si se usa ** document.write() ** en la función de JavaScript (en plantilla), el resultado de esto reemplazará a DOM completo. – Sergey

+0

es mi error. el método ** document.write ** no debe usarse en la página cargada. ** evaluateJavaScript ** es adecuado. – Sergey

Respuesta

1

La solución es usar JQuery. Mire este ejemplo

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

me trataron y con este código funciona:

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

Como se puede ver que he creado mi propia función javascript y estoy usando eso para probar el código. El acercamiento debe ser igual con cualquier método de javascript. Por lo tanto, debe personalizar su código javascript y (x) html/xml para obtener exactamente lo que necesita. Pero este debería ser un buen punto de partida;)

+0

Como dije en el primer mensaje, no pude usar evaluatejavascript, por alguna razón. En primer lugar, porque no conozco los nombres de las funciones de JS y no, no quiero buscarlas a través de un fragmento de plantilla completo. – Sergey

Cuestiones relacionadas