2011-01-05 31 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