2016-03-25 34 views
1

经过10天的努力,我回到了提出我的任务基本问题的地步。Qml从C++的图像流中创建视频

我有一个三层结构。

T1。名为'MPC'的ROS项目连续发布主题'video_image'帧(例如每秒30帧视频图像)。

T2。 C++程序是作为Qt5.5项目开发的 - 一种中等工作者。 T3:

T3。 Qml UI上的图像类型对象(Qt5.5 Quick)。

我想从MPC(T1)的帧中显示T3 UI上的视频剪辑。 到目前为止,我可以做的是从T1的帧中创建QImages,并且我可以在PWD上创建一个临时图像文件(例如currentFrame.jpg)。

我应该怎么做的帧流食作为源UI视频播放器(即,到现在为止,我还在想着图像类型的视频播放器UI候选人。)

当时我下一种可能的解决方案?从这些相框流中创建视频查看器源的可行方式是什么?

回答

1

这可以通过使用QQuickPaintedItem来完成。

在C++的Qt部分

你需要有它继承QQuickPaintedItem类:

//imagewriter.h

class imagewriter : public QQuickPaintedItem 
{ 
    Q_OBJECT 

public: 
    imagewriter(QQuickItem *parent = 0); 

    void paint(QPainter *painter); 
    //the paint method is already implemented in QQuickPaintedItem 
    //you just override it 

    QImage image; //your image 

}; 

// imagewriter.cpp

imagewriter::imagewriter(QQuickItem *parent): QQuickPaintedItem(parent) 
{ 

} 

void imagewriter::paint(QPainter *painter) 
{ 
    painter->drawImage(QPoint(0,0),this->image); 
    //this will simply draw the image in your qml UI ! 
} 

现在您只需注册该对象以便能够在您的qml文件中使用它:

//主的.cpp:

int main(int argc, char *argv[]) 
{ 
    QGuiApplication app(argc, argv); 
    qmlRegisterType<imagewriter>("mr.jb",1,0,"my_video_image"); 

    QQmlApplicationEngine engine; 
    engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); 

    return app.exec(); 
} 

// main.qml:

import mr.jb 1.0 
ApplicationWindow { 
    visible: true 
    width: 640 
    height: 480 
    title: qsTr("Hello World") 


my_video_image { 
      id : my_img_strm1 
      anchors.centerin : parent 
     } 
} 

的my_video_image对象应该能够显示您的QImage,所有你需要的要做的就是不断更新该图像到你从ROS流获得的最后一幅图像,并且每次你调用预定义的update();方法,以便自动重新触发paint方法,该方法可响应在qml世界中绘制图像。 我想你没有T1部分的问题。

在T2(C++类)中接收和构建图像可以通过多种方式完成(例如QUdp)。

最后一部分(T3)在上面的代码中描述。

+0

请告诉我,如果你仍然无法做到这一点 – Kornava