0

I am taking data from socket in which some paramaters are changing after every second. I am projecting the data on my gui. I want to update my gui after every second.

This is my sockettest class where i am receving the data and i want to plot the data in tactical widget.

  void socketTest::readyRead()
  {

    //QByteArray buffer;
    int numRead = 0, numReadTotal = 0;
    char buffer[180];

     socketTest *a = new socketTest();
     tacticalwidget *b = new tacticalwidget();

    forever {
        numRead  = socket->read(buffer, 180);

        // do whatever with array

        numReadTotal += numRead;
        memcpy (detailed_track_data, buffer, sizeof(buffer));
        //qDebug() << sizeof(buffer);
        amp = qToBigEndian(detailed_track_data[0].amplitude);
        theta = qToBigEndian(detailed_track_data[0].doa)*0.1;

        emit SIGNAL(valuechanged());
        connect(a,SIGNAL(valuechanged()), b , SLOT(tacticalwidget::paintEvent()));

        int track_state = qToBigEndian(detailed_track_data[0].track_status);
        int bit1 = 2^5;
        int bit2 = 2^4;

        //check hostility level for hostile
        if(((track_state) & (bit1)) == 0 && ((track_state) & (bit2)) == 1)
            tracktype = 0;// Hostile
            else
               //check hostility level for unknown
                if(((track_state) & (bit1)) == 0 && ((track_state) & (bit2)) == 0)
                        tracktype = 1;//unknown
                 else
                    tracktype = 2;//friendly

        if (numRead == 0 && !socket->waitForReadyRead())
            break;
    }

TacticalWidget code:

    void tacticalwidget::paintEvent(QPaintEvent */*e*/)
      {

       QSize sz = size();
       int radius;

       QPainter painter(this);
       painter.setRenderHint(QPainter::Antialiasing,true);

       QBrush br;
       br.setColor(Qt::black);

        painter.setBrush(br);
        painter.fillRect(0,0,sz.width(),sz.height(),Qt::SolidPattern);

        int centrex = sz.width()/2 ;
        int centrey = sz.height()/2;

        if (centrex < centrey )
          radius = centrex -4;
         else
         radius = centrey -4;


         painter.setPen(QPen(Qt::green,2,Qt::SolidLine,Qt::RoundCap));
         painter.drawEllipse(centrex - radius,centrey - radius,2*radius,2*radius);

         painter.setPen(QPen(Qt::yellow,2,Qt::SolidLine,Qt::RoundCap));
         painter.drawEllipse(centrex - (radius*2/3),centrey-radius*2/3),(radius*4  /3),(radius*4/3));

       painter.setPen(QPen(Qt::red,2,Qt::SolidLine,Qt::RoundCap));
       painter.drawEllipse(centrex - radius/3,centrey - radius/3,radius*2/3,radius*2/3);


        painter.setPen(QPen(Qt::white,2,Qt::SolidLine,Qt::RoundCap));
       painter.drawLine(centrex,0,centrex,centrey*2);
        painter.drawLine(0,centrey,centrex*2,centrey);

       painter.drawText(centrex - radius + 4,centrey,"270");
    painter.drawText(centrex,centrey-radius + 4 ,"N");
    painter.drawText(centrex,centrey+radius -4,"180");
    painter.drawText(centrex + radius -4,centrey,"90");

    painter.setPen(QPen(Qt::magenta,2,Qt::SolidLine,Qt::RoundCap));
    double theta = 45 * PI /180;
    painter.drawLine(centrex,centrey,centrex + radius * sin(theta),centrey - radius  *       cos(theta));

    //Track Display

    double amplitudefactor = (theObj.amp + 80)/100;
    //int trackNo = i+1;
    double pointx,pointy;
    int circleradius,innerradius = 0;

    switch(theObj.tracktype)
    {
    case 0://hostile
        circleradius = radius/3;
        pointx =centrex + circleradius * sin(theObj.theta) * amplitudefactor;
        pointy = centrey - circleradius * cos(theObj.theta)* amplitudefactor;

        painter.setPen(QPen(Qt::red,2,Qt::SolidLine,Qt::RoundCap));
        painter.drawImage(pointx,pointy,QImage("E:\\bitmaps\\rbitmap.png"));
        break;
    case 1://unknown
        circleradius = radius/3;
        innerradius = radius/3;

        pointx =centrex + innerradius * sin(theObj.theta) + circleradius *    sin(theObj.theta) * amplitudefactor;
        pointy = centrey - innerradius * cos(theObj.theta) - circleradius * cos(theObj.theta)* amplitudefactor;

        painter.setPen(QPen(Qt::yellow,2,Qt::SolidLine,Qt::RoundCap));
        painter.drawImage(pointx,pointy,QImage("E:\\bitmaps\\ybitmap.png"));
        break;
    case 2: //friendly
        circleradius = radius/3;
        innerradius = radius *2/3;

        pointx =centrex + innerradius * sin(theObj.theta) + circleradius * sin(theObj.theta) * amplitudefactor;
        pointy = centrey - innerradius * cos(theObj.theta) - circleradius * cos(theObj.theta)* amplitudefactor;

        painter.setPen(QPen(Qt::green,2,Qt::SolidLine,Qt::RoundCap));
        painter.drawImage(pointx,pointy,QImage("E:\\bitmaps\\gbitmap.png"));
        break;
    default:
        break;



    }
   // setStyleSheet("background-color: rgb(0, 0, 0);");
}
hyde
  • 60,639
  • 21
  • 115
  • 176
Learner
  • 11
  • 1
  • First of all, indent your code properly (if you want anyone to spend time on your question). – Ilya Oct 13 '14 at 09:08
  • 1
    Second, try to explain, what is your problem. Now we have your code and explanation what do you want it to do. But what is your problem? – Ilya Oct 13 '14 at 09:10
  • 2
    `emit SIGNAL(valuechanged()); connect(a,SIGNAL(valuechanged()), b , SLOT(tacticalwidget::paintEvent()));` I am afraid you can't do that Dave. – UmNyobe Oct 13 '14 at 09:39
  • Take a look at the [`QWidget::update`](http://qt-project.org/doc/qt-5/qwidget.html#update) slot. Also connect to signals to slots only once, not inside a loop. Preferably before the signal is emitted. Otherwise the slot will be called as many times as the signal was connected to it. – thuga Oct 13 '14 at 11:32

1 Answers1

2
  1. you are incorrectly handling a socket in readyRead(), check my other answer
  2. you are emitting signal then connecting it, and you are doing this mutiple times, This is BIG problem.
  3. you messed up something with endian, check out QDataStream class (it assumes that by default stream is in big endian).

In general you have nice spaghetti code so I'm not surprised it doesn't work.

Community
  • 1
  • 1
Marek R
  • 32,568
  • 6
  • 55
  • 140
  • A note about `QDataStream`: it can not handle a partial read, so using it directly on a socket is not very reliable (instead, do you own buffering and use QDataStream only on data you know is complete). – hyde Oct 13 '14 at 12:57
  • check the link I've included. – Marek R Oct 13 '14 at 13:01