由于本人需要实现
VIPS算法,需要用到qtwebkit。简单来说,就是需要是用qtwebkit来对网页进行渲染,从而知道网页中每个字符图片等等在渲染后的页面中的坐标,字体大小,背景颜色等视觉信息。据我所知就是要用qtwebkit生成一颗render tree。由于本人以前没有qt开发经验,加上导师逼得紧,因此有几个问题请教各位高手:
测试的网页(存储在本地磁盘)
<html>
<head>
</head>
<body style="BACKGROUND-COLOR:#FFEC8B">
<p><font size="10" color='#FF33CC'>test</font><p>
<br>
<br>
<img src='./1/1.jpg'></img>
<img src='./1/2.jpg'></img>
<center>
<p><font color='#9400D3'>center</font><p>
</center>
</body>
</html>
测试代码:
[code=C]/C++
void traversal(QWebElement node)
{
if(node.isNull())
{
return;
}
QRect ss = node.geometry();
printf("Tag Name:%s Start: X-%d,Y-%d End: X-%d,Y-%d\n", qPrintable(node.tagName()), ss.topLeft().x(), ss.topLeft().y(), ss.bottomRight().x(), ss.bottomRight().y() );
//printf("Tag Name:%s Width: %d Height: %d\n", qPrintable(node.tagName()), ss.width(), ss.height());
QWebElement eee = node.firstChild();
if(!eee.isNull())
{
traversal(eee);
}
eee = node.nextSibling();
if(!eee.isNull())
{
traversal(eee);
}
return ;
}
int main(int argc, char *argv[])
{
FILE* fp = fopen("./tt.html", "rb");
if(fp == NULL)
{
printf("Can't read file!\n");
return -1;
}
char* source = new char[1024*1024];
memset(source, 0, 1024*1024);
fread(source, 1, 1024*1024, fp);
fclose(fp);
QString content(source);
QUrl url("file:///home/rmss/zp/1_files");
QApplication a(argc, argv);
QWebView *view = new QWebView;
QWebSettings * settings = QWebSettings::globalSettings();
//settings->setAttribute(QWebSettings::AutoLoadImages, false);
settings->setAttribute(QWebSettings::JavascriptEnabled, false);
settings->setAttribute(QWebSettings::JavaEnabled, false);
settings->setAttribute(QWebSettings::PluginsEnabled, false);
settings->setAttribute(QWebSettings::PrivateBrowsingEnabled, true);
settings->setDefaultTextEncoding("GB2312");
view->setHtml(content, url);
view->show();
QWebPage* page = view->page();
QWebFrame* frame = page->mainFrame();
QString str = frame->renderTreeDump();
printf("RENDER:%s\n", qPrintable(str));
QWebElement document = frame->documentElement();
QWebElement eee = document.findFirst("body");
if(eee.isNull())
{
printf("failed!\n`");
}
QString info = eee.styleProperty("background-color", QWebElement::ComputedStyle);
printf("background:%s\n", qPrintable(info));
traversal(eee);
return 0;
}
[/code]
我在遍历dom树时,对每个node调用geometry函数,文档上说这个函数应该是返回该node中内容对应的区域,但是我发现输出的坐标不对,请问qtwebkit中有没有这个功能,输出每个node中内容在渲染后的页面中的位置,比如我想知道字符串“center”在网页中哪个位置显示,是什么字体,是什么颜色。