查找选择
在QtWebEngine中,可以使用QWebEnginePage的findText方法来查找文本,查找成功以后,将自动选择当前文本。
QWebEnginePage可以通过QWebEngineView的page()来取得。
比如,如下代码可以在页面中查找hello,world并选择。
// view是一个QWebEngineView
auto page = view->page();
page->findText("hello,world");
findText方法的原型为:
void QWebEnginePage::findText(const QString &subString, QWebEnginePage::FindFlags options = {}, const std::function<void (const QWebEngineFindTextResult &)> &resultCallback = std::function<void(const QWebEngineFindTextResult &)>());
可以通过resultCallback这个参数,传递一个回调函数,根据QWebEngineFindTextResult变量,处理查找到的结果。
QWebEngineFindTextResult有两个方法,分别是activeMatch()和numberOfMatches(),分别用来表示当前激活的结果,以及一共查找到的结果总数。
获取选择文本
除了查找这种编程的方式以外,QWebEngineView作为一款浏览器控件,也支持用户手动选择。
当用户通过鼠标选择文本以后,可以通过QWebEnginePage的selectedText()方法来获得文本。
如:
auto text = mPage->selectedText ();
qDebug () << "user selected" << text;
获取选择位置
用户选择文本以后,我们除了想知道这段文本的内容以外,可能还需要知道这段文本的位置。即,这段文本在整个页面中处于什么位置。
QWebEngine并没有直接的方法,来取得一段文本的位置,但是QWebEnginePage有一个runJavaScript()方法,所以我们可以通过执行一些JavaScript,来间接地取得这些信息。
QWebEnginePage的runJavaScript()方法的原型为:
void QWebEnginePage::runJavaScript(const QString &scriptSource, const std::function<void (const QVariant &)> &resultCallback);
void QWebEnginePage::runJavaScript(const QString &scriptSource, quint32 worldId = 0, const std::function<void (const QVariant &)> &resultCallback = {})
即,我们可以通过回调函数,取得执行的JavaScript的结果。
基本的原理如下:
- 通过window.getSelection()取得所选区域Selection。
- 通过Selection的getRangeAt取得第一个Range。
- 分别返回Range的第一个节点的开头的全局偏移量,以及第二个节点的结尾的全局偏移量,为所选文本的偏移。
代码如下:
function getSelectionOffset() {
const selection = window.getSelection();
const createOffsetRange = (container, offset) => {
const range = document.createRange();
range.setStart(document.documentElement, 0);
range.setEnd(container, offset);
return range.toString().length;
};
try {
const range = selection.getRangeAt(0);
return [createOffsetRange(range.startContainer, range.startOffset), createOffsetRange(range.endContainer, range.endOffset)];
} catch</

最低0.47元/天 解锁文章
2407

被折叠的 条评论
为什么被折叠?



