一个QT程序是由很多动插件组成,每个插件生成动态库被调用,我在地图测量插件中void paint(QPainter * painter,const QStyleOptionGraphicsItem * option,QWidget * widget);中想做一个动画,在里面放了定时器,定时器里加了for循环,启动之后视域分析调用就死了。
下面这部分代码出问题
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);
}
点击视域分析就死了
通过定时器控制画图,其实我红线使用扇形画的,
想要右键点击时,这些红线一条接一条的画出,,其实我红线使用扇形画的
用QTCreator调试这种崩溃问题,不好调试。在VS(比如VS2019)中安装QT插件,用VS来调试QT程序,有pdb符号文件,崩溃时,可以看到具体的代码堆栈。
努力回想修改或添加了什么之后出现问题了
你整个思路错误!
paint只管将数据转换为可视对象并绘制到屏幕或窗口中
动画功能只管修改数据
定时器功能只管延时