我目前有一个继承自QQuickPaintedItem
的C ++类。我使用它从QTextDocument
通过QTextDocument::drawContents
(或通过直接调用其QTextDocumenLayout' s draw
方法)绘制布局的分页富文本。
但是,正如QQuickPaintedItems
文档中所述,需要注意线程问题:
警告:在此函数中创建QObject,发出信号,启动计时器等时必须格外小心,因为这些对渲染线程具有亲和力。
具体来说,在这种情况下,QTextDocumentLayoutPrivate
具有在调用QTextDocumenLayout::draw
时开始/停止的计时器。不幸的是,QTextDocument
因此定时器存在于qml主线程中,而paint
在渲染线程中被调用,导致像
QBasicTimer :: start:无法从另一个线程启动计时器
虽然这不会影响我的应用程序的功能(到目前为止),但这可能不是一件好事。
因此,我的问题是,是否有更好的方法来显示QML中的分页文本(不一定涉及QQuickPaintedItem
)。
答案 0 :(得分:1)
目前我还在使用QQuickPaintedItem
,当paint
被调用时,我会执行以下操作:
首先检查QTextDocument
是否将其亲缘关系设置为当前线程。如果是的话,我将照常进行。
否则QMetaObject::invokeMethod
用于调用将文档移动到呈现线程的方法,并调用update
以触发重绘,现在可以在线程关联正确时起作用。在paint
结束时,QTextDocument
的线程关联点将重新设置为原始主题。
据我所知(就像没有更多警告一样),但在概念上感觉相当错误。