如何在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
}
以下图片更好地描述了情况。第一个截图是没有播放视频的时候。第二个是当我打开视频文件时。
答案 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的兄弟(不是孩子),将它带到前面并在上面绘画。