当前位置: 代码迷 >> QT开发 >> qt沿鼠标点击的点画线,该如何解决
  详细解决方案

qt沿鼠标点击的点画线,该如何解决

热度:335   发布时间:2016-04-25 03:07:59.0
qt沿鼠标点击的点画线
我要实现沿着鼠标点击的点画线,具体是先在窗口上画点,然后点击一个按钮(也就是触发path函数),即可形成一条蓝色的线;继续在窗口画点,点击同样的按钮,即可形成一条红色的线。现在的问题是可以画出蓝色的线,当继续画点时,点可以正常画出,但是点击按钮后,无法形成红线,具体代码如下:




------解决思路----------------------
这,
你代码还搞图片上来,别人想复制帮你试试都不行
------解决思路----------------------
我是楼主,,,,求解决求解决
void MainWindow::paintEvent(QPaintEvent *)
{   QPainter pp(this);
    QPen pen,pen1,pen2;
    pen.setStyle(Qt::SolidLine);
    pen.setWidth(2);
    pen.setBrush(Qt::blue);
    pen.setJoinStyle(Qt::RoundJoin);
    pen.setCapStyle(Qt::RoundCap);
    pen1.setStyle(Qt::SolidLine);
    pen1.setWidth(2);
    pen1.setBrush(Qt::red);
    pen1.setJoinStyle(Qt::RoundJoin);
    pen1.setCapStyle(Qt::RoundCap);
    pen2.setStyle(Qt::SolidLine);
    pen2.setWidth(2);
    pen2.setBrush(Qt::green);
    pen2.setJoinStyle(Qt::RoundJoin);
    pen2.setCapStyle(Qt::RoundCap);
    if(f2==1){
      pp.drawEllipse(Point,2,2);
    }
    if(f3==1)
      {
        QPainterPath ppath;
        ppath.moveTo(x0[0],y0[0]);

        int draw;
        for(draw=0;draw<count;draw++)
        {
            ppath.lineTo(x0[draw],y0[draw]);

        }
        pp.setPen(pen);
        pp.drawPath(ppath);
        f3 = 0;
      }
    if(f8==1){
        QPainterPath ppath1;
        ppath1.moveTo(x1[0],y1[0]);
        int draw1;
        for(draw1=0;draw1<count1;draw1++)
        {
            ppath1.lineTo(x1[draw1],y1[draw1]);

        }
        pp.setPen(pen1);
        pp.drawPath(ppath1);
        f8=0;
    }
    if(f9==1){
        QPainterPath ppatht;
        ppatht.moveTo(xt[0],yt[0]);
       int drawt;
        for(drawt=0;drawt<count;drawt++)
        {
            ppatht.lineTo(xt[drawt],yt[drawt]);

        }
        pp.setPen(pen2);
        pp.drawPath(ppatht);
        f9=0;
    }
}
void MainWindow::mousePressEvent(QMouseEvent *event)
{

    if((event->button()==Qt::LeftButton)&&f1==1)
    {
       if(f6==1){
          Point = event->pos();
          x0[dot]=event->x();
          y0[dot]=event->y();
          dot++;
          count++;
          f2=1;
          update();
         }

       if(f6==0)
       {
          Point = event->pos();
          x1[dot1]=event->x();
          y1[dot1]=event->y();
          dot1++;
          count1++;
          f2=1;
          update();
       }
    }

}
void MainWindow::path()
{
     if(f7==1){

       f3 = 1;
       f2 = 0;
       f6 = 0;
       f7 = 0;
       update();
      }
    if(f7==0){

       f2 = 0;
       f8 = 1;
       f6 = 1;
       update();
    }
}

