如何在QML中显示QTextDocument中的分页文本?

时间:2018-03-11 15:23:51

标签: c++ qml qt5 qt-quick

我目前有一个继承自QQuickPaintedItem的C ++类。我使用它从QTextDocument通过QTextDocument::drawContents(或通过直接调用其QTextDocumenLayout' s draw方法)绘制布局的分页富文本。

但是,正如QQuickPaintedItems文档中所述,需要注意线程问题:

  

警告:在此函数中创建QObject,发出信号,启动计时器等时必须格外小心,因为这些对渲染线程具有亲和力。

具体来说,在这种情况下,QTextDocumentLayoutPrivate具有在调用QTextDocumenLayout::draw时开始/停止的计时器。不幸的是,QTextDocument因此定时器存在于qml主线程中,而paint在渲染线程中被调用,导致像

这样的消息
  

QBasicTimer :: start:无法从另一个线程启动计时器

虽然这不会影响我的应用程序的功能(到目前为止),但这可能不是一件好事。

因此,我的问题是,是否有更好的方法来显示QML中的分页文本(不一定涉及QQuickPaintedItem)。

1 个答案:

答案 0 :(得分:1)

目前我还在使用QQuickPaintedItem,当paint被调用时,我会执行以下操作:

  • 首先检查QTextDocument是否将其亲缘关系设置为当前线程。如果是的话,我将照常进行。

  • 否则QMetaObject::invokeMethod用于调用将文档移动到呈现线程的方法,并调用update以触发重绘,现在可以在线程关联正确时起作用。在paint结束时,QTextDocument的线程关联点将重新设置为原始主题。

据我所知(就像没有更多警告一样),但在概念上感觉相当错误。