QWidget и проблема xvimagesink! - PullRequest
       26

QWidget и проблема xvimagesink!

1 голос
/ 06 января 2011

Мне нужна помощь! В приложении 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 () захватывает пиксели с экрана, а не из окна, т.е. если> есть другое окно, частично или полностью поверх того, которое вы захватываете, вы также получаете пиксели из> вышележащего окна.

Теперь grabWindow () из-за этого эффекта бесполезен, а два вышеуказанных метода не хотят работать!

Может кто-нибудь сказать мне, в чем проблема. Может ли это быть из-за того, что я установил videoWidget на nativeWindow (если я его не установлю, мой видеопоток не будет показан)?

Пожалуйста, помогите! Если вам нужно больше информации, дайте мне знать! И прошу прощения за мой плохой английский!

1 Ответ

0 голосов
/ 06 января 2011
#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;  
}  
...