Overlay widget for Phonon VideoWidget

From Qt Wiki
Jump to: navigation, search
This article may require cleanup to meet the Qt Wiki's quality standards. Reason: Auto-imported from ExpressionEngine.
Please improve this article if you can. Remove the {{cleanup}} tag and add this page to Updated pages list after it's clean.

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("<div style=quot;color:#FFFFFF;font-size:36px;quot;>Hello Qt!</div>");

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("<div style=quot;color:#FFFFFF;font-size:36px;quot;>Hello Qt!</div>");
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);