QT使用定时器画图软件崩溃

问题遇到的现象和发生背景

一个QT程序是由很多动插件组成,每个插件生成动态库被调用,我在地图测量插件中void paint(QPainter * painter,const QStyleOptionGraphicsItem * option,QWidget * widget);中想做一个动画,在里面放了定时器,定时器里加了for循环,启动之后视域分析调用就死了。

img

问题相关代码,请勿粘贴截图

下面这部分代码出问题


 if(!m_updateTimer->isActive()){
                    m_updateTimer->start();

                }
                connect(m_updateTimer, &QTimer::timeout, this, [=]() mutable {

                    p++;
for(int o=0;p<111;o++){


    painter->drawPie(startPoint.x()-r,startPoint.y()-r,2*r,2*r, -ccc* 16,-1 * 16);
    c=c-4;
}
//                    update();

                });
     if(p>110&&m_updateTimer->isActive()){
                    m_updateTimer->stop();

                }

这是这个代码所在的函数,函数在一个生成动态库的插件中写的

void Measure::paint(QPainter * painter,const QStyleOptionGraphicsItem * option,QWidget * widget)
{
    //设置画笔,颜色、宽度
    QPen pen;
//    pen.setColor(Qt::red);
    pen.setColor(Qt::cyan);
    pen.setWidth(1);
    painter->setPen(pen);
    QFont textFont("Times New Roman", 12);
    textFont.setBold(true);
    painter->setFont(textFont);

    painter->setRenderHint(QPainter::Antialiasing, true);

   if(m_kind!=ELEVATION)
    {
        //显示线条
        painter->drawLine(startPoint, endPoint);

        if(startPoint != QPointF(0,0))
        {
            pen.setWidth(2);
            painter->setPen(pen);
            painter->drawEllipse(startPoint,1,1);
            painter->drawEllipse(endPoint,1,1);
            pen.setWidth(2);
            painter->setPen(pen);
        }
//视域分析开始
        if(m_kind == VIEWSHED  )
        {
            if(zhelines.size()>0)
            {

               qreal r=sqrt(pow((startPoint.x()-endPoint.x()),2)+ pow((startPoint.y()-endPoint.y()),2));
               painter->drawEllipse(startPoint,r,r);

            }
            if(rightMousePress)
            {
//update();
//                zhelines.clear();



                painter->setBrush(Qt::red);
                painter->setPen(Qt::red);
                qreal r=sqrt(pow((startPoint.x()-endPoint.x()),2)+ pow((startPoint.y()-endPoint.y()),2));
//                qreal raw = qAsin((endPoint.y()-startPoint.y())*1.0/(endPoint.y()-startPoint.y()));
                  qreal raw = qAsin(qAbs((endPoint.y()-startPoint.y())/r));
//                  qreal raw = qAsin(1/2)*endPoint.x();
                int startRadius = raw* 180 / M_PI;
                qreal a=endPoint.x()-startPoint.x();
                qreal b=endPoint.y()-startPoint.y();
                qreal c;
                if(a>=0&&b>=0){
                    c=startRadius-360;
                }
                if(a>=0&&b<0){
                    c=-startRadius;
                }
                if(a<0&&b>=0){
                    c=-startRadius-180;
                }
                if(a<0&&b<0){
                    c=startRadius-180;
                }


    if(!m_updateTimer->isActive()){
                    m_updateTimer->start();

                }
                connect(m_updateTimer, &QTimer::timeout, this, [=]() mutable {

                    p++;
for(int o=0;p<111;o++){


    painter->drawPie(startPoint.x()-r,startPoint.y()-r,2*r,2*r, -ccc* 16,-1 * 16);
    c=c-4;
}
//                    update();

                });
     if(p>110&&m_updateTimer->isActive()){
                    m_updateTimer->stop();

                }

                




//    painter->drawPie(startPoint.x()-r,startPoint.y()-r,2*r,2*r, -0* 16,-1 * 16);
                QPen pen2;
                pen2.setWidth(1);

                painter->setPen(pen2);
                for(int i=0;i<global_row;i++)
                {
                    for(int j =0;j<global_col;j++)
                    {
                     qreal l=sqrt(pow((northwestx+j-startPoint.x()),2)+ pow((northwesty+i-startPoint.y()),2));
                     qreal r=sqrt(pow((startPoint.x()-endPoint.x()),2)+ pow((startPoint.y()-endPoint.y()),2));
                     if(l<r)
                     {
                          if(viewshednum[i][j] ==1 )
                          {

                              painter->setBrush(Qt::green);
                              painter->setPen(Qt::green);
                              painter->drawRect(northwestx+j,northwesty+i,1,1);
                          }
                          else
                          {
//                              painter->setBrush(Qt::red);
//                                painter->setPen(Qt::red);
//                              painter->drawRect(northwestx+j,northwesty+i,1,1);
                          }
                     }
                     else
                     {

                     }
                    }
                }
            }

          painter->setPen(pen);
        }

//视域分析结束
        if(m_kind == AREA)
        {
            if(zhelines.size()>0)
            painter->drawLine(endPoint,zhelines[0]->startPoint);
        }

        //重绘时需要画出所有直线
        for(int i = 0;i<zhelines.size();i++)
        {
            if(i>0)
            {
                ZheLinePoint* pLinePreious = zhelines[i-1];
                ZheLinePoint* pLineNext = zhelines[i];
                painter->drawLine(pLinePreious->startPoint,pLineNext->endPoint);

                pen.setWidth(2);
                painter->setPen(pen);
                painter->drawEllipse(startPoint,1,1);
                painter->drawEllipse(pLinePreious->startPoint,1,1);
                if(lineText.length()!=0)
                    painter->drawText(pLineNext->endPoint - QPointF(10,20),lineText.at(i-1));
                pen.setWidth(2);
                painter->setPen(pen);
            }
        }
    }


    //实时显示计算结果
    QFont font("Times New Roman", 16);
    font.setBold(true);
    painter->setFont(font);  

    painter->drawText(QPointF(endPoint.x()+15,endPoint.y()+5),showText);
    painter->drawText(QPointF(endPoint.x()+15,endPoint.y()+30),showText2);

    QPainterPath fontPath;
    fontPath.addText(QPointF(endPoint.x()+15,endPoint.y()+5),font,showText);
    fontPath.addText(QPointF(endPoint.x()+15,endPoint.y()+30),font,showText2);
    QPen strokePen;
    strokePen.setWidth(1);
    strokePen.setColor(Qt::black);
    painter->strokePath(fontPath,strokePen);


}

运行结果及报错内容

点击视域分析就死了

我的解答思路和尝试过的方法

通过定时器控制画图,其实我红线使用扇形画的,

我想要达到的结果

img

想要右键点击时,这些红线一条接一条的画出,,其实我红线使用扇形画的

用QTCreator调试这种崩溃问题,不好调试。在VS(比如VS2019)中安装QT插件,用VS来调试QT程序,有pdb符号文件,崩溃时,可以看到具体的代码堆栈。

努力回想修改或添加了什么之后出现问题了

你整个思路错误!
paint只管将数据转换为可视对象并绘制到屏幕或窗口中
动画功能只管修改数据
定时器功能只管延时