我相信 QtWebKit 中没有使用拼写检查的原生功能。
有没有办法获取当前页面的字段(<textarea>
,<input>
和<tagName contenteditable=true>
)并突出显示特定字词(只添加可能错误的字词下划线)?
[编辑]
我需要将“视觉效果”(下划线)添加到 Words 而不是 dom元素,例如,如果我有像这样的HTML:
<textarea>Helllo world!</textarea>
只有“Helllo”这个词会加下划线,例如:
谢谢。
答案 0 :(得分:-2)
更新:
不,就我在QtWebKit
进行戳戳和刺激而言,我无法确定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标记,那么您可以查找这些标记,然后创建自己的弹出菜单,或者编辑contextMenu
QWebView
就在那时。
所以,不,页面上没有元素的上下文菜单,但如果找到被点击的元素,则可以模拟它,然后更改contextMenu
QWidget
}。
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而言,Fancy Browser示例显示了它是如何完成的:
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>
块。
希望有所帮助。