2013-06-08 7 views
0

После прочтения этой дискуссии: Draw on top of xoverlay using Qt Я закончил с этим кодом:GStreamer и QWidgets

class Player : public QGst::Ui::VideoWidget { ... } 

void Player::play() { 
    QGst::PipelinePtr pipeline = QGst::ElementFactory::make("playbin2").dynamicCast<QGst::Pipeline>(); 
    watchPipeline(pipeline); 
    pipeline->setProperty("uri", "/path/to/my/video.mp4"); 
    QGst::BusPtr bus = pipeline->bus(); 
    bus->addSignalWatch(); 
    QGlib::connect(bus, "message", this, &Player::onBusMessage); 
    pipeline->setState(QGst::StatePlaying); 
} 

Так у меня есть видео играть в этом QWidget. Теперь я хочу добавить еще один QWidget поверх этого, чтобы нарисовать что-нибудь или разместить еще QWidget с альфа-смешиванием. Я попробовал этот код в главном приложении:

Player *player = new Player(this); 
QWidget *videoOverlay = new QWidget(player); 
// set the videoOverlay geometry 
videoOverlay->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint); 
videoOverlay->setAttribute(Qt::WA_TranslucentBackground); 

Но я получаю черный непрозрачный QWidget. Отсутствует прозрачность. Что мне не хватает?

ответ

0

Попробуйте эти:

videoOverlay->setAttribute(Qt::WA_NoBackground); 
videoOverlay->setAttribute(Qt::WA_NoSystemBackground); 
videoOverlay->setAutoFillbackground(false); 

Или это:

videoOverlay->setAutoFillBackground(true); 
videoOverlay->setAttribute(Qt::WA_PaintOnScreen); 
videoOverlay->setBackgroundRole(QPalette::Window); 
// make the widget transparent 
QPalette transparent; 
transparent.setColor(QPalette::Window, QColor(128,64,128)); // transparent color 
videoOverlay->setPalette(transparent); 

Третий вариант:

videoOverlay->setAttribute(Qt::WA_TranslucentBackground); 
videoOverlay->setStyleSheet("background:transparent;"); 

Более подробную информацию о том, как сделать виджеты прозрачные:

+0

Это - как мой код - работает, пока я не выпускать watchPipeline (трубопровод); на целевом QWidget. После этого videoOverlay QWidget теряет функции прозрачности. – Mark

+0

@Mark Отредактировал мой ответ. Кроме того, можете ли вы установить атрибуты после выдачи 'watchPipeline (конвейер)'? – user2448027

+0

Мне очень жаль, но никто из них не работает. Если я установил параметр перед watchPipeline, у меня будет прозрачность, которая будет потеряна сразу после функции. Установка их после выпуска watchPipeline не влияет. Здесь приведен код videoWidget.cpp (который содержит эту функцию) [ссылка] (http://gstreamer.freedesktop.org/data/doc/gstreamer/head/qt-gstreamer/html/videowidget_8cpp_source.html) – Mark