------解决思路----------------------
引用:
我是楼主,,,,求解决求解决
void MainWindow::paintEvent(QPaintEvent *)
{   QPainter pp(this);
    QPen pen,pen1,pen2;
    pen.setStyle(Qt::SolidLine);
    pen.setWidth(2);
    pen.setBrush(Qt::blue);
    pen.setJoinStyle(Qt::RoundJoin);
    pen.setCapStyle(Qt::RoundCap);
    pen1.setStyle(Qt::SolidLine);
    pen1.setWidth(2);
    pen1.setBrush(Qt::red);
    pen1.setJoinStyle(Qt::RoundJoin);
    pen1.setCapStyle(Qt::RoundCap);
    pen2.setStyle(Qt::SolidLine);
    pen2.setWidth(2);
    pen2.setBrush(Qt::green);
    pen2.setJoinStyle(Qt::RoundJoin);
    pen2.setCapStyle(Qt::RoundCap);
    if(f2==1){
      pp.drawEllipse(Point,2,2);
    }
    if(f3==1)
      {
        QPainterPath ppath;
        ppath.moveTo(x0[0],y0[0]);

        int draw;
        for(draw=0;draw<count;draw++)
        {
            ppath.lineTo(x0[draw],y0[draw]);

        }
        pp.setPen(pen);
        pp.drawPath(ppath);
        f3 = 0;
      }
    if(f8==1){
        QPainterPath ppath1;
        ppath1.moveTo(x1[0],y1[0]);
        int draw1;
        for(draw1=0;draw1<count1;draw1++)
        {
            ppath1.lineTo(x1[draw1],y1[draw1]);

        }
        pp.setPen(pen1);
        pp.drawPath(ppath1);
        f8=0;
    }
    if(f9==1){
        QPainterPath ppatht;
        ppatht.moveTo(xt[0],yt[0]);
       int drawt;
        for(drawt=0;drawt<count;drawt++)
        {
            ppatht.lineTo(xt[drawt],yt[drawt]);

        }
        pp.setPen(pen2);
        pp.drawPath(ppatht);
        f9=0;
    }
}
void MainWindow::mousePressEvent(QMouseEvent *event)
{

    if((event->button()==Qt::LeftButton)&&f1==1)
    {
       if(f6==1){
          Point = event->pos();
          x0[dot]=event->x();
          y0[dot]=event->y();
          dot++;
          count++;
          f2=1;
          update();
         }

       if(f6==0)
       {
          Point = event->pos();
          x1[dot1]=event->x();
          y1[dot1]=event->y();
          dot1++;
          count1++;
          f2=1;
          update();
       }
    }

}
void MainWindow::path()
{
     if(f7==1){

       f3 = 1;
       f2 = 0;
       f6 = 0;
       f7 = 0;
       update();
      }
    if(f7==0){

       f2 = 0;
       f8 = 1;
       f6 = 1;
       update();
    }
}

你这f全是标志位?看的有点晕,再一次画的时候能画红线也就是能满足你的f8的那个条件,自己打断点调试,
------解决思路----------------------
引用:
Quote: 引用:

我是楼主,,,,求解决求解决
void MainWindow::paintEvent(QPaintEvent *)
{   QPainter pp(this);
    QPen pen,pen1,pen2;
    pen.setStyle(Qt::SolidLine);
    pen.setWidth(2);
    pen.setBrush(Qt::blue);
    pen.setJoinStyle(Qt::RoundJoin);
    pen.setCapStyle(Qt::RoundCap);
    pen1.setStyle(Qt::SolidLine);
    pen1.setWidth(2);
    pen1.setBrush(Qt::red);
    pen1.setJoinStyle(Qt::RoundJoin);
    pen1.setCapStyle(Qt::RoundCap);
    pen2.setStyle(Qt::SolidLine);
    pen2.setWidth(2);
    pen2.setBrush(Qt::green);
    pen2.setJoinStyle(Qt::RoundJoin);
    pen2.setCapStyle(Qt::RoundCap);
    if(f2==1){
      pp.drawEllipse(Point,2,2);
    }
    if(f3==1)
      {
        QPainterPath ppath;
        ppath.moveTo(x0[0],y0[0]);

        int draw;
        for(draw=0;draw<count;draw++)
        {
            ppath.lineTo(x0[draw],y0[draw]);

        }
        pp.setPen(pen);
        pp.drawPath(ppath);
        f3 = 0;
      }
    if(f8==1){
        QPainterPath ppath1;
        ppath1.moveTo(x1[0],y1[0]);
        int draw1;
        for(draw1=0;draw1<count1;draw1++)
        {
            ppath1.lineTo(x1[draw1],y1[draw1]);

        }
        pp.setPen(pen1);
        pp.drawPath(ppath1);
        f8=0;
    }
    if(f9==1){
        QPainterPath ppatht;
        ppatht.moveTo(xt[0],yt[0]);
       int drawt;
        for(drawt=0;drawt<count;drawt++)
        {
            ppatht.lineTo(xt[drawt],yt[drawt]);

        }
        pp.setPen(pen2);
        pp.drawPath(ppatht);
        f9=0;
    }
}
void MainWindow::mousePressEvent(QMouseEvent *event)
{

    if((event->button()==Qt::LeftButton)&&f1==1)
    {
       if(f6==1){
          Point = event->pos();
          x0[dot]=event->x();
          y0[dot]=event->y();
          dot++;
          count++;
          f2=1;
          update();
         }

       if(f6==0)
       {
          Point = event->pos();
          x1[dot1]=event->x();
          y1[dot1]=event->y();
          dot1++;
          count1++;
          f2=1;
          update();
       }
    }

}
void MainWindow::path()
{
     if(f7==1){

       f3 = 1;
       f2 = 0;
       f6 = 0;
       f7 = 0;
       update();
      }
    if(f7==0){

       f2 = 0;
       f8 = 1;
       f6 = 1;
       update();
    }
}

