c++ - 在 Ubuntu 上的 QT5 中将透明 QWidget 放在 QMediaView 之上

标签 c++ ubuntu video user-interface qt5

目标

我希望基于 QT5 的 GUI 的背景是正在播放的视频文件。我还希望能够为我的 GUI 组件设置透明样式,以便视频可以通过它们显示。

我不确定这是否完全有可能实现。可能是我刚刚错过了一条重要线索(我毕竟是 Qt 初学者),也可能是它根本无法正常工作。但作为一个乐观主义者,我已经尽了最大的努力。

第一次尝试

我最小的第一次尝试是这样的:

int main( int argc, char **argv ){
    QApplication app(argc, argv);
    QMediaPlayer *media=new QMediaPlayer(0);
    QVideoWidget *video=new QVideoWidget(0); //new QGLWidget()
    media->setVideoOutput(video);
    media->setMedia(QUrl::fromLocalFile("/tmp/avatar.mp4"));
    media->setPosition(3000000);
    media->play();
    QPushButton *pb=new QPushButton(video);
    pb->setText(QString("BOB"));
    //pb->setStyleSheet(QString("background:transparent;"));
    video->show();
    return app.exec();
}

按钮在播放视频的上方,很好。但是如果你仔细观察,你会看到按钮的角上有一些黑色像素,这表明它在视频上不是透明的,而是呈现为一个不透明的矩形。

First result screenshot

第二次尝试

我尝试使用 background:transparent; 设置按钮的样式(参见上面代码中的注释行)。这使按钮的背景变得透明,但按钮后面的黑框现在更加明显。

enter image description here

其他尝试

我已经从各种在线资源中阅读了一些有关如何执行此操作的提示。没有一个对我有用。我尝试过与 QGraphicsScene 和 friend 一起工作,不同的布局堆栈,相关小部件的不同属性等等。我最后的尝试是将 QVideoWidget 的父级设置为 QGLWidget() 的实例,希望强制硬件加速能够解决我的问题(我的计算机具有带二进制驱动程序的硬件 3d 加速)。这完全阻止了窗口的出现,而我仍然可以听到后台播放的视频配乐表明应用程序仍在运行。

请求

我真的希望那里有一些善良而聪明的 QT5 开发人员可以帮助我实现我的梦想,即在 Ubuntu 上的 QT5 中将小部件放置在播放视频的顶部。

谢谢!

最佳答案

我知道这是一个老问题,您通过将部分应用程序转换为 QML/QtQuick 2.2 设法解决了您的问题,但我最终通过谷歌搜索遇到了这个问题,遇到同样问题的其他人也可能会找到这个问题。我找到了一个适合我的解决方案,并且已经在带有 QT 5.3 的 Windows 上进行了测试。

我所做的是使用 QGraphicsView 来显示视频。这是我的代码(playerScreen 是 QGraphicsView):

QGraphicsVideoItem *item = new QGraphicsVideoItem;
item->setSize(ui->playerScreen->size());
player.reset(new QMediaPlayer());
player->setVideoOutput(item);
QGraphicsScene *scene = new QGraphicsScene(0, 0, ui->playerScreen->size().width(), ui->playerScreen->size().height());
ui->playerScreen->setScene(scene);
ui->playerScreen->scene()->addItem(item);

我禁用了 playerScreen 上的滚动条,否则会有水平和垂直滚动条。

我在 playerScreen 的顶部有一个 QWidget,我在其中使用 QPainter 进行绘制。该 QWidget 位于图形 View 之上。

然后,当我播放视频时,我调用 ui->playerScreen-show()。我只在播放时这样做,因为我在顶部有另一个屏幕(用于与我的项目相关的其他内容),并且我需要在使用/不使用视频时调用显示/隐藏 :)

如果您需要有关我的代码的更多信息,请告诉我。

关于c++ - 在 Ubuntu 上的 QT5 中将透明 QWidget 放在 QMediaView 之上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16889319/

相关文章:

c++ - 为什么可以从 double 到 float 隐式转换?

matlab - 在 Kubuntu 上构建 MEX 文件 (MATLAB 2012a) 时出错 '/usr/bin/ld: cannot find -lstdc++'

javascript - 面临给用户提供取消静音自动播放Vimeo iframe嵌入的选项的麻烦

android - 如何在 android 中播放来自远程 url 的实时视频流?

video - ffmpeg 中的 "matroska"、 "matroska,webm"和 "webm"格式有什么区别?

c++ - 反转数组会导致 SegFault

c++ - 函数参数的生命周期是多少(需要引用)?

c++ - gcc 中自定义对象的 dlib 序列化失败

laravel - multiarch-support :amd64 : Depends: libc6:amd64 (>= 2. 3.6-2) 但它不可安装

linux - 伪分布式运行Hadoop时,hadoop.tmp.dir应该放在什么目录下?