2011-01-05 1 views
1

J'ai besoin d'aide! Dans l'application qt, j'ai un widget central. Dans ce widget central, j'ai un QLabel, et un autre QWidget. Maintenant, avec l'aide de gstreamer, je peux obtenir la vidéo de ma webcam et la montrer via le deuxième widget. Maintenant, le problème est que je veux prendre une capture d'écran de ce widget et le mettre sur l'étiquette. Mais les méthodes que j'ai utilisées n'ont donné qu'un écran vide.QWidget et xvimagesink problème!

J'ai essayé ceci:

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

et ceci:

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

La seule chose qui fonctionne est d'utiliser grabWindow mais voici une autre chose:

La fonction grabWindow() saisit les pixels de l'écran, pas de la fenêtre, c'est-à-dire s'il y a> une autre fenêtre partiellement ou entièrement au-dessus de celle que vous saisissez, vous obtenez des pixels de la> fenêtre sus-jacente, aussi.

Maintenant, le grabWindow() est inutile à cause de cet effet, et les 2 méthodes ci-dessus ne veulent pas fonctionner!

Quelqu'un peut-il me dire quel est le problème.Peut-il être le fait que je configure le videoWidget pour être une nativeWindow (si je ne l'ai pas défini, mon flux vidéo ne serait pas montré)?

Aidez s'il vous plaît! Si vous avez besoin de plus d'info laissez-moi savoir! Et s'il vous plaît excusez mon mauvais anglais!

Répondre

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

Pas besoin de mettre '' sur chaque ligne. Sélectionnez simplement tout votre code et cliquez sur le bouton de code. (une insertion de quatre espaces d'un bloc de texte est interprétée comme un bloc de code) – Nifle

+0

Le simple fait de poster un grand bloc de code n'est pas (généralement) très utile. Une petite explication avant le code est habituellement la chose normale (et polie) à faire. – Nifle

+0

Ok mon bad.Well j'ai posté tout le code parce que je pensais que cela aidera plus? J'ai posté cette question sur le forum qt mais jusqu'à présent rien! – BlueEyes89