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

How to show paginated text from a QTextDocument in QML?

本文关键字:QTextDocument 分页 文本 QML 显示      更新时间:2023-10-16

我目前有一个从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的线程亲和力被设置回原始线程。

据我所知,这是有效的(如,没有更多的警告),但在概念上感觉相当错误。