如何在继承的小部件(VlcVideoWidget)的顶部绘制?

时间:2014-08-22 20:06:14

标签: qt qt4 z-index vlc vlc-qt

如何在VLC视频小工具上绘制内容?

我使用VLC-Qt库在我的Qt应用程序中的小部件上播放视频。我的应用程序需要在所有视频上绘制文本(或类似内容)。我已经尝试了继承VlcWidgetVideo并重新实现paintEvent。该方法在没有播放视频时有效。虽然在开始玩之后,我的画作消失了。看起来他们属于VLC的视频......

代码:

class TrackerWidgetVideo : public VlcWidgetVideo{
// Blah blah blah
protected:
    void paintEvent(QPaintEvent *);
}
// .......
void TrackerWidgetVideo::paintEvent(QPaintEvent *e)
{
    VlcWidgetVideo::paintEvent(e);
    QPainter p(this);
    p.drawText(rect(), Qt::AlignCenter, "Some foo goes here"); // This paints
}

以下图片更好地描述了情况。第一个截图是没有播放视频的时候。第二个是当我打开视频文件时。

When not playing video

Playing a video

2 个答案:

答案 0 :(得分:2)

看起来您想要创建叠加层。如果您查看vlc-qt源代码中的WidgetVideo.cpp,您可以看到request()方法创建了一个窗口小部件并将其添加到VlcVideoWidget的父级布局中。这可能会弄乱您在paintEvent中绘制的叠加层。

要创建应保留在视频顶部的叠加层,请按照此处列出的方法进行操作:http://developer.nokia.com/community/wiki/How_to_overlay_QWidget_on_top_of_another

您应该将overlay类的实例添加到TrackerWidgetVideo的实例中。 overlay类将包含当前属于paintEvent的覆盖TrackerWidgetVideo方法。然后,您将覆盖TrackerWidgetVideo::resizeEvent以调整叠加层类实例的大小。

以下是一些示例代码:

<强> Overlay.h

class Overlay : public QWidget
{
    Q_OBJECT

 public:
    Overlay(QWidget* parent);

 protected:
    void paintEvent(QPaintEvent* event);
};

<强> Overlay.cpp

Overlay::Overlay(QWidget* parent) : QWidget(parent)
{
    setPalette(Qt::transparent);
    setAttribute(Qt::WA_TransparentForMouseEvents);
}

void Overlay::paintEvent(QPaintEvent* event)
{
    QPainter p(this);
    p.drawText(rect(), Qt::AlignCenter, "Some foo goes here");
}

<强> TrackerWidgetVideo.h

class TrackerWidgetVideo : public VlcWidgetVideo
{
    Q_OBJECT

 public:
    explicit VlcWidgetVideo(QWidget* parent = NULL);

 protected:
    void resizeEvent(QResizeEvent* event);

 private:
    Overlay* overlay;
};

<强> TrackerWidgetVideo.cpp

TrackerWidgetVideo::TrackerWidgetVideo(QWidget* parent) : VlcWidgetVideo(parent)
{
    overlay = new Overlay(this);
}

void TrackerWidgetVideo::resizeEvent(QResizeEvent* event)
{
    overlay->resize(event->size());
    event->accept();
}

答案 1 :(得分:1)

Vlc创建两个&#34;内部&#34;播放视频时VlcVideoWidget上的小部件。 创建一个新的小部件作为VlcVideoWidget的兄弟(不是孩子),将它带到前面并在上面绘画。