После прочтения этой дискуссии: 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
. Отсутствует прозрачность. Что мне не хватает?
Это - как мой код - работает, пока я не выпускать watchPipeline (трубопровод); на целевом QWidget. После этого videoOverlay QWidget теряет функции прозрачности. – Mark
@Mark Отредактировал мой ответ. Кроме того, можете ли вы установить атрибуты после выдачи 'watchPipeline (конвейер)'? – user2448027
Мне очень жаль, но никто из них не работает. Если я установил параметр перед watchPipeline, у меня будет прозрачность, которая будет потеряна сразу после функции. Установка их после выпуска watchPipeline не влияет. Здесь приведен код videoWidget.cpp (который содержит эту функцию) [ссылка] (http://gstreamer.freedesktop.org/data/doc/gstreamer/head/qt-gstreamer/html/videowidget_8cpp_source.html) – Mark