0

我有一个应用程序,我可以使用它绘制分形QPainterpaintEvent功能如下:

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]);
       }
   }
}

drawTrajectory在这种情况下根本不调用。

4

1 回答 1

2

编辑:update()实际上 schedule 是 a 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();
}

然后paintEvent()你应该只留下实际的渲染。

编辑:Qt 有其他控制时间的解决方案,可以帮助您渲染,例如QElapsedTimer

于 2015-04-30T18:33:49.917 回答