Как нарисовать поверх унаследованного виджета (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 (не дочерний), перенесите его на передний план и нарисуйте на нем.

Другие вопросы по тегам