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