2011-01-05 18 views
1

私はいくつかの助けが必要です! qtアプリで私は中央のウィジェットを持っています。この中央ウィジェットでは、私はQLabel、もう一つはQWidgetです。今すぐgstreamerの助けを借りて、私は自分のウェブカメラからビデオを取得し、2番目のウィジェットを介して表示することができます。今問題は、このウィジェットのスクリーンショットを取り、それをラベルに貼りたいということです。しかし、私が使用した方法は空白の画面しか表示しませんでした。QWidgetとxvimagesinkの問題!

私はこの試みた:働く唯一の事はgrabWindowを使用することです

QPixmap wpix=QPixmap(ui->videoWidget->size()); 
wpix.fill(Qt::transparent); 
ui->videoWidget->render(&wpix,QPoint(0,0),QRect(0,0,640,480),QWidget::DrawWindowBackground | QWidget::DrawChildren); 

が、ここでは別のもの:

QPixmap wpix = QPixmap::grabWidget(ui->videoWidget,0,0,640,480); 
ui->label->setPixmap(wpix); 

、これを

grabWindow()関数ウィンドウからではなく、画面からピクセルを取得します。つまり、取得したウィンドウの上に部分的または完全に別のウィンドウがある場合、ピクセルを取得します。 >上に横たわる窓。

ここで、grabWindow()はこのエフェクトのために使用されず、上記の2つのメソッドは動作したくありません。

誰かが問題を教えてもらえますか?私がビデオウィジェットをnativeWindowに設定しているのは実際ですか?(設定しないと、ビデオストリームは表示されません)

助けてください!もっと情報が必要なら私に知らせてください!そして、私の悪い英語を許してください!

答えて

0
#include "ksmile.h" 
#include "ui_ksmile.h" 
#include <gst/interfaces/xoverlay.h> 
#include <iostream> 

KSmile::KSmile(QWidget *parent) :QMainWindow(parent),ui(new Ui::KSmile) 
{ 
    QPalette p(palette()); 
    ui->setupUi(this); 


    // Set background colour to black 
    p.setColor(QPalette::Background, Qt::black); 
    ui->videoWidget->setPalette(p); 
    ui->videoWidget->setGeometry(0,0,640,480); 
    ui->videoWidget->setAttribute(Qt::WA_NativeWindow,true); 
    ui->videoWidget->show(); 
    ui->videoWidget->activateWindow(); 
    QObject::connect(&iTimer, SIGNAL(timeout()), this, SLOT(timerDone())); 
    iTimer.start(500); 
} 

void KSmile::startWebCam(int argc, char *argv[])  
{  
    vs_WebCam = new VideoStream(argc,argv); 
    vs_WebCam->vs_initWebCam(); 
    gst_x_overlay_set_xwindow_id(GST_X_OVERLAY(vs_WebCam->vs_getVideoSink()),ui->videoWidget->winId());  
    vs_WebCam->vs_playWebCam();  
    vs_WebCam->vs_setBrightness(0);  
    vs_WebCam->vs_setContrast(0); 
    vs_WebCam->vs_setHue(0); 
    vs_WebCam->vs_setSaturation(0); 

} 
void KSmile::timerDone() 
{ 
    std::cout << "In timer done " << std::endl; 
    QPixmap wpix=QPixmap(ui->videoWidget->size()); 
    wpix.fill(Qt::transparent) 
    ui->videoWidget->render(&wpix,QPoint(0,0),QRect(0,0,640,480),QWidget::DrawWindowBackground | QWidget::DrawChildren);  
    ui->label->setPixmap(wpix); 
    /** 
    wpix = QPixmap::grabWindow(ui->videoWidget,0,0,640,480); 
    ui->label->setPixmap(wpix); */ 


} 

KSmile::~KSmile() 
{ 
    delete ui; 
} 
+0

すべての行に「」を入れる必要はありません。コードボタンをクリックするだけで、すべてのコードを選択できます。 (テキストブロックの4つのスペースインデントはコードブロックとして解釈されます) – Nifle

+0

大きなコードブロックをポストするだけでは(通常は)非常に役に立ちません。コードの前の小さな説明は、通常、通常の(丁寧な)ものです。 – Nifle

+0

私の悪い私が悪いと思っていたので、私はすべてのコードを投稿しました。私はこの質問をqtフォーラムに投稿しましたが、これまで何もありませんでした! – BlueEyes89

関連する問題