首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多次调用update时Qt应用程序崩溃

多次调用update时Qt应用程序崩溃
EN

Stack Overflow用户
提问于 2015-04-30 18:21:36
回答 1查看 944关注 0票数 0

我有一个应用程序,用它我可以用QPainter绘制分形图。paintEvent函数如下:

代码语言:javascript
复制
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);)

编辑:

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

发布于 2015-04-30 18:33:49

编辑:update()实际上是一个paintEvent(),这意味着它不会导致无限递归。只有repaint()才会造成这种情况。

建议

您可以设置一个QTimer,每一秒调用一次更新,然后以这种方式控制呈现执行/框架。

代码语言:javascript
复制
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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29974992

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档