1

如何在 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
}

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

不播放视频时

播放视频

4

2 回答 2

2

看起来您想创建一个叠加层。如果您查看WidgetVideo.cppvlc-qt 的源代码,您可以看到该request()方法创建了一个小部件并将其添加到布局中,该布局是VlcVideoWidget. 这可能与您在paintEvent.

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

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

这是一些示例代码:

叠加层.h

class Overlay : public QWidget
{
    Q_OBJECT

 public:
    Overlay(QWidget* parent);

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

叠加层.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();
}
于 2014-08-23T03:17:01.903 回答
1

播放视频时,Vlc 在 VlcVideoWidget 上创建两个“内部”小部件。创建一个新的小部件作为 VlcVideoWidget 的兄弟(不是孩子),将其放在前面并在其上绘制。

于 2014-08-23T02:16:56.280 回答