2013-07-12 22 views
4

我相信QtWebKit中沒有原生函數可以使用SpellCheckerwebkit上的SpellChecker(拼寫器)

有沒有什麼辦法讓當前頁面的字段(<textarea><input><tagName contenteditable=true>),並突出顯示特定的單詞(加下劃線唯一的話可能是錯誤的)?

[編輯]

我需要添加「視覺效果」(下劃線)的而不是DOM元素,例如,如果我有這樣一個HTML:

<textarea>Helllo world!</textarea> 

只有兩個字「Helllo」將帶有下劃線,例如: enter image description here

謝謝。

回答

-2

UPDATE:

沒有,據我可以戳在QtWebKit慫恿說,你無法格式化textarea的內容。

Format text in a <textarea>?

也許你可以用div,看上去就像一個textarea替換它,然後將圍繞特定單詞一些標籤。

但是,從我在這個問題上的工作中可以看出,這不可能與QWebElement

你可以去問問巨魔,看看他們是否有任何建議。

這裏是最接近的代碼。當網頁出現時,右鍵單擊頁面上的不同位置。

的main.cpp

#include <QApplication> 
#include "webview.h" 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    WebView w; 
    w.show(); 

    return a.exec(); 
} 

webview.h

#ifndef WEBVIEW_H 
#define WEBVIEW_H 

#include <QWebView> 
#include <QContextMenuEvent> 


class WebView : public QWebView 
{ 
    Q_OBJECT 

public: 
    explicit WebView(QWidget *parent = 0); 
    ~WebView(); 

public slots: 
    void contextMenuEvent(QContextMenuEvent *); 

private: 
}; 

#endif // WEBVIEW_H 

webview.cpp

#include "webview.h" 
#include <QWebFrame> 
#include <QWebElement> 
#include <QWebElementCollection> 
#include <QDebug> 

WebView::WebView(QWidget *parent) : 
    QWebView(parent) 
{ 
    this->setUrl(QUrl("http://www.w3schools.com/tags/tag_textarea.asp")); 

    // right click on different parts of the web page 
} 

WebView::~WebView(){ } 

void WebView::contextMenuEvent(QContextMenuEvent * cme) 
{ 
    QPoint pos = cme->pos(); 

    QWebHitTestResult whtr = this->page()->frameAt(pos)->hitTestContent(pos); 

    QWebElement we = whtr.element(); 

    if(we.isNull()) 
    { 
     qDebug() << "WebElement is null."; 
    } 
    else 
    { 

     qDebug() << we.tagName() << "OuterXML <<<<<" << we.toOuterXml() << ">>>>>"; 
     qDebug() << we.tagName() << "InnerXML <<<<<" << we.toInnerXml() << ">>>>>"; 
     qDebug() << we.tagName() << "PlainText <<<<<" << we.toPlainText() << ">>>>>"; 


     // TODO: replace the lines below with a better way of extracting words from the DOM and the HTML tags 
     // This current method modifies tags instead of just the text inside tags. 
     QStringList list = we.toPlainText().split(' '); 
     for(int i = 0; i < list.size(); i++) 
     { 
      // TODO: Insert dictionary logic here when examining words 
      if(list.at(i).size() > 5) 
      { 
       list[i] = "<span class=\"sp\" style=\"border-bottom: 1px dotted red;\">" + list.at(i) + "</span>"; 
      } 
     } 
     qDebug() << list.join(" "); 
     we.setInnerXml(list.join(" ")); 
     qDebug() << "-------------------------------------------"; 
    } 
} 

因此,一些額外的研究(一些改變,你的問題後),這裏是我的方法將考慮:當頁面上執行右鍵點擊

,QWidget的(你QWebView)發出一個QContextMenuEvent

http://qt-project.org/doc/qt-4.8/qcontextmenuevent.html#details

獲取的位置了該事件,然後深入到你的網頁來找出它是:

獲取在點擊位置的肋骨......

QWebFrame * QWebPage::frameAt (const QPoint & pos) const 

信息請在該位置的命中測試的內容...

QWebHitTestResult QWebFrame::hitTestContent (const QPoint & pos) const 

查詢元素進行命中測試...

QWebElement QWebHitTestResult::element() const 

仔細檢查內容是由用戶編輯...

bool QWebHitTestResult::isContentEditable() const 

但是,這大約是據我已經得到了上這個研究項目。

如果您將頁面上的webelements重新設置爲拼寫錯誤類的span標籤,那麼您可以查找這些文件,然後創建自己的彈出式菜單,或編輯QWebViewcontextMenu

因此,不,頁面上的元素沒有上下文菜單,但是您可以模擬它,如果找到單擊的元素,然後更改QWidgetcontextMenu

http://qt-project.org/doc/qt-4.8/webkit-simpleselector.html

void Window::on_elementLineEdit_returnPressed() 
{ 
    QWebFrame *frame = webView->page()->mainFrame(); 

    QWebElement document = frame->documentElement(); 
    QWebElementCollection elements = document.findAll(elementLineEdit->text()); 

    foreach (QWebElement element, elements) 
     element.setAttribute("style", "background-color: #f0f090"); 
} 

http://qt-project.org/doc/qt-4.8/mainwindows-menus.html

void MainWindow::contextMenuEvent(QContextMenuEvent *event) 
{ 
    QMenu menu(this); 
    menu.addAction(cutAct); 
    menu.addAction(copyAct); 
    menu.addAction(pasteAct); 
    menu.exec(event->globalPos()); 
} 

同樣,我希望幫助。

使用QWebKit的至於真棒例子,是這個項目:

How to create Web History for my Browser

https://code.google.com/p/arora/

我做回購的「咒語」和「拼寫檢查」並沒有什麼搜索有用的出現了。

至於調整上飛的HTML,花式瀏覽器示例展示它是如何做:

http://qt-project.org/doc/qt-4.8/webkit-fancybrowser-mainwindow-cpp.html

void MainWindow::rotateImages(bool invert) 
{ 
    QString code; 
    if (invert) 
     code = "$('img').each(function() { $(this).css('-webkit-transition', '-webkit-transform 2s'); $(this).css('-webkit-transform', 'rotate(180deg)') })"; 
    else 
     code = "$('img').each(function() { $(this).css('-webkit-transition', '-webkit-transform 2s'); $(this).css('-webkit-transform', 'rotate(0deg)') })"; 
    view->page()->mainFrame()->evaluateJavaScript(code); 
} 

他們只是使用jQuery和加載的網頁上運行額外的JavaScript。

因此,您大概可以用"$('img').each(代替"$('textarea').each(,並對區域的文本起作用。

您也可以在頁面上運行正則表達式或使用html解析器來查找所有 <textarea>塊。

希望有所幫助。

+0

我可以使用'QWebElement'獲取所有的DOM元素,我需要的是「下劃線」一個「