首页 > 解决方案 > QQuickPaintedItem paint() 报错Timers 无法从另一个线程停止,这似乎导致子线程死循环?

问题描述

我的代码如下:

void DrpltGyslPanel::paint(QPainter *painter)
{
    view_->render(painter, boundingRect(), view_->viewport()->rect(), Qt::KeepAspectRatio);
}

DrpltGyslPanel是 的子类QQuickPaintedItemview_是 的实例QGraphicsView。而且我知道DrpltGyslPanel::paint被调用QSGRenderThread,但是它是做什么Timer用的?而这也造成了子线程死循环。我怎样才能准确地杀死计时器?或者进一步了解究竟是什么导致了子线程无限循环?

--------------------------------添加于 2019/12/19

如果QGraphicsView显示,无限循环将不会出现在Release版本中,并且会出现在Debug版本中。

标签: qtqmlqtquick2qgraphicsview

解决方案


可能,调用 render 将在内部停止一个存在于另一个线程中的计时器。您不能在位于另一个线程中的QPainter上绘画。您可以要求_view将自身呈现为QImage并将其发送回DrpltGyslPanel使用另一个信号。您还可以在 中拥有一个QImage实例DrpltGyslPanel,与它共享_view并使用QMutex来阻止这些线程读取或写入QImage


推荐阅读