首页 > 解决方案 > 使用 QGraphicsView 进行图像流式传输

问题描述

我正在尝试将 CameraLink 相机中的图像显示到 QGraphicsView 中。我正在使用一个具有 get() 和 set() 函数的环形缓冲区以及两个线程,它们消耗或生成此环形缓冲区中的图像。这部分有效,因为我已经使用 QWidget 成功进行了流式传输。我想使用 QGraphicsView 因为我想绘制那些传入的图像

我有一个提升为 QGraphicsView 的显示类,每次生成图像时,都会从消费者线程向以下函数发出信号:

void display::drawImage(ImageBW* image)
{
    firstImage = image;
    QRect rect;
    rect.setHeight(1000);
    rect.setWidth(2000);

    QApplication::postEvent(this->viewport(),new QPaintEvent(rect));
}

我重新实现了 QGraphicsview 类的 painEvent:

void display::paintEvent(QPaintEvent *event)
{
    if(firstImage)
        _drawImage();
    event->setAccepted(true);
}

绘图功能是:

void display::_drawImage()
{
    int w, h;
    if(img)
    {
        delete img;
        img = NULL;
    }
    w = firstImage->getSizeX();
    h = firstImage->getSizeY();
    unsigned char * udata = (unsigned char *)firstImage ->getData();
    img = new QImage(udata,w, h,QImage::Format_Grayscale8);

    pix_img = QPixmap::fromImage(*img);

    scene->clear();
    scene->addPixmap(pix_img);
    scene->setSceneRect(pix_img.rect());
    scene->update();
    update(); // I have tried here also setScene(scene)
}

在上面的代码中,firstImage 是一个 ImageBW* 变量。ImageBW 是存储来自相机的图像数据的位置。

我也尝试过使用 QGraphicsItem 和 addItem() 函数,但我没有得到图像。'scene' 在这个类的生产者和 'setScene(scene);' 上初始化 命令在那里。程序在一段时间后卡住了,这可能意味着这段代码产生了stackoverflow。请我已经尝试了我能想到的一切,任何帮助将不胜感激。

提前致谢

标签: c++imageqtstreamingqgraphicsview

解决方案


推荐阅读