你这f全是标志位?看的有点晕,再一次画的时候能画红线也就是能满足你的f8的那个条件,自己打断点调试,


引用:
Quote: 引用:

我是楼主,,,,求解决求解决
void MainWindow::paintEvent(QPaintEvent *)
{   QPainter pp(this);
    QPen pen,pen1,pen2;
    pen.setStyle(Qt::SolidLine);
    pen.setWidth(2);
    pen.setBrush(Qt::blue);
    pen.setJoinStyle(Qt::RoundJoin);
    pen.setCapStyle(Qt::RoundCap);
    pen1.setStyle(Qt::SolidLine);
    pen1.setWidth(2);
    pen1.setBrush(Qt::red);
    pen1.setJoinStyle(Qt::RoundJoin);
    pen1.setCapStyle(Qt::RoundCap);
    pen2.setStyle(Qt::SolidLine);
    pen2.setWidth(2);
    pen2.setBrush(Qt::green);
    pen2.setJoinStyle(Qt::RoundJoin);
    pen2.setCapStyle(Qt::RoundCap);
    if(f2==1){
      pp.drawEllipse(Point,2,2);
    }
    if(f3==1)
      {
        QPainterPath ppath;
        ppath.moveTo(x0[0],y0[0]);

        int draw;
        for(draw=0;draw<count;draw++)
        {
            ppath.lineTo(x0[draw],y0[draw]);

        }
        pp.setPen(pen);
        pp.drawPath(ppath);
        f3 = 0;
      }
    if(f8==1){
        QPainterPath ppath1;
        ppath1.moveTo(x1[0],y1[0]);
        int draw1;
        for(draw1=0;draw1<count1;draw1++)
        {
            ppath1.lineTo(x1[draw1],y1[draw1]);

        }
        pp.setPen(pen1);
        pp.drawPath(ppath1);
        f8=0;
    }
    if(f9==1){
        QPainterPath ppatht;
        ppatht.moveTo(xt[0],yt[0]);
       int drawt;
        for(drawt=0;drawt<count;drawt++)
        {
            ppatht.lineTo(xt[drawt],yt[drawt]);

        }
        pp.setPen(pen2);
        pp.drawPath(ppatht);
        f9=0;
    }
}
void MainWindow::mousePressEvent(QMouseEvent *event)
{

    if((event->button()==Qt::LeftButton)&&f1==1)
    {
       if(f6==1){
          Point = event->pos();
          x0[dot]=event->x();
          y0[dot]=event->y();
          dot++;
          count++;
          f2=1;
          update();
         }

       if(f6==0)
       {
          Point = event->pos();
          x1[dot1]=event->x();
          y1[dot1]=event->y();
          dot1++;
          count1++;
          f2=1;
          update();
       }
    }

}
void MainWindow::path()
{
     if(f7==1){

       f3 = 1;
       f2 = 0;
       f6 = 0;
       f7 = 0;
       update();
      }
    if(f7==0){

       f2 = 0;
       f8 = 1;
       f6 = 1;
       update();
    }
}

你这f全是标志位?看的有点晕,再一次画的时候能画红线也就是能满足你的f8的那个条件,自己打断点调试,


另外还有,你的鼠标事件是满足左键和那个f1(不知道f1是做什么的),然后你的这个path()函数应该也是鼠标左键吧,这样你那个鼠标事件相当于会调用2次,然后又加上你这么多标志位,我觉得不乱才怪,我个人感觉是这样的,具体的还要调试,你自己调试一下你看你的这个鼠标事件会不会进入2次。
  相关解决方案