2012-10-12 12 views
6

मैं आईएम क्लाइंट के लिए प्लगइन पर काम कर रहा हूं जो QWebView में चैटलॉग दिखाएगा। प्लगइन एचटीएमएल टेम्पलेट्स का समर्थन करना चाहिए। अब मैं QWebElement.appendInside ('नया संदेश') कॉल करके नए संदेशों को जोड़ने की कोशिश कर रहा हूं और यदि टेम्पलेट में जावास्क्रिप्ट स्रोत है तो यह काम नहीं करता है।कॉल में काम कर रहे जावास्क्रिप्ट को कैसे प्राप्त करें QWebElement.appendInside ('कुछ 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> 

कार्य getitall() और animation1() निष्पादित नहीं किया जाएगा: उदाहरण टेम्पलेट के लिए इस प्रकार हो सकता है।

मैं QWebElement.evaluatejavascript() का उपयोग नहीं कर सकता क्योंकि मुझे फ़ंक्शन नाम नहीं पता हैं।

+0

आप टेम्पलेट में नोड्स की खोज कर सकते हैं, फिर इसकी सामग्री पढ़ सकते हैं और इसका मूल्यांकन कर सकते हैं। –

+0

** मूल्यांकनेटास्क्रिप्ट() ** के साथ एक और समस्या है: यदि ** document.write() ** जावास्क्रिप्ट फ़ंक्शन (टेम्पलेट में) में उपयोग किया जाता है तो इसका परिणाम पूरे डोम को प्रतिस्थापित करेगा। – Sergey

+0

यह मेरी गलती है। विधि ** document.write ** लोड किए गए पृष्ठ में उपयोग नहीं किया जाना चाहिए। ** मूल्यांकन जावास्क्रिप्ट ** उपयुक्त है। – Sergey

उत्तर

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

आप देख सकते हैं मैं अपने ही जावास्क्रिप्ट समारोह बनाया है और मैं कोड का परीक्षण करने के लिए कि उपयोग कर रहा हूँ के रूप में। दृष्टिकोण किसी भी जावास्क्रिप्ट विधियों के साथ समान होना चाहिए। इसलिए आपको अपनी जावास्क्रिप्ट और (x) एचटीएमएल/एक्सएमएल कोड को बिल्कुल सही करने के लिए अनुकूलित करना चाहिए। लेकिन यह एक अच्छा प्रारंभ बिंदु होना चाहिए;)

+0

के लिए कोई समाधान नहीं है जैसा कि मैंने पहले संदेश में कहा था, मैं कुछ कारणों से मूल्यांकन पत्र का उपयोग नहीं कर सका। सबसे पहले, क्योंकि मुझे जेएस फ़ंक्शंस के नाम नहीं पता हैं और नहीं, मैं उन्हें संपूर्ण टेम्पलेट खंड के माध्यम से खोजना नहीं चाहता हूं। – Sergey

संबंधित मुद्दे