代码之家  ›  专栏  ›  技术社区  ›  Lucas

qtwebkit同步加载

  •  11
  • Lucas  · 技术社区  · 15 年前

    我使用的是没有qwebview的qwebpage,因为我想将HTML文件的内容呈现到qpixmap/qimage上。

    我想同步加载页面, 异步,这是默认值。默认方式是调用 QWebFrame::setHtml() QWebFrame::setContent() ,但这会异步加载图像。我想要的是某种阻塞函数调用,比如 QWebFrame::waitUntilLoadFinished() 之后我就可以打电话了 render() 完成它。

    我找不到这样做的方法。我错过什么了吗?

    4 回复  |  直到 12 年前
        1
  •  8
  •   Jaydeep Solanki    12 年前

    如果有人仍然需要它,这就是我使它工作的方式。

    mWebPage->mainFrame()->setHtml("...");
    QEventLoop loop;
    connect(mWebPage,SIGNAL(loadFinished(bool)),&loop,SLOT(quit()));
    loop.exec();
    /* your webpage has finished loading & is ready to use */
    
        2
  •  7
  •   drahnr    12 年前

    我建议你用qt的方式来做它,并异步进行,这有助于 许多 .

    如果您仍想同步,请使用 QEventLoop 分开的,分开的 QThread .

    有关qthread用法的详细信息,请参阅我的注释。 注意:不要忘记调用movetothread();在线程头中,否则所有信号都将经过qapplication执行循环。

        3
  •  2
  •   Georg Fritzsche    15 年前

    这种方法存在的问题是,您基本上需要等待一段不确定的时间,如果您从主线程发出调用,则会阻止事件处理,从而发出类似 loadFinished .

    而你 能够 通过明确的泵送事件来解决这个问题,我看不到一个固有的问题,它会阻止您发布页面加载,并在 负载完成的 发生。
    如果您需要二级线程来等待页面,您可以始终使用同步机制让这些线程等待。

        4
  •  0
  •   Lucas    15 年前

    如果有人感兴趣,我使用一个特殊的“pagerasterizer”类实现了这一点。

    类在构造函数中创建一个qwebpage,并将bool加载标志设置为false。A connect() 呼叫连接 loadFinished 向仅将加载标志设置为真的成员槽发送信号。

    特殊的 RenderPage() 返回图像的成员函数完成所有工作:它接受HTML字符串并调用 setHtml() . 在那之后 while 等待标志的循环;当标志为假时, qApp->processEvents() 所以信号被发出,标志设置槽最终被调用。如果是这样,循环将中断,现在您可以将页面呈现为qimage(在返回之前不要忘记将标志设置回false)。

    如果您对渲染过程感兴趣,请查看 this Qt example (the Thumbnailer::render() 函数)。

    对于奖励点,您可以使这个类成为一个函数。