Qt4 QWidget和xvimagesink问题!

Qt4 QWidget和xvimagesink问题!,qt4,gstreamer,Qt4,Gstreamer,我需要帮助! 在qt应用程序中,我有一个中心小部件。在这个中央小部件中,我有一个QLabel,还有一个QWidget。现在,在gstreamer的帮助下,我可以从我的网络摄像头中获取视频,并通过第二个小部件进行显示。现在的问题是,我想截图这个小部件,并把它的标签上。但我所用的方法只是一个空白屏幕 我试过这个: QPixmap wpix = QPixmap::grabWidget(ui->videoWidget,0,0,640,480); ui->label->setPixmap

我需要帮助! 在qt应用程序中,我有一个中心小部件。在这个中央小部件中,我有一个
QLabel
,还有一个
QWidget
。现在,在gstreamer的帮助下,我可以从我的网络摄像头中获取视频,并通过第二个小部件进行显示。现在的问题是,我想截图这个小部件,并把它的标签上。但我所用的方法只是一个空白屏幕

我试过这个:

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()没有用了,因为这个效果,上面两个方法都不想工作

有人能告诉我问题出在哪里吗?可能是因为我将videoWidget设置为nativeWindow(如果我没有设置,我的视频流将不会显示)

请帮忙!如果你需要更多的信息,让我知道!请原谅我的英语不好

#包括“ksmile.h”
#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;  
}  
#包括“ui_ksmile.h” #包括 #包括 KSmile::KSmile(QWidget*parent):QMainWindow(parent)、ui(新ui::KSmile) { QPalette p(调色板()); 用户界面->设置用户界面(此); //将背景色设置为黑色 p、 设置颜色(Qpalete::Background,Qt::black); ui->videoWidget->setpalete(p); ui->videoWidget->setGeometry(0,0640480); ui->videoWidget->setAttribute(Qt::WA_NativeWindow,true); ui->videoWidget->show(); 用户界面->视频小部件->激活窗口(); QObject::connect(&iTimer,SIGNAL(timeout()),this,SLOT(timerDone()); iTimer.start(500); } void KSmile::startWebCam(int argc,char*argv[]) { vs_网络摄像头=新视频流(argc,argv); vs_WebCam->vs_initWebCam(); gst_x_覆盖设置窗口id(gst_x_覆盖(vs_WebCam->vs_getVideoSink()),ui->videoWidget->winId()); vs_网络摄像头->vs_播放网络摄像头(); vs_网络摄像头->vs_设置正确性(0); vs_网络摄像头->vs_设置对比度(0); vs_网络摄像头->vs_setHue(0); vs_网络摄像头->vs_设置饱和度(0); } void KSmile::timerDone() { std::cout size()); 填充(Qt::透明) ui->videoWidget->render(&wpix,QPoint(0,0),QRect(0,0640480),QWidget::DrawWindowBackground | QWidget::DrawChildren); ui->label->setPixmap(wpix); /** wpix=QPixmap::grabWindow(ui->videoWidget,0,0640480); ui->label->setPixmap(wpix);*/ } KSmile::~KSmile() { 删除用户界面; }
无需在每一行上添加
。只需选择所有代码,然后单击“代码”按钮。(文本块的四个空格缩进被解释为代码块)仅仅发布一个大的代码块(通常)没有多大帮助。代码前的一个小解释通常是正常的(和礼貌的)事情。好吧,我的错。我发布了所有的代码,因为我认为这会更有帮助?我已经在qt论坛上发布了这个问题,但到目前为止什么都没有!