2016-03-29 51 views
2

我是Qt的新手,我遇到了一些麻煩。在QGraphicsScene中通過視頻畫線

我想在視頻上畫一條簡單的線,就像疊加層,當我點擊一個按鈕時。 我的視頻來自相機,它被顯示爲一個QGraphicsScene(或Qframe),它是一個實時視頻。

我試着修改paintEvent,但是當新的框架出現時,這條線會出現並消失。

我也嘗試創建一個Overlay類,它帶有一些屬性(WA_NoBackGround和WA_PaintOnScreen),但是這一行出現在視頻上,但視頻停止。

這是我的用於疊加(由Draw Rectangular overlay on QWidget at click啓發)代碼:

Overlay.h

#include <QApplication> 
#include <QWidget> 
#include <QPainter> 
#include <QPointer> 

class Overlay : public QWidget 
{ 
public: 
    Overlay(QWidget * parent = 0) ; 
protected: 
    void paintEvent(QPaintEvent *e); 
}; 

Overlay.cpp

#include "overlay.h" 

Overlay::Overlay(QWidget *parent): QWidget (parent) 
{ 
//setAttribute(Qt::WA_NoSystemBackground); 
setAttribute(Qt::WA_NoBackground); 

setAttribute(Qt::WA_PaintOnScreen); 
} 

void Overlay::paintEvent(QPaintEvent *e) 
{ 
    QPainter p(this); 
    p.drawLine(0,0,100,100); 
} 

的clickDraw按鈕開槽:

QPointer<Overlay> m_overlay; 
w= static_cast<QWidget*>(ui->r_frame); 

if (!m_overlay) 
    m_overlay = new Overlay(w->parentWidget()); 
m_overlay->setGeometry(w->geometry()); 
m_overlay->show(); 
update(); 

我在嵌入式的Linux,使用Qt 4.8.6

編輯 我試圖創建一個透明的QWidget(setOpacity),用的QGraphicsView對象作爲父母,但它沒有工作,小部件呈現白色。我認爲我需要X11的組成管理器(這是我從各種網站上閱讀的內容)。

感謝您的幫助, 問候

+0

如果您使用'QGraphicsScene',則覆蓋[drawForeground](http://doc.qt.io/qt-5/qgraphicsscene.html#drawForeground)可能是一個更好的方法。 – TheDarkKnight

+1

只需在視頻項目頂部添加另一個圖形項目並使用該項目繪製線條如何? – dtech

+0

@TheDarkKnight我已經試過了,線條出現,並在視頻下立即消失。 – PierreOlivier

回答

0

爲此才能正常工作,你需要使用的Qt提供的功能:

  1. 使用VideoGraphicsItem播放視頻,在這一優良教程解釋說:使用QGraphicsLineItem可將線添加到場景中

請注意,Qt Multimedia帶有GStreamer後端,因此應該很容易將您現有的GStreamer輸入合併。

+0

和TheKarkKnight的方法一樣,它簡短地出現。 – PierreOlivier

+0

嵌入視頻的代碼是什麼? – ypnos

+0

視頻來自相機,流由gstreamer創建,並由[videooverlay]顯示(https://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/ gst-plugins-base-libs-gstvideooverlay.html#gst-video-overlay-set-window-handle) 我給了QGraphicsView的這個函數(gst_video_overlay_set_window_handle)的WinId。 – PierreOlivier