2016-03-25 65 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