Как нарисовать поверх унаследованного виджета (VlcVideoWidget)?
Как я могу нарисовать что-нибудь на VLC Video Widget?
Я использую библиотеку 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
}
Следующие изображения лучше описывают ситуацию. Первый снимок экрана - это когда видео не воспроизводится. Второй - когда я открываю видеофайл.
2 ответа
Похоже, вы хотите создать наложение. Если вы посмотрите на WidgetVideo.cpp
в источнике для vlc-qt, вы можете увидеть, что request()
Метод создает виджет и добавляет его в макет, который является родителем VlcVideoWidget
, Это, вероятно, портит наложение, которое вы рисуете в своем paintEvent
,
Чтобы создать наложение, которое должно оставаться поверх вашего видео, следуйте методу, описанному здесь: http://developer.nokia.com/community/wiki/How_to_overlay_QWidget_on_top_of_another
Вы должны добавить экземпляр класса оверлея к вашему экземпляру TrackerWidgetVideo
, Класс оверлея будет содержать переопределенный 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();
}
Vlc создает два "внутренних" виджета на VlcVideoWidget во время воспроизведения видео. Создайте новый виджет как родного брата VlcVideoWidget (не дочерний), перенесите его на передний план и нарисуйте на нем.