多次调用更新时Qt应用程序崩溃

时间:2015-04-30 18:21:37

标签: c++ qt qpainter paintevent

我有一个应用程序,我可以使用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

1 个答案:

答案 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

相关问题