使用线程中的项填充QGraphicsScene

时间:2015-03-11 14:47:08

标签: multithreading qgraphicsitem qgraphicsscene

我有一个线程,其中worker对象运行无限循环。这里我有以下代码,我希望它从列表中读取坐标并将QGraphicsEllipseItem放在这些坐标上。该列表可以由另一个线程更新,所以我通过互斥锁保护它。但有时列表的大小可能会增长,所以如果需要,我想为它创建新的QGraphicsEllipse项目。

int meter_to_pixel_ratio = 20;
int x_pixel, y_pixel;
int i;

forever {

    visualizationDataMutex->lock();

    while(ellipseList->count()<visualizationData->count())
    {
        qDebug() << "Creating new visual item...";
        ellipseList->append(new QGraphicsEllipseItem(0.0, 0.0, 10.0, 10.0));
        ellipseList->last()->setVisible(false);
        visualizationScene->addItem(ellipseList->last());
    }

    for(i=0; i<visualizationData->count(); i++)
    {
        x_pixel = meter_to_pixel_ratio*visualizationData->at(i)->x();
        y_pixel = meter_to_pixel_ratio*visualizationData->at(i)->y();

        ellipseList->at(i)->setPos(x_pixel, y_pixel);
        ellipseList->at(i)->setBrush(QBrush(*visualizationColor->at(i)));

        if(!ellipseList->at(i)->isVisible()) ellipseList->at(i)->setVisible(true);
    }

    visualizationDataMutex->unlock();

    // repaint scene
    visualizationScene->update();

    QThread::msleep(100);
}

我遇到的问题是,当我尝试运行程序时,我将获得运行时错误。尝试 qDebug() ellipseList-&gt; count()并且似乎具有完全相同数量的元素(如 visualizationData-&gt; count( ))。评论这三行时:

        //ellipseList->at(i)->setPos(x_pixel, y_pixel);
        //ellipseList->at(i)->setBrush(QBrush(*visualizationColor->at(i)));

        //if(!ellipseList->at(i)->isVisible()) ellipseList->at(i)->setVisible(true);

程序可以在不崩溃的情况下运行。我不明白为什么会发生这种情况,因为没有其他功能可以使用QGraphicsView / QGraphicsScene。 (QGraphicsView已从Qt Designer环境添加到主窗口中。)

0 个答案:

没有答案