QQuickPaintedItem paint()报错Timers cannot be stopp from another thread,这似乎导致子线程死循环?

QQuickPaintedItem paint() report error that Timers cannot be stopped from another thread, which seem to cause child threads endless loop?

我的代码如下:

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

DrpltGyslPanelQQuickPaintedItem 的子类,view_QGraphicsView 的实例。我知道 DrpltGyslPanel::paintQSGRenderThread 中被调用,但是这个 Timer 有什么用呢? 而这也造成了子线程的死循环。 我怎样才能准确地杀死计时器?还是进一步了解究竟是什么导致了子线程死循环?

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

如果 QGraphicsView 显示,无限循环将不会出现在 Release 构建中,并且会出现在 Debug 构建中.

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

QGraphicsView::addItem会在here.QGraphicsView::render will kill timer at here默认间隔(2000ms)启动一个定时器。当kill timer时会估计当前线程是否为线程定时器存活以确保定时器使用在相同thread.So 我们无法从 QSGRenderThread 调用 DrpltGyslPanel::paint 中的 QGraphicsView::render。 代码更正如下:

void DrpltGyslPanel::update(const QRect &rect)
{
    renderPixman = QPixmap(view_->viewport()->rect().size());//renderPixman is member variable
    QPainter painter(&renderPixman);
    view_->render(&painter, boundingRect(), view_->viewport()->rect(), 
    Qt::KeepAspectRatio);

    QQuickPaintedItem::update(rect);
}

以及为什么会导致子线程死循环,也就是timerEvent总是被触发。