zhuihunmo 2016-06-21 11:35 采纳率: 44.4%
浏览 2339
已采纳

关于QT的lable图片更新

我要用QT写一个客户端,从服务器上获取视频信息,就要一帧帧图片下载然后显示在lable上,
但是事实上要是只收一张图片,没问题,能显示,但是循环播放的话,数据确实在循环下载着,
但是界面却卡死了,图片也一张都显示不出来,显示的代码:
pixmap->loadFromData((const uchar *)picbuf, lenth, "PNG");
ui->label->setPixmap(*pixmap);
烦恼了两天,求帮助,万分感谢!

  • 写回答

1条回答

  • jieray311 2016-06-21 12:56
    关注

    首先,建立Qt Gui Application项目。

    1.控件

    控件类型 控件名称 控件说明 文本

    QLabel imagelabel 显示图片 TextLabel

    QCommandlinkButton commandbuttonnext 显示下一张图片 下一张

    2、添加资源

     下载好显示的图片,放到项目目录的images文件夹(自己创建)下。
    
      右击项目->添加新文件(New File)->QT->QT Resource file 右下角选择路径,name:images 
    
      单击“finish”。
    
      然后选中“image.qrc”, 在编辑界面正下方,单击“Add"->"add prefix"添加路径前缀(即图片文件的路径),
    
      之后,还在这里"Add files" 选择要添加的图片。
    

    3、代码

    1)头文件mainwindow.h, 类MainWindow中添加

         private:
    
               QStringList   list;         //图片列表
    
               int currentImage;         //当前图片编号
    

    2) 在图形界面,右击commandlinkbuttonnext,选择”转到槽“, 添加槽函数

    3) 在mainwindow.cpp中

       添加头文件#include <QMessageBox>        ,      #include <QFileDialog>
    
       在构造函数中添加:
    
        ui->setupUi(this);//这是系统自动生成的
    
      //一下为添加代码
    
        this->currentImage = 0;
    
    //初始化图片列表
    this->list<<"./images/1.jpg"<<"./images/2.jpg"<<"./images/3.jpg"; //注意路径的表示,否则出错
    ui->imagelabel->setBackgroundRole(QPalette::Base);
    ui->imagelabel->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
    ui->imagelabel->setScaledContents(true);
    resize(500, 400);
    QString fileName = list.at(this->currentImage);
    if(!fileName.isEmpty())
    {
        QImage image(fileName);
        if(image.isNull())
        {
            QMessageBox::information(this, tr("Image Viewer"), tr("Cannot load %1.").arg(fileName));
            return ;
        }
        ui->imagelabel->setPixmap(QPixmap::fromImage(image));
    }
    

    给槽函数on_commandlinkbuttonnext_clicked()添加:

    if(this->currentImage == 2)
    
         this->currentImage = 0;
    
    else
    
        this->currentImage++;
    QString fileName = list.at(this->currentImage);
    if(!fileName.isEmpty())
    {
        QImage image(fileName);
        if(image.isNull())
        {
            QMessageBox::information(this, tr("Image Viewer"), tr("Cannot load %1.").arg(fileName));
            return ;
        }
        ui->imagelabel->setPixmap(QPixmap::fromImage(image));
    }
    

    4.其他不变,运行可以看到效果。

    5.注意事项:一定注意初始化时,路径名和”add prefix“ 时的路径名, 如果不成功,可以多次试验。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