找回密码
 立即注册
收起左侧

新手接触Qt遇到个百思不得其解的问题,希望高手指教

0
回复
6281
查看
[复制链接]
累计签到:2 天
连续签到:1 天
来源: 2017-7-24 09:51:15 显示全部楼层 |阅读模式
1Qter豆
我的本意是用QT来显示tcp/ip中客户端接收过来的像素文件并且显示出来。图片的大小是128*496个字节,也就是128条线,每条线496个点,显示前每条线需要截去16个点,结果图像发生了错位。具体程序如下
typedef unsigned short WORD;
typedef unsigned char BYTE;
typedef unsigned int DWORD;
//const int dstSize = 128*2;

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    connect_tcp();
    QTimer *timer=new QTimer(this);
    timer->setSingleShot(false);
    connect(timer,SIGNAL(timeout()),this,SLOT(update()));
    timer->start(1000);
}

Widget::~Widget()
{
    close_tcp();
    delete ui;
}
void Widget::connect_tcp()
{
    struct sockaddr_in   server;
    struct sockaddr_in   client;
    int     opt = 1;
   socklen_t   sin_len = sizeof(client);
//  printf("aaa\n");
    if( ( listensd = socket(AF_INET,SOCK_STREAM,0) ) == -1 )
    {
            perror("socket");
            exit(1);
    }
    setsockopt(listensd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));
  //  printf("bbb\n");
     bzero(&server,sizeof(server));
    server.sin_family = AF_INET;
    server.sin_port = htons(SER_PORT);
    server.sin_addr.s_addr = htonl(INADDR_ANY);
     if( bind(listensd,(struct sockaddr *)&server,sizeof(server)) < 0)
    {
            perror("Bind");
            ::close(listensd);
            exit(1);
    }
  //   printf("ccc \n");
     if( listen(listensd,5) == -1 )
    {
            perror("listen");
            ::close(listensd);
            exit(1);
    }
    while( (connectsd = accept(listensd,(struct sockaddr *)&client,&sin_len)) < 0 ) printf("ddd \n");;
   // printf("connectsd=%d\n",connectsd);
}
void Widget::close_tcp()
{
    ::close(connectsd);
    ::close(listensd);
}

void Widget::paintEvent(QPaintEvent *e)
{

  //  t++;
   // printf("%d",t);
  //  printf("ccc \n");
    QPainter paint(this);
    DWORD wsize = 128*480;
    BYTE * psData1 = (BYTE*)malloc(wsize*2);
    BYTE *psData = (BYTE*)malloc(wsize);
    BYTE *p;
    p = psData;
    BYTE *p1;
    p1 = psData1;
    DWORD *pSrc = (DWORD*)malloc(wsize*sizeof(DWORD));
    BYTE buff[128*16*2];
    int   rn=0,dn=0 ;
   
    int i=1;
   
//读取128条线,截取他们的字头
   for(i=1;i<=128;i++)
    {
      int sum=0;
      dn = read(connectsd,buff,16*2);
      printf("dn=%d",dn);
      if(dn == 0)
        {
          printf("截错了\n");
          break;
        }
      printf("截去第%d线字头",i);
      
      while(1)
        {
          rn = read(connectsd,psData1+sum,MAX_LEN-sum);//MAX_LEN=480*2
         if(rn==-1)
             perror("read");
     if(rn==0)
             break;
          sum += rn;
        }
     printf("sum=%d\n",sum);
     psData1 += sum;
    }
psData1 = p1;

//16位截取成8位
short mid[480*128];//16位一取,准备截位
char mid2[480*128];//装8位数据用的
char a[480*128*2];//把16位数据放到mid里


for(int i=0;i<480*128*2;i++)
{
  a=*psData1;
  psData1 +=1;
}


psData1 = p1;
int j=0;



for(int n=0;n<480*128;n++)
    {
        
        mid[n]=(short)a[j]+(((short)a[j+1])<<8);      
      j+=2;

    }


for(int m=0;m<480*128;m++)
{
   mid2[m] = (char)(mid[m]>>8);
   *psData = mid2[m];
   psData+=1;
}
psData = p;
//rgb色彩显示规则
        for (unsigned int i = 0; i <wsize; ++i)
        {
            BYTE *pb=(BYTE *)(pSrc+i);
            pSrc = 0;
            pb[0] = psData;
            pb[1] = psData;
            pb[2] = psData;
        }
   
    free(psData1);
    free(psData);

    QByteArray imageByteArray = QByteArray( (const char*)pSrc, wsize*4 );
    uchar*  transData = (unsigned char*)imageByteArray.data();
    QImage image = QImage(transData, 480, 128, QImage::Format_RGB32);
    free(pSrc);

    paint.drawImage(QPoint(100,200), image);
    paint.end();

}
如果按打开文件的方式显示,正常结果应该是

但是我运行增加接收程序后它的结果是

显示的结果发生了错位,不知道什么原因,但是文件里的数据都是正确的啊。它运行的过程也是很诡异的,先显示了正常数据的前2/3,之后又显示了剩下的1/3,又刷新一遍将整个图片打乱,希望各位大神能给出宝贵的意见。小弟的邮箱是471719902@qq.com

附件: 您需要 登录 才可以下载或查看,没有帐号?立即注册
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了