c++linuxqtqvideowidget

Add button to QVideoWidget


example image

everyone! I try to set a click property to a QMediaPlayer Element, but I can not find the mode to make it, and if I try to put a button in front to Video, the button puts behind to video, even with

button->raise();
videoWidget->lower();

And If I put a Button to fullscreen the screen turns in black and don't shows the video

this id the code of the video player

QMediaPlayer *player = new QMediaPlayer(this);
QVideoWidget *vw = new QVideoWidget(this);

QMediaPlaylist *PlayList = new QMediaPlaylist(this);
PlayList->addMedia(QUrl::fromLocalFile("/home/user/Videos/video.mp4"));
PlayList->setPlaybackMode(QMediaPlaylist::Loop);

QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(vw);

player->setVideoOutput(vw);
player->setPlaylist(PlayList);

vw->setGeometry(0,0,800,480);
vw->show();
player->play();

Solution

  • One possible solution is to create a widget where the QVideoWidget is placed through a layout, the button is also added and we change the position through the resizeEvent() event.

    #include <QApplication>
    #include <QMediaPlayer>
    #include <QMediaPlaylist>
    #include <QPushButton>
    #include <QUrl>
    #include <QVBoxLayout>
    #include <QVideoWidget>
    
    #include <QDebug>
    
    class VideoWidgetButton: public QWidget{
        QPushButton *btn;
        QVideoWidget *vw;
        QMediaPlayer *player;
    public:
        VideoWidgetButton(QWidget *parent=Q_NULLPTR):QWidget(parent){
            setLayout(new QVBoxLayout);
            layout()->setContentsMargins(0, 0, 0, 0);
    
            vw = new QVideoWidget(this);
            btn = new QPushButton(this);
            btn->setIcon(QIcon(":/icons/tux.jpeg"));
            btn->resize(QSize(128, 128));
            btn->setIconSize(QSize(128, 128));
    
            connect(btn, &QPushButton::clicked, [](){
                qDebug()<<"clicked";
            });
    
            layout()->addWidget(vw);
    
            player = new QMediaPlayer(this);
            player->setVideoOutput(vw);
    
            QMediaPlaylist *playList = new QMediaPlaylist(this);
            playList->addMedia(QUrl("qrc:/video/SampleVideo_1280x720_1mb.mp4"));
            playList->setPlaybackMode(QMediaPlaylist::Loop);
            player->setPlaylist(playList);
            player->play();
    
        }
    protected:
        void resizeEvent(QResizeEvent *ev){
            btn->move(rect().bottomRight()-btn->rect().bottomRight());
            return QWidget::resizeEvent(ev);
        }
    };
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        VideoWidgetButton w;
        w.resize(640, 480);
        w.show();
        return a.exec();
    }
    

    enter image description here

    The complete example can be found in the following link.