2011-01-05 30 views
1

我需要一些幫助! 在qt應用程序中,我有一箇中央控件。在這個中心部件中,我有一個QLabel,另一個QWidget。現在在gstreamer的幫助下,我可以從我的攝像頭獲取視頻並通過第二個小部件顯示它。現在的問題是我想把這個小部件的截圖放在標籤上。但我使用的方法只給了一個空白的屏幕。QWidget和xvimagesink問題!

我嘗試這樣做:

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

這:

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); 

唯一可行的就是用grabWindow但在這裏,另一件事:

的grabWindow()函數從屏幕抓取像素,而不是從窗口獲取像素,即,如果有另一個窗口部分或全部位於您抓取的那個窗口之上,則會從中獲取像素>覆蓋窗口。

現在grabWindow()沒有用,因爲這個效果,並且上面的兩個方法不想工作!

有人可以告訴我什麼是問題。可能是事實,我設置videoWidget是一個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

不需要在每一行放上''。只需選擇所有代碼,然後點擊代碼按鈕即可。 (文本塊的四個空格縮進被解釋爲代碼塊) – Nifle 2011-01-07 11:18:03

+0

只發布大代碼塊不是(通常)非常有用。代碼之前的一個小解釋通常是正常的(和禮貌的)事情。 – Nifle 2011-01-07 11:19:38

+0

好吧,我的壞。我已經發布了所有的代碼,因爲我認爲這將有助於更多?我已經在qt論壇上發佈這個問題,但迄今爲止沒有! – BlueEyes89 2011-01-07 13:46:08