我有一个应用程序,我可以使用QPainter
绘制分形。
paintEvent
函数如下:
void SimulationWindow::paintEvent(QPaintEvent*)
{
QPainter painter(this);
QPen my_pen;
initPainter(painter,my_pen);
initCoordsystem(painter);
if(m_mode == TRACE)
{
drawTrajectory(painter,my_pen);
}
else if(m_mode == FRACTAL)
{
drawFractal(painter, my_pen);
}
/*if(!m_isFinished)
{
update();
}*/
}
在此版本中,最后if
被注释掉了,它似乎工作正常。
否则它将在跑步期间连续绘制分形(直到m_isFinished
为真),但在开始后一秒钟,它会崩溃。
drawFractal
函数仅根据另一个名为computeFractal的函数的连续计算结果绘制分形图,该函数在另一个线程中运行。 m_isFinished
布尔变量在此函数开头设置为false,最后设置为true。
我真的很困惑,有人可以告诉我,这可能是导致坠机的原因吗?也许是因为computeFractal在不同的线程上运行?
(QtConcurrent::run(this -> m_simulationwindow, &SimulationWindow::computeFractal);
)
编辑:
void SimulationWindow::drawFractal(QPainter &painter, QPen &my_pen)
{
for(int i = 0; i < m_colors.size(); ++i)
{
if(m_colors[i] == 0)
{
my_pen.setColor(Qt::red);
painter.setPen(my_pen);
painter.drawPoint(m_positions[i]);
}
else if(m_colors[i] == 1)
{
my_pen.setColor(Qt::green);
painter.setPen(my_pen);
painter.drawPoint(m_positions[i]);
}
else if(m_colors[i] == 2)
{
my_pen.setColor(Qt::blue);
painter.setPen(my_pen);
painter.drawPoint(m_positions[i]);
}
}
}
在这种情况下,根本不会调用{p> drawTrajectory
。
答案 0 :(得分:2)
编辑:(define (search L tree)
(cond
((null? tree) '() )
((member L leftsubtree ) (cons 'left (search L leftsubtree))
((member L rightsubtree) (cons 'right (search L rightsubtree)))))
实际上安排了一个update()
,这意味着它不会导致无限递归。只有paintEvent()
会导致这种情况。
<强>建议强>:
您可以设置一个repaint()
,每一秒都会调用更新,然后以这种方式控制渲染执行/帧速率。
QTimer
然后在QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout(), this, SLOT(myUpdate()));
timer->start(1000f/60f); //every 1/60 of a second it times out
void MyWindow::myUpdate()
{
//do your logic here
update();
}
上,你应该只留下实际的渲染。
编辑:Qt有其他解决方案来控制时间,这可以帮助你渲染,例如QElapsedTimer