【问题标题】:Add button to QVideoWidget将按钮添加到 QVideoWidget
【发布时间】:2018-06-13 08:49:53
【问题描述】:

大家!我尝试将 click 属性设置为 QMediaPlayer 元素,但我找不到制作它的模式,如果我尝试将按钮放在视频前面,则按钮会放在视频后面,即使使用

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

如果我将按钮设置为全屏,屏幕会变黑并且不显示视频

这个id是视频播放器的代码

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();

【问题讨论】:

  • 是要捕获QMediaPlayer的点击事件还是要在QMediaPlayer前面放置一个QPushButton?
  • @eyllanesc 任何方式对我来说都很好,但我更喜欢视频前面的按钮,但如果你有捕获 QMediaPlayer 的点击事件的解决方案,那就太好了!
  • 您能否展示一张图片,说明您希望如何查看 QMediaPlayer 前面的按钮?
  • @eyllanesc 像这样,黑屏是视频,微软商店标志是我要放的底部mega.nz/#!mxVXzLaD!PoIZgM4iclzpq7i3MKBGVKhD2dp9iB9mRgM24hRhcLc

标签: c++ linux qt qvideowidget


【解决方案1】:

一种可能的解决方案是创建一个小部件,其中QVideoWidget 通过布局放置,按钮也被添加,我们通过resizeEvent() 事件更改位置。

#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();
}

完整的例子可以在下面的link找到。

【讨论】:

  • vw = new QVideoWidget(this); 过度优化。
  • 嘿!我试过你发给我的代码,结果是一样的:(你认为这是Qt的问题吗?当我执行程序时我得到这个错误QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-root' libGL error: pci id for fd 9: 8086:591b, driver (null) i965_dri.so does not support the 0x591b PCI ID. libGL error: failed to create dri screen libGL error: failed to load driver: i965 我也从git下载了代码,但是是一样的结果
  • 你的显卡驱动有问题,我没有这个问题。
  • 感谢您的帮助!我会解决这个问题!
猜你喜欢
  • 2017-04-09
  • 2017-08-15
  • 2013-03-07
  • 2014-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多