Overlay widget for Phonon VideoWidget

From Qt Wiki
Jump to: navigation, search
If you need put any widget over VideoWidget with transparent background, you can't do it so: m_video = new Phonon::VideoWidget; ….. QWebView *view = new QWebView(mVideo); view->setHtml("
Hello Qt!
");

QPalette palette = view->page()->palette();

palette.setBrush(QPalette::Base, Qt::transparent);
view->setPalette(palette);

view->setAttribute(Qt::WA_OpaquePaintEvent, false);

m_video->show();

m_video->resize(640, 480);

view->setFixedSize(m_video->width(), m_video->height());

You got black background for your widget, It happens because phonon backend might use XRender for video rendering.

Bellow example of workaround, which can help you:

This is subclass of Phonon::VideoWidget with overrided events methods.

class OverlayedVideoWidget : public Phonon::VideoWidget { public:

OverlayedVideoWidget(QWidget *parent = 0) :
Phonon::VideoWidget(parent),
m_overlayWidget(0)
{
}

void setOverlayWidget(QWidget *widget)

{
m_overlayWidget = widget;
}

protected:

void moveEvent(QMoveEvent *event)
{
if (m_overlayWidget)
m_overlayWidget->move(event->pos());
}

void resizeEvent(QResizeEvent event)

{
if (m_overlayWidget)
m_overlayWidget->resize(event->size());
}
void hideEvent(QHideEvent)
{
if (m_overlayWidget)
m_overlayWidget->hide();
}

void showEvent(QShowEvent )

{
if (m_overlayWidget)
m_overlayWidget->show();
}
void closeEvent(QCloseEvent)
{
if (m_overlayWidget)
m_overlayWidget->close();
}

private:

QWidget *m_overlayWidget;

};

Usage example: m_video = new OverlayedVideoWidget;

QWebView *view = new QWebView();

view->setHtml("
Hello Qt!
");

QPalette palette = view->page()->palette(); palette.setBrush(QPalette::Base, Qt::transparent);

view->setPalette(palette); view->page()->setPalette(palette); view->setAttribute(Qt::WA_OpaquePaintEvent, false); view->setAttribute(Qt::WA_TranslucentBackground, true); view->setWindowFlags(Qt::ToolTip | Qt::FramelessWindowHint);

m_video->setOverlayWidget(view); m_video->show(); m_video->resize(640, 480);