我有一个线程,其中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环境添加到主窗口中。